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