Line data 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 942 : if(it == end)
108 : {
109 : // end
110 1 : BOOST_URL_RETURN_EC(
111 : error::need_more);
112 : }
113 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
|