Skip to content

Commit e00a164

Browse files
committed
feat: grammar::range user-provided RangeRule
#943
1 parent afa580e commit e00a164

5 files changed

Lines changed: 727 additions & 207 deletions

File tree

doc/mrdocs.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ implementation-defined:
4141
- 'boost::urls::string_token::*_t'
4242
exclude-symbols:
4343
- 'boost::urls::void_t'
44+
# any_rule was previously excluded by the detail path rule
45+
- 'boost::urls::any_rule'
4446

4547
# Metadata Extraction
4648
private-bases: false
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
//
2+
// Copyright (c) 2025 Alan de Freitas (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_DETAIL_RANGE_RULE_HPP
11+
#define BOOST_URL_GRAMMAR_DETAIL_RANGE_RULE_HPP
12+
13+
#include <boost/url/detail/config.hpp>
14+
#include <type_traits>
15+
#include <utility>
16+
17+
namespace boost {
18+
namespace urls {
19+
namespace grammar {
20+
namespace detail {
21+
22+
template<class RangeRule, bool = std::is_empty<RangeRule>::value>
23+
class range_base_storage;
24+
25+
template<class RangeRule>
26+
class range_base_storage<RangeRule, false>
27+
{
28+
RangeRule rule_;
29+
30+
protected:
31+
range_base_storage() = default;
32+
33+
explicit
34+
range_base_storage(RangeRule const& rule)
35+
: rule_(rule)
36+
{
37+
}
38+
39+
explicit
40+
range_base_storage(RangeRule&& rule)
41+
: rule_(std::move(rule))
42+
{
43+
}
44+
45+
RangeRule&
46+
rule() noexcept
47+
{
48+
return rule_;
49+
}
50+
51+
RangeRule const&
52+
rule() const noexcept
53+
{
54+
return rule_;
55+
}
56+
};
57+
58+
template<class RangeRule>
59+
class range_base_storage<RangeRule, true>
60+
: private RangeRule
61+
{
62+
protected:
63+
range_base_storage() = default;
64+
65+
explicit
66+
range_base_storage(RangeRule const& rule)
67+
: RangeRule(rule)
68+
{
69+
}
70+
71+
explicit
72+
range_base_storage(RangeRule&& rule)
73+
: RangeRule(std::move(rule))
74+
{
75+
}
76+
77+
RangeRule&
78+
rule() noexcept
79+
{
80+
return *this;
81+
}
82+
83+
RangeRule const&
84+
rule() const noexcept
85+
{
86+
return *this;
87+
}
88+
};
89+
90+
} // detail
91+
} // grammar
92+
} // urls
93+
} // boost
94+
95+
#endif

0 commit comments

Comments
 (0)