GCC Code Coverage Report


Directory: libs/url/
File: include/boost/url/grammar/delim_rule.hpp
Date: 2025-11-10 19:06:22
Exec Total Coverage
Lines: 16 16 100.0%
Functions: 6 6 100.0%
Branches: 4 4 100.0%

Line Branch Exec Source
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
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 876 times.
877 if(it == end)
107 {
108 // end
109 1 BOOST_URL_RETURN_EC(
110 error::need_more);
111 }
112
2/2
✓ Branch 1 taken 350 times.
✓ Branch 2 taken 526 times.
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
182