1  
//
1  
//
2  
// Copyright (c) 2025 Alan de Freitas (vinnie dot falco at gmail dot com)
2  
// Copyright (c) 2025 Alan de Freitas (vinnie dot falco at gmail dot com)
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/boostorg/url
7  
// Official repository: https://github.com/boostorg/url
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_URL_GRAMMAR_DETAIL_RANGE_RULE_HPP
10  
#ifndef BOOST_URL_GRAMMAR_DETAIL_RANGE_RULE_HPP
11  
#define BOOST_URL_GRAMMAR_DETAIL_RANGE_RULE_HPP
11  
#define BOOST_URL_GRAMMAR_DETAIL_RANGE_RULE_HPP
12  

12  

13  
#include <boost/url/detail/config.hpp>
13  
#include <boost/url/detail/config.hpp>
14  
#include <type_traits>
14  
#include <type_traits>
15  
#include <utility>
15  
#include <utility>
16  

16  

17  
namespace boost {
17  
namespace boost {
18  
namespace urls {
18  
namespace urls {
19  
namespace grammar {
19  
namespace grammar {
20  
namespace detail {
20  
namespace detail {
21  

21  

22  
template<class RangeRule, bool = std::is_empty<RangeRule>::value>
22  
template<class RangeRule, bool = std::is_empty<RangeRule>::value>
23  
class range_base_storage;
23  
class range_base_storage;
24  

24  

25  
template<class RangeRule>
25  
template<class RangeRule>
26  
class range_base_storage<RangeRule, false>
26  
class range_base_storage<RangeRule, false>
27  
{
27  
{
28  
    RangeRule rule_;
28  
    RangeRule rule_;
29  

29  

30  
protected:
30  
protected:
31  
    range_base_storage() = default;
31  
    range_base_storage() = default;
32  

32  

33  
    explicit
33  
    explicit
34  
    range_base_storage(RangeRule const& rule)
34  
    range_base_storage(RangeRule const& rule)
35  
        : rule_(rule)
35  
        : rule_(rule)
36  
    {
36  
    {
37  
    }
37  
    }
38  

38  

39  
    explicit
39  
    explicit
40  
    range_base_storage(RangeRule&& rule)
40  
    range_base_storage(RangeRule&& rule)
41  
        : rule_(std::move(rule))
41  
        : rule_(std::move(rule))
42  
    {
42  
    {
43  
    }
43  
    }
44  

44  

45  
    RangeRule&
45  
    RangeRule&
46  
    rule() noexcept
46  
    rule() noexcept
47  
    {
47  
    {
48  
        return rule_;
48  
        return rule_;
49  
    }
49  
    }
50  

50  

51  
    RangeRule const&
51  
    RangeRule const&
52  
    rule() const noexcept
52  
    rule() const noexcept
53  
    {
53  
    {
54  
        return rule_;
54  
        return rule_;
55  
    }
55  
    }
56  
};
56  
};
57  

57  

58  
template<class RangeRule>
58  
template<class RangeRule>
59  
class range_base_storage<RangeRule, true>
59  
class range_base_storage<RangeRule, true>
60  
    : private RangeRule
60  
    : private RangeRule
61  
{
61  
{
62  
protected:
62  
protected:
63  
    range_base_storage() = default;
63  
    range_base_storage() = default;
64  

64  

65  
    explicit
65  
    explicit
66  
    range_base_storage(RangeRule const& rule)
66  
    range_base_storage(RangeRule const& rule)
67  
        : RangeRule(rule)
67  
        : RangeRule(rule)
68  
    {
68  
    {
69  
    }
69  
    }
70  

70  

71  
    explicit
71  
    explicit
72  
    range_base_storage(RangeRule&& rule)
72  
    range_base_storage(RangeRule&& rule)
73  
        : RangeRule(std::move(rule))
73  
        : RangeRule(std::move(rule))
74  
    {
74  
    {
75  
    }
75  
    }
76  

76  

77  
    RangeRule&
77  
    RangeRule&
78  
    rule() noexcept
78  
    rule() noexcept
79  
    {
79  
    {
80  
        return *this;
80  
        return *this;
81  
    }
81  
    }
82  

82  

83  
    RangeRule const&
83  
    RangeRule const&
84  
    rule() const noexcept
84  
    rule() const noexcept
85  
    {
85  
    {
86  
        return *this;
86  
        return *this;
87  
    }
87  
    }
88  
};
88  
};
89  

89  

90  
} // detail
90  
} // detail
91  
} // grammar
91  
} // grammar
92  
} // urls
92  
} // urls
93  
} // boost
93  
} // boost
94  

94  

95  
#endif
95  
#endif