LCOV - code coverage report
Current view: top level - boost/url/grammar - variant_rule.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 3 3 100.0 %
Date: 2024-02-29 20:02:55 Functions: 2 2 100.0 %

          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_VARIANT_RULE_HPP
      11             : #define BOOST_URL_GRAMMAR_VARIANT_RULE_HPP
      12             : 
      13             : #include <boost/url/detail/config.hpp>
      14             : #include <boost/url/error_types.hpp>
      15             : #include <boost/url/variant.hpp>
      16             : #include <boost/url/grammar/detail/tuple.hpp>
      17             : 
      18             : namespace boost {
      19             : namespace urls {
      20             : namespace grammar {
      21             : 
      22             : /** Match one of a set of rules
      23             : 
      24             :     Each specified rule is tried in sequence.
      25             :     When the first match occurs, the result
      26             :     is stored and returned in the variant. If
      27             :     no match occurs, an error is returned.
      28             : 
      29             :     @par Value Type
      30             :     @code
      31             :     using value_type = variant< typename Rules::value_type... >;
      32             :     @endcode
      33             : 
      34             :     @par Example
      35             :     Rules are used with the function @ref parse.
      36             :     @code
      37             :     // request-target = origin-form
      38             :     //                / absolute-form
      39             :     //                / authority-form
      40             :     //                / asterisk-form
      41             : 
      42             :     system::result< variant< url_view, url_view, authority_view, core::string_view > > rv = grammar::parse(
      43             :         "/index.html?width=full",
      44             :         variant_rule(
      45             :             origin_form_rule,
      46             :             absolute_uri_rule,
      47             :             authority_rule,
      48             :             delim_rule('*') ) );
      49             :     @endcode
      50             : 
      51             :     @par BNF
      52             :     @code
      53             :     variant     = rule1 / rule2 / rule3...
      54             :     @endcode
      55             : 
      56             :     @par Specification
      57             :     @li <a href="https://datatracker.ietf.org/doc/html/rfc5234#section-3.2"
      58             :         >3.2.  Alternatives (rfc5234)</a>
      59             :     @li <a href="https://datatracker.ietf.org/doc/html/rfc7230#section-5.3"
      60             :         >5.3.  Request Target (rfc7230)</a>
      61             : 
      62             :     @see
      63             :         @ref absolute_uri_rule,
      64             :         @ref authority_rule,
      65             :         @ref delim_rule,
      66             :         @ref parse,
      67             :         @ref origin_form_rule,
      68             :         @ref url_view.
      69             : */
      70             : #ifdef BOOST_URL_DOCS
      71             : template<class... Rules>
      72             : constexpr
      73             : __implementation_defined__
      74             : variant_rule( Rules... rn ) noexcept;
      75             : #else
      76             : template<
      77             :     class R0, class... Rn>
      78             : class variant_rule_t
      79             : {
      80             : public:
      81             :     using value_type = variant<
      82             :         typename R0::value_type,
      83             :         typename Rn::value_type...>;
      84             : 
      85             :     auto
      86             :     parse(
      87             :         char const*& it,
      88             :         char const* end) const ->
      89             :             system::result<value_type>;
      90             : 
      91             :     template<
      92             :         class R0_,
      93             :         class... Rn_>
      94             :     friend
      95             :     constexpr
      96             :     auto
      97             :     variant_rule(
      98             :         R0_ const& r0,
      99             :         Rn_ const&... rn) noexcept ->
     100             :             variant_rule_t<R0_, Rn_...>;
     101             : 
     102             : private:
     103             :     constexpr
     104        2486 :     variant_rule_t(
     105             :         R0 const& r0,
     106             :         Rn const&... rn) noexcept
     107        2486 :         : rn_(r0, rn...)
     108             :     {
     109        2486 :     }
     110             : 
     111             :     detail::tuple<R0, Rn...> rn_;
     112             : };
     113             : 
     114             : template<
     115             :     class R0,
     116             :     class... Rn>
     117             : constexpr
     118             : auto
     119             : variant_rule(
     120             :     R0 const& r0,
     121             :     Rn const&... rn) noexcept ->
     122             :         variant_rule_t<R0, Rn...>;
     123             : #endif
     124             : 
     125             : } // grammar
     126             : } // urls
     127             : } // boost
     128             : 
     129             : #include <boost/url/grammar/impl/variant_rule.hpp>
     130             : 
     131             : #endif

Generated by: LCOV version 1.15