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

10  

11  

11  

12  
#include <boost/url/detail/config.hpp>
12  
#include <boost/url/detail/config.hpp>
13  
#include <boost/url/segments_encoded_base.hpp>
13  
#include <boost/url/segments_encoded_base.hpp>
14  
#include <boost/assert.hpp>
14  
#include <boost/assert.hpp>
15  
#include <ostream>
15  
#include <ostream>
16  

16  

17  
namespace boost {
17  
namespace boost {
18  
namespace urls {
18  
namespace urls {
19  

19  

20  
segments_encoded_base::
20  
segments_encoded_base::
 
21 +
segments_encoded_base(
 
22 +
    detail::path_ref const& ref) noexcept
 
23 +
    : ref_(ref)
 
24 +
{
 
25 +
}
 
26 +

 
27 +
segments_encoded_base::
21  
iterator::
28  
iterator::
22  
iterator(
29  
iterator(
23  
    detail::path_ref const& ref) noexcept
30  
    detail::path_ref const& ref) noexcept
24  
    : it_(ref)
31  
    : it_(ref)
25  
{
32  
{
26  
}
33  
}
27  

34  

28  
segments_encoded_base::
35  
segments_encoded_base::
29  
iterator::
36  
iterator::
30  
iterator(
37  
iterator(
31  
    detail::path_ref const& ref,
38  
    detail::path_ref const& ref,
32  
    int) noexcept
39  
    int) noexcept
33  
    : it_(ref, 0)
40  
    : it_(ref, 0)
34  
{
41  
{
35  
}
42  
}
36  

43  

37  
//------------------------------------------------
44  
//------------------------------------------------
38  
//
45  
//
39  
// segments_encoded_base
46  
// segments_encoded_base
40  
//
47  
//
41  
//------------------------------------------------
48  
//------------------------------------------------
42  

49  

43 -
segments_encoded_base::
50 +

44 -
segments_encoded_base(
 
45 -
    detail::path_ref const& ref) noexcept
 
46 -
    : ref_(ref)
 
47 -
{
 
48 -
}
 
49  

51  

50  
//------------------------------------------------
52  
//------------------------------------------------
51  
//
53  
//
52  
// Observers
54  
// Observers
53  
//
55  
//
54  
//------------------------------------------------
56  
//------------------------------------------------
55  

57  

56  
pct_string_view
58  
pct_string_view
57  
segments_encoded_base::
59  
segments_encoded_base::
58  
buffer() const noexcept
60  
buffer() const noexcept
59  
{
61  
{
60  
    return ref_.buffer();
62  
    return ref_.buffer();
61  
}
63  
}
62  

64  

63  
bool
65  
bool
64  
segments_encoded_base::
66  
segments_encoded_base::
65  
is_absolute() const noexcept
67  
is_absolute() const noexcept
66  
{
68  
{
67  
    return ref_.buffer().starts_with('/');
69  
    return ref_.buffer().starts_with('/');
68  
}
70  
}
69  

71  

70  
bool
72  
bool
71  
segments_encoded_base::
73  
segments_encoded_base::
72  
empty() const noexcept
74  
empty() const noexcept
73  
{
75  
{
74  
    return ref_.nseg() == 0;
76  
    return ref_.nseg() == 0;
75  
}
77  
}
76  

78  

77  
std::size_t
79  
std::size_t
78  
segments_encoded_base::
80  
segments_encoded_base::
79  
size() const noexcept
81  
size() const noexcept
80  
{
82  
{
81  
    return ref_.nseg();
83  
    return ref_.nseg();
 
84 +
}
 
85 +

 
86 +
pct_string_view
 
87 +
segments_encoded_base::
 
88 +
front() const noexcept
 
89 +
{
 
90 +
    BOOST_ASSERT(! empty());
 
91 +
    return *begin();
 
92 +
}
 
93 +

 
94 +
pct_string_view
 
95 +
segments_encoded_base::
 
96 +
back() const noexcept
 
97 +
{
 
98 +
    BOOST_ASSERT(! empty());
 
99 +
    return *--end();
82  
}
100  
}
83  

101  

84  
auto
102  
auto
85  
segments_encoded_base::
103  
segments_encoded_base::
86  
begin() const noexcept ->
104  
begin() const noexcept ->
87  
    iterator
105  
    iterator
88  
{
106  
{
89  
    return iterator(ref_);
107  
    return iterator(ref_);
90  
}
108  
}
91  

109  

92  
auto
110  
auto
93  
segments_encoded_base::
111  
segments_encoded_base::
94  
end() const noexcept ->
112  
end() const noexcept ->
95  
    iterator
113  
    iterator
96  
{
114  
{
97  
    return iterator(ref_, 0);
115  
    return iterator(ref_, 0);
98  
}
116  
}
99  

117  

100  
//------------------------------------------------
118  
//------------------------------------------------
101  

119  

102  
std::ostream&
120  
std::ostream&
103  
operator<<(
121  
operator<<(
104  
    std::ostream& os,
122  
    std::ostream& os,
105  
    segments_encoded_base const& ps)
123  
    segments_encoded_base const& ps)
106  
{
124  
{
107  
    os << ps.buffer();
125  
    os << ps.buffer();
108  
    return os;
126  
    return os;
109  
}
127  
}
110  

128  

111  
} // urls
129  
} // urls
112  
} // boost
130  
} // boost
113  

131