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

94.1% Lines (16/17) 77.8% Functions (14/18) 100.0% Branches (8/8)
include/boost/url/grammar/impl/variant_rule.hpp
Line Branch 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_CXX14_CONSTEXPR
32 auto
33 819 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 819 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_CXX14_CONSTEXPR
55 auto
56 2267 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 2267 auto const it0 = it;
69
1/1
✓ Branch 2 taken 524 times.
2267 auto rv = parse(
70 it, end, get<I>(rn));
71
2/2
✓ Branch 1 taken 530 times.
✓ Branch 2 taken 1737 times.
2267 if( rv )
72 return variant2::variant<
73 typename R0::value_type,
74 typename Rn::value_type...>{
75
1/1
✓ Branch 2 taken 530 times.
530 variant2::in_place_index_t<I>{}, *rv};
76 1737 it = it0;
77
1/1
✓ Branch 1 taken 394 times.
1434 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
1/1
✓ Branch 1 taken 524 times.
1737 sizeof...(Rn)))>{});
84 }
85
86 } // detail
87
88 template<class R0, class... Rn>
89 BOOST_URL_CXX14_CONSTEXPR
90 auto
91 1349 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 789 return detail::parse_variant(
98
1/1
✓ Branch 1 taken 789 times.
1349 it, end, rn_,
99 std::integral_constant<
100 std::size_t, 0>{},
101
1/1
✓ Branch 1 taken 2 times.
2138 std::true_type{});
102 }
103
104 //------------------------------------------------
105
106 template<BOOST_URL_CONSTRAINT(Rule) R0, BOOST_URL_CONSTRAINT(Rule)... Rn>
107 auto
108 constexpr
109 1 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 1 return { r0, rn... };
119 }
120
121 } // grammar
122 } // urls
123 } // boost
124
125 #endif
126