100.00% Lines (3/3) 100.00% Functions (1/1)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) 2   // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3   // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com) 3   // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4   // 4   //
5   // Distributed under the Boost Software License, Version 1.0. (See accompanying 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) 6   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7   // 7   //
8   // Official repository: https://github.com/boostorg/url 8   // Official repository: https://github.com/boostorg/url
9   // 9   //
10   10  
11   #ifndef BOOST_URL_GRAMMAR_VARIANT_RULE_HPP 11   #ifndef BOOST_URL_GRAMMAR_VARIANT_RULE_HPP
12   #define BOOST_URL_GRAMMAR_VARIANT_RULE_HPP 12   #define BOOST_URL_GRAMMAR_VARIANT_RULE_HPP
13   13  
14   #include <boost/url/detail/config.hpp> 14   #include <boost/url/detail/config.hpp>
15   #include <boost/url/error_types.hpp> 15   #include <boost/url/error_types.hpp>
16   #include <boost/url/variant.hpp> 16   #include <boost/url/variant.hpp>
17   #include <boost/url/grammar/detail/tuple.hpp> 17   #include <boost/url/grammar/detail/tuple.hpp>
18   #include <boost/url/grammar/type_traits.hpp> 18   #include <boost/url/grammar/type_traits.hpp>
19   19  
20   namespace boost { 20   namespace boost {
21   namespace urls { 21   namespace urls {
22   namespace grammar { 22   namespace grammar {
23   23  
24   namespace implementation_defined { 24   namespace implementation_defined {
25   template< 25   template<
26   class R0, class... Rn> 26   class R0, class... Rn>
27   class variant_rule_t 27   class variant_rule_t
28   { 28   {
29   public: 29   public:
30   using value_type = variant2::variant< 30   using value_type = variant2::variant<
31   typename R0::value_type, 31   typename R0::value_type,
32   typename Rn::value_type...>; 32   typename Rn::value_type...>;
33   33  
34   BOOST_URL_CXX20_CONSTEXPR 34   BOOST_URL_CXX20_CONSTEXPR
35   auto 35   auto
36   parse( 36   parse(
37   char const*& it, 37   char const*& it,
38   char const* end) const -> 38   char const* end) const ->
39   system::result<value_type>; 39   system::result<value_type>;
40   40  
41   constexpr 41   constexpr
HITCBC 42   1 variant_rule_t( 42   1 variant_rule_t(
43   R0 const& r0, 43   R0 const& r0,
44   Rn const&... rn) noexcept 44   Rn const&... rn) noexcept
HITCBC 45   1 : rn_(r0, rn...) 45   1 : rn_(r0, rn...)
46   { 46   {
HITCBC 47   1 } 47   1 }
48   48  
49   private: 49   private:
50   50  
51   detail::tuple<R0, Rn...> rn_; 51   detail::tuple<R0, Rn...> rn_;
52   }; 52   };
53   } // implementation_defined 53   } // implementation_defined
54   54  
55   /** Match one of a set of rules 55   /** Match one of a set of rules
56   56  
57   Each specified rule is tried in sequence. 57   Each specified rule is tried in sequence.
58   When the first match occurs, the result 58   When the first match occurs, the result
59   is stored and returned in the variant. If 59   is stored and returned in the variant. If
60   no match occurs, an error is returned. 60   no match occurs, an error is returned.
61   61  
62   @param r0 The first rule to match 62   @param r0 The first rule to match
63   @param rn A list of one or more rules to match 63   @param rn A list of one or more rules to match
64   @return The variant rule 64   @return The variant rule
65   65  
66   @par Value Type 66   @par Value Type
67   @code 67   @code
68   using value_type = variant< typename Rules::value_type... >; 68   using value_type = variant< typename Rules::value_type... >;
69   @endcode 69   @endcode
70   70  
71   @par Example 71   @par Example
72   Rules are used with the function @ref parse. 72   Rules are used with the function @ref parse.
73   @code 73   @code
74   // request-target = origin-form 74   // request-target = origin-form
75   // / absolute-form 75   // / absolute-form
76   // / authority-form 76   // / authority-form
77   // / asterisk-form 77   // / asterisk-form
78   78  
79   system::result< variant< url_view, url_view, authority_view, core::string_view > > rv = grammar::parse( 79   system::result< variant< url_view, url_view, authority_view, core::string_view > > rv = grammar::parse(
80   "/index.html?width=full", 80   "/index.html?width=full",
81   variant_rule( 81   variant_rule(
82   origin_form_rule, 82   origin_form_rule,
83   absolute_uri_rule, 83   absolute_uri_rule,
84   authority_rule, 84   authority_rule,
85   delim_rule('*') ) ); 85   delim_rule('*') ) );
86   @endcode 86   @endcode
87   87  
88   @par BNF 88   @par BNF
89   @code 89   @code
90   variant = rule1 / rule2 / rule3... 90   variant = rule1 / rule2 / rule3...
91   @endcode 91   @endcode
92   92  
93   @par Specification 93   @par Specification
94   @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#section-3.2" 94   @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#section-3.2"
95   >3.2. Alternatives (rfc5234)</a> 95   >3.2. Alternatives (rfc5234)</a>
96   @li <a href="https://datatracker.ietf.org/doc/html/rfc7230#section-5.3" 96   @li <a href="https://datatracker.ietf.org/doc/html/rfc7230#section-5.3"
97   >5.3. Request Target (rfc7230)</a> 97   >5.3. Request Target (rfc7230)</a>
98   98  
99   @see 99   @see
100   @ref absolute_uri_rule, 100   @ref absolute_uri_rule,
101   @ref authority_rule, 101   @ref authority_rule,
102   @ref delim_rule, 102   @ref delim_rule,
103   @ref parse, 103   @ref parse,
104   @ref origin_form_rule, 104   @ref origin_form_rule,
105   @ref url_view. 105   @ref url_view.
106   */ 106   */
107   template< 107   template<
108   BOOST_URL_CONSTRAINT(Rule) R0, 108   BOOST_URL_CONSTRAINT(Rule) R0,
109   BOOST_URL_CONSTRAINT(Rule)... Rn> 109   BOOST_URL_CONSTRAINT(Rule)... Rn>
110   constexpr 110   constexpr
111   auto 111   auto
112   variant_rule( 112   variant_rule(
113   R0 const& r0, 113   R0 const& r0,
114   Rn const&... rn) noexcept -> 114   Rn const&... rn) noexcept ->
115   implementation_defined::variant_rule_t<R0, Rn...>; 115   implementation_defined::variant_rule_t<R0, Rn...>;
116   116  
117   } // grammar 117   } // grammar
118   } // urls 118   } // urls
119   } // boost 119   } // boost
120   120  
121   #include <boost/url/grammar/impl/variant_rule.hpp> 121   #include <boost/url/grammar/impl/variant_rule.hpp>
122   122  
123   #endif 123   #endif