GCC Code Coverage Report


Directory: libs/url/
File: boost/url/grammar/optional_rule.hpp
Date: 2024-02-29 20:02:56
Exec Total Coverage
Lines: 5 5 100.0%
Functions: 7 7 100.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_GRAMMAR_OPTIONAL_RULE_HPP
11 #define BOOST_URL_GRAMMAR_OPTIONAL_RULE_HPP
12
13 #include <boost/url/detail/config.hpp>
14 #include <boost/url/optional.hpp>
15 #include <boost/url/error_types.hpp>
16 #include <boost/core/empty_value.hpp>
17 #include <boost/assert.hpp>
18
19 namespace boost {
20 namespace urls {
21 namespace grammar {
22
23 /** Match a rule, or the empty string
24
25 Optional BNF elements are denoted with
26 square brackets. If the specified rule
27 returns any error it is treated as if
28 the rule did not match.
29
30 @par Value Type
31 @code
32 using value_type = optional< typename Rule::value_type >;
33 @endcode
34
35 @par Example
36 Rules are used with the function @ref grammar::parse.
37 @code
38 system::result< optional< core::string_view > > rv = parse( "", optional_rule( token_rule( alpha_chars ) ) );
39 @endcode
40
41 @par BNF
42 @code
43 optional = [ rule ]
44 @endcode
45
46 @par Specification
47 @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#section-3.8"
48 >3.8. Optional Sequence (rfc5234)</a>
49
50 @param r The rule to match
51
52 @see
53 @ref alpha_chars,
54 @ref parse,
55 @ref optional,
56 @ref token_rule.
57 */
58 #ifdef BOOST_URL_DOCS
59 template<class Rule>
60 constexpr
61 __implementation_defined__
62 optional_rule( Rule r ) noexcept;
63 #else
64 template<class Rule>
65 struct optional_rule_t
66 : private empty_value<Rule>
67 {
68 using value_type = boost::optional<
69 typename Rule::value_type>;
70
71 system::result<value_type>
72 parse(
73 char const*& it,
74 char const* end) const;
75
76 template<class R_>
77 friend
78 constexpr
79 auto
80 optional_rule(
81 R_ const& r) ->
82 optional_rule_t<R_>;
83
84 private:
85 constexpr
86 2008 optional_rule_t(
87 Rule const& r) noexcept
88 : empty_value<Rule>(
89 empty_init,
90 2008 r)
91 {
92 2008 }
93 };
94
95 template<class Rule>
96 auto
97 constexpr
98 1944 optional_rule(
99 Rule const& r) ->
100 optional_rule_t<Rule>
101 {
102 1944 return { r };
103 }
104 #endif
105
106 } // grammar
107 } // urls
108 } // boost
109
110 #include <boost/url/grammar/impl/optional_rule.hpp>
111
112 #endif
113