GCC Code Coverage Report


Directory: libs/url/
File: boost/url/rfc/pct_encoded_rule.hpp
Date: 2024-03-13 19:32:03
Exec Total Coverage
Lines: 5 5 100.0%
Functions: 3 4 75.0%
Branches: 0 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_RFC_PCT_ENCODED_RULE_HPP
11 #define BOOST_URL_RFC_PCT_ENCODED_RULE_HPP
12
13 #include <boost/url/detail/config.hpp>
14 #include <boost/url/error_types.hpp>
15 #include <boost/url/pct_string_view.hpp>
16 #include <boost/url/grammar/charset.hpp>
17
18 namespace boost {
19 namespace urls {
20
21 /** Rule for a string with percent-encoded escapes
22
23 This function returns a rule which matches
24 a percent-encoded string, permitting characters
25 in the string which are also in the specified
26 character set to be used unescaped.
27
28 @par Value Type
29 @code
30 using value_type = pct_string_view;
31 @endcode
32
33 @par Example
34 Rules are used with the function @ref grammar::parse.
35 @code
36 // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
37
38 system::result< pct_string_view > rv = grammar::parse( "Program%20Files", pct_encoded_rule( pchars ) );
39 @endcode
40
41 @par BNF
42 @code
43 pct-encoded = "%" HEXDIG HEXDIG
44 @endcode
45
46 @param cs The character set indicating
47 which characters are allowed without escapes.
48 Any character which is not in this set must be
49 escaped, or else parsing returns an error.
50
51 @par Specification
52 @li <a href="https://datatracker.ietf.org/doc/html/rfc3986#section-2.1">
53 2.1. Percent-Encoding (rfc3986)</a>
54
55 @see
56 @ref grammar::parse,
57 @ref pchars,
58 @ref pct_string_view.
59 */
60 #ifdef BOOST_URL_DOCS
61 /**@{*/
62 template<class CharSet>
63 constexpr
64 __implementation_defined__
65 pct_encoded_rule( CharSet const& cs ) noexcept;
66 /**@}*/
67 #else
68 template<class CharSet>
69 struct pct_encoded_rule_t
70 {
71 using value_type = pct_string_view;
72
73 template<class CharSet_>
74 friend
75 constexpr
76 auto
77 pct_encoded_rule(
78 CharSet_ const& cs) noexcept ->
79 pct_encoded_rule_t<CharSet_>;
80
81 system::result<value_type>
82 parse(
83 char const*& it,
84 char const* end) const noexcept;
85
86 private:
87 constexpr
88 5483 pct_encoded_rule_t(
89 CharSet const& cs) noexcept
90 5483 : cs_(cs)
91 {
92 5483 }
93
94 CharSet cs_;
95 };
96
97 template<class CharSet>
98 constexpr
99 auto
100 3242 pct_encoded_rule(
101 CharSet const& cs) noexcept ->
102 pct_encoded_rule_t<CharSet>
103 {
104 // If an error occurs here it means that
105 // the value of your type does not meet
106 // the requirements. Please check the
107 // documentation!
108 static_assert(
109 grammar::is_charset<CharSet>::value,
110 "CharSet requirements not met");
111
112 3242 return pct_encoded_rule_t<CharSet>(cs);
113 }
114
115 #endif
116
117 } // urls
118 } // boost
119
120 #include <boost/url/rfc/impl/pct_encoded_rule.hpp>
121
122 #endif
123