include/boost/url/grammar/delim_rule.hpp

100.0% Lines (16/16) 100.0% Functions (6/6) 100.0% Branches (4/4)
include/boost/url/grammar/delim_rule.hpp
Line Branch Hits Source Code
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // Official repository: https://github.com/boostorg/url
9 //
10
11 #ifndef BOOST_URL_GRAMMAR_DELIM_RULE_HPP
12 #define BOOST_URL_GRAMMAR_DELIM_RULE_HPP
13
14 #include <boost/url/detail/config.hpp>
15 #include <boost/core/detail/string_view.hpp>
16 #include <boost/url/grammar/charset.hpp>
17 #include <boost/url/grammar/error.hpp>
18 #include <boost/url/grammar/type_traits.hpp>
19 #include <type_traits>
20
21 namespace boost {
22 namespace urls {
23 namespace grammar {
24
25 namespace implementation_defined {
26 struct ch_delim_rule
27 {
28 using value_type = core::string_view;
29
30 constexpr
31 12441 ch_delim_rule(char ch) noexcept
32 12441 : ch_(ch)
33 {
34 12441 }
35
36 BOOST_URL_CXX20_CONSTEXPR
37 system::result<value_type>
38 parse(
39 char const*& it,
40 char const* end) const noexcept;
41
42 private:
43 char ch_;
44 };
45 } // implementation_defined
46
47 /** Match a character literal
48
49 This matches the specified character.
50 The value is a reference to the character
51 in the underlying buffer, expressed as a
52 `core::string_view`. The function @ref squelch
53 may be used to turn this into `void` instead.
54 If there is no more input, the error code
55 @ref error::need_more is returned.
56
57 @par Value Type
58 @code
59 using value_type = core::string_view;
60 @endcode
61
62 @par Example
63 Rules are used with the function @ref parse.
64 @code
65 system::result< core::string_view > rv = parse( ".", delim_rule('.') );
66 @endcode
67
68 @par BNF
69 @code
70 char = %00-FF
71 @endcode
72
73 @param ch The character to match
74 @return A rule which matches the character.
75
76 @see
77 @ref parse,
78 @ref squelch.
79 */
80 constexpr
81 implementation_defined::ch_delim_rule
82 12441 delim_rule( char ch ) noexcept
83 {
84 12441 return {ch};
85 }
86
87 //------------------------------------------------
88
89 namespace implementation_defined {
90 template<class CharSet>
91 struct cs_delim_rule
92 {
93 using value_type = core::string_view;
94
95 constexpr
96 3 cs_delim_rule(
97 CharSet const& cs) noexcept
98 : cs_(cs)
99 {
100 3 }
101
102 system::result<value_type>
103 942 parse(
104 char const*& it,
105 char const* end) const noexcept
106 {
107
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 941 times.
942 if(it == end)
108 {
109 // end
110 1 BOOST_URL_RETURN_EC(
111 error::need_more);
112 }
113
2/2
✓ Branch 1 taken 392 times.
✓ Branch 2 taken 549 times.
941 if(! cs_(*it))
114 {
115 // wrong character
116 392 BOOST_URL_RETURN_EC(
117 error::mismatch);
118 }
119 1098 return core::string_view{
120 549 it++, 1 };
121 }
122
123 private:
124 CharSet cs_;
125 };
126 } // implementation_defined
127
128 /** Match a single character from a character set
129
130 This matches exactly one character which
131 belongs to the specified character set.
132 The value is a reference to the character
133 in the underlying buffer, expressed as a
134 `core::string_view`. The function @ref squelch
135 may be used to turn this into `void` instead.
136 If there is no more input, the error code
137 @ref error::need_more is returned.
138
139 @par Value Type
140 @code
141 using value_type = core::string_view;
142 @endcode
143
144 @par Example
145 Rules are used with the function @ref parse.
146 @code
147 system::result< core::string_view > rv = parse( "X", delim_rule( alpha_chars ) );
148 @endcode
149
150 @param cs The character set to use.
151 @return A rule which matches a single character from the set.
152
153 @see
154 @ref alpha_chars,
155 @ref parse,
156 @ref squelch.
157 */
158 template<BOOST_URL_CONSTRAINT(CharSet) CS>
159 constexpr
160 typename std::enable_if<
161 ! std::is_convertible<
162 CS, char>::value,
163 implementation_defined::cs_delim_rule<CS>>::type
164 3 delim_rule(
165 CS const& cs) noexcept
166 {
167 // If you get a compile error here it
168 // means that your type does not meet
169 // the requirements for a CharSet.
170 // Please consult the documentation.
171 static_assert(
172 is_charset<CS>::value,
173 "CharSet requirements not met");
174
175 3 return implementation_defined::cs_delim_rule<CS>(cs);
176 }
177
178 } // grammar
179 } // urls
180 } // boost
181
182 #include <boost/url/grammar/impl/delim_rule.hpp>
183
184 #endif
185