include/boost/url/grammar/impl/variant_rule.hpp

73.0% Lines (73/100) 77.8% List of functions (14/18)
variant_rule.hpp
f(x) Functions (18)
Function Calls Lines Blocks
boost::system::result<boost::variant2::variant<boost::urls::detail::identifier_rule_t::value_type, boost::urls::grammar::unsigned_rule<unsigned long>::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long>, 2ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > const&, std::integral_constant<unsigned long, 2ul> const&, std::integral_constant<bool, false> const&) :33 327x 100.0% 100.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::implementation_defined::ch_delim_rule::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule, 2ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 2ul> const&, std::integral_constant<bool, false> const&) :33 2x 100.0% 100.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::unsigned_rule<unsigned long>::value_type, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >, 2ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> > > const&, std::integral_constant<unsigned long, 2ul> const&, std::integral_constant<bool, false> const&) :33 502x 100.0% 100.0% boost::system::result<boost::variant2::variant<boost::urls::implementation_defined::origin_form_rule_t::value_type, boost::urls::implementation_defined::absolute_uri_rule_t::value_type, boost::urls::implementation_defined::authority_rule_t::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule, 4ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 4ul> const&, std::integral_constant<bool, false> const&) :33 0 0.0% 0.0% boost::system::result<boost::variant2::variant<boost::urls::detail::identifier_rule_t::value_type, boost::urls::grammar::unsigned_rule<unsigned long>::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long>, 0ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > const&, std::integral_constant<unsigned long, 0ul> const&, std::integral_constant<bool, true> const&) :56 791x 100.0% 82.0% boost::system::result<boost::variant2::variant<boost::urls::detail::identifier_rule_t::value_type, boost::urls::grammar::unsigned_rule<unsigned long>::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long>, 1ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > const&, std::integral_constant<unsigned long, 1ul> const&, std::integral_constant<bool, true> const&) :56 397x 100.0% 93.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::implementation_defined::ch_delim_rule::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule, 0ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 0ul> const&, std::integral_constant<bool, true> const&) :56 4x 100.0% 82.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::implementation_defined::ch_delim_rule::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule, 1ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 1ul> const&, std::integral_constant<bool, true> const&) :56 3x 100.0% 93.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::unsigned_rule<unsigned long>::value_type, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >, 0ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> > > const&, std::integral_constant<unsigned long, 0ul> const&, std::integral_constant<bool, true> const&) :56 566x 100.0% 81.0% boost::system::result<boost::variant2::variant<boost::urls::grammar::unsigned_rule<unsigned long>::value_type, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> >, 1ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::grammar::unsigned_rule<unsigned long>, boost::urls::grammar::implementation_defined::tuple_rule_t<boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule>, boost::urls::grammar::implementation_defined::optional_rule_t<boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> > >, boost::urls::grammar::implementation_defined::squelch_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule> > > const&, std::integral_constant<unsigned long, 1ul> const&, std::integral_constant<bool, true> const&) :56 530x 100.0% 93.0% boost::system::result<boost::variant2::variant<boost::urls::implementation_defined::origin_form_rule_t::value_type, boost::urls::implementation_defined::absolute_uri_rule_t::value_type, boost::urls::implementation_defined::authority_rule_t::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule, 0ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 0ul> const&, std::integral_constant<bool, true> const&) :56 2x 71.4% 71.0% boost::system::result<boost::variant2::variant<boost::urls::implementation_defined::origin_form_rule_t::value_type, boost::urls::implementation_defined::absolute_uri_rule_t::value_type, boost::urls::implementation_defined::authority_rule_t::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule, 1ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 1ul> const&, std::integral_constant<bool, true> const&) :56 0 0.0% 0.0% boost::system::result<boost::variant2::variant<boost::urls::implementation_defined::origin_form_rule_t::value_type, boost::urls::implementation_defined::absolute_uri_rule_t::value_type, boost::urls::implementation_defined::authority_rule_t::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule, 2ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 2ul> const&, std::integral_constant<bool, true> const&) :56 0 0.0% 0.0% boost::system::result<boost::variant2::variant<boost::urls::implementation_defined::origin_form_rule_t::value_type, boost::urls::implementation_defined::absolute_uri_rule_t::value_type, boost::urls::implementation_defined::authority_rule_t::value_type, boost::urls::grammar::implementation_defined::ch_delim_rule::value_type>, boost::system::error_code> boost::urls::grammar::detail::parse_variant<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule, 3ul>(char const*&, char const*, boost::urls::grammar::detail::tuple<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> const&, std::integral_constant<unsigned long, 3ul> const&, std::integral_constant<bool, true> const&) :56 0 0.0% 0.0% boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::detail::identifier_rule_t, boost::urls::grammar::unsigned_rule<unsigned long> >::parse(char const*&, char const*) const :91 791x 100.0% 83.0% boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::grammar::implementation_defined::ch_delim_rule, boost::urls::grammar::implementation_defined::ch_delim_rule>::parse(char const*&, char const*) const :91 4x 100.0% 83.0% boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule>::parse(char const*&, char const*) const :91 2x 100.0% 80.0% boost::urls::grammar::implementation_defined::variant_rule_t<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule> boost::urls::grammar::variant_rule<boost::urls::implementation_defined::origin_form_rule_t, boost::urls::implementation_defined::absolute_uri_rule_t, boost::urls::implementation_defined::authority_rule_t, boost::urls::grammar::implementation_defined::ch_delim_rule>(boost::urls::implementation_defined::origin_form_rule_t const&, boost::urls::implementation_defined::absolute_uri_rule_t const&, boost::urls::implementation_defined::authority_rule_t const&, boost::urls::grammar::implementation_defined::ch_delim_rule const&) :109 1x 100.0% 100.0%
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 //
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)
7 //
8 // Official repository: https://github.com/boostorg/url
9 //
10
11 #ifndef BOOST_URL_GRAMMAR_IMPL_VARIANT_RULE_HPP
12 #define BOOST_URL_GRAMMAR_IMPL_VARIANT_RULE_HPP
13
14 #include <boost/url/grammar/error.hpp>
15 #include <boost/url/grammar/parse.hpp>
16 #include <boost/core/detail/static_assert.hpp>
17 #include <cstdint>
18 #include <type_traits>
19
20 namespace boost {
21 namespace urls {
22 namespace grammar {
23
24 namespace detail {
25
26 // must come first
27 template<
28 class R0,
29 class... Rn,
30 std::size_t I>
31 BOOST_URL_CXX20_CONSTEXPR
32 auto
33 831x parse_variant(
34 char const*&,
35 char const*,
36 detail::tuple<
37 R0, Rn...> const&,
38 std::integral_constant<
39 std::size_t, I> const&,
40 std::false_type const&) ->
41 system::result<variant2::variant<
42 typename R0::value_type,
43 typename Rn::value_type...>>
44 {
45 // no match
46 831x BOOST_URL_CONSTEXPR_RETURN_EC(
47 error::mismatch);
48 }
49
50 template<
51 class R0,
52 class... Rn,
53 std::size_t I>
54 BOOST_URL_CXX20_CONSTEXPR
55 auto
56 2293x parse_variant(
57 char const*& it,
58 char const* const end,
59 detail::tuple<
60 R0, Rn...> const& rn,
61 std::integral_constant<
62 std::size_t, I> const&,
63 std::true_type const&) ->
64 system::result<variant2::variant<
65 typename R0::value_type,
66 typename Rn::value_type...>>
67 {
68 2293x auto const it0 = it;
69 2293x auto rv = parse(
70 it, end, get<I>(rn));
71 2293x if( rv )
72 return variant2::variant<
73 typename R0::value_type,
74 typename Rn::value_type...>{
75 532x variant2::in_place_index_t<I>{}, *rv};
76 1761x it = it0;
77 1458x return parse_variant(
78 it, end, rn,
79 std::integral_constant<
80 std::size_t, I+1>{},
81 std::integral_constant<bool,
82 ((I + 1) < (1 +
83 1761x sizeof...(Rn)))>{});
84 }
85
86 } // detail
87
88 template<class R0, class... Rn>
89 BOOST_URL_CXX20_CONSTEXPR
90 auto
91 1363x implementation_defined::variant_rule_t<R0, Rn...>::
92 parse(
93 char const*& it,
94 char const* end) const ->
95 system::result<value_type>
96 {
97 795x return detail::parse_variant(
98 1363x it, end, rn_,
99 std::integral_constant<
100 std::size_t, 0>{},
101 2158x std::true_type{});
102 }
103
104 //------------------------------------------------
105
106 template<BOOST_URL_CONSTRAINT(Rule) R0, BOOST_URL_CONSTRAINT(Rule)... Rn>
107 auto
108 constexpr
109 1x variant_rule(
110 R0 const& r0,
111 Rn const&... rn) noexcept ->
112 implementation_defined::variant_rule_t<R0, Rn...>
113 {
114 BOOST_CORE_STATIC_ASSERT(
115 mp11::mp_all<
116 is_rule<R0>,
117 is_rule<Rn>...>::value);
118 1x return { r0, rn... };
119 }
120
121 } // grammar
122 } // urls
123 } // boost
124
125 #endif
126