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_base.hpp>
13  
#include <boost/url/segments_base.hpp>
 
14 +
#include <boost/assert.hpp>
14  
#include <ostream>
15  
#include <ostream>
15  

16  

16  
namespace boost {
17  
namespace boost {
17  
namespace urls {
18  
namespace urls {
18 -
auto
 
19  

19  

20  
segments_base::
20  
segments_base::
21 -
iterator::
21 +
segments_base(
22 -
operator*() const ->
22 +
    detail::path_ref const& ref) noexcept
23 -
    reference
23 +
    : ref_(ref)
24 -
    encoding_opts opt;
 
25 -
    opt.space_as_plus = false;
 
26 -
    return it_.dereference().decode(opt);
 
27  
{
24  
{
28  
}
25  
}
29  

26  

30  
segments_base::
27  
segments_base::
31  
iterator::
28  
iterator::
32  
iterator(
29  
iterator(
33  
    detail::path_ref const& ref) noexcept
30  
    detail::path_ref const& ref) noexcept
34  
    : it_(ref)
31  
    : it_(ref)
35  
{
32  
{
36  
}
33  
}
37  

34  

38  
segments_base::
35  
segments_base::
39  
iterator::
36  
iterator::
40  
iterator(
37  
iterator(
41  
    detail::path_ref const& ref,
38  
    detail::path_ref const& ref,
42  
    int) noexcept
39  
    int) noexcept
43  
    : it_(ref, 0)
40  
    : it_(ref, 0)
44  
{
41  
{
45  
}
42  
}
46  

43  

47  
//------------------------------------------------
44  
//------------------------------------------------
48  
//
45  
//
49  
// segments_base
46  
// segments_base
50  
//
47  
//
51  
//------------------------------------------------
48  
//------------------------------------------------
52  

49  

53 -
segments_base::
50 +

54 -
segments_base(
 
55 -
    detail::path_ref const& ref) noexcept
 
56 -
    : ref_(ref)
 
57 -
{
 
58 -
}
 
59  

51  

60  
pct_string_view
52  
pct_string_view
61  
segments_base::
53  
segments_base::
62  
buffer() const noexcept
54  
buffer() const noexcept
63  
{
55  
{
64  
    return ref_.buffer();
56  
    return ref_.buffer();
65  
}
57  
}
66  

58  

67  
bool
59  
bool
68  
segments_base::
60  
segments_base::
69  
is_absolute() const noexcept
61  
is_absolute() const noexcept
70  
{
62  
{
71  
    return ref_.buffer().starts_with('/');
63  
    return ref_.buffer().starts_with('/');
72  
}
64  
}
73  

65  

74  
bool
66  
bool
75  
segments_base::
67  
segments_base::
76  
empty() const noexcept
68  
empty() const noexcept
77  
{
69  
{
78  
    return ref_.nseg() == 0;
70  
    return ref_.nseg() == 0;
79  
}
71  
}
80  

72  

81  
std::size_t
73  
std::size_t
82  
segments_base::
74  
segments_base::
83  
size() const noexcept
75  
size() const noexcept
84  
{
76  
{
85  
    return ref_.nseg();
77  
    return ref_.nseg();
 
78 +
}
 
79 +

 
80 +
std::string
 
81 +
segments_base::
 
82 +
front() const noexcept
 
83 +
{
 
84 +
    BOOST_ASSERT(! empty());
 
85 +
    return *begin();
 
86 +
}
 
87 +

 
88 +
std::string
 
89 +
segments_base::
 
90 +
back() const noexcept
 
91 +
{
 
92 +
    BOOST_ASSERT(! empty());
 
93 +
    return *--end();
86  
}
94  
}
87  

95  

88  
auto
96  
auto
89  
segments_base::
97  
segments_base::
90  
begin() const noexcept ->
98  
begin() const noexcept ->
91  
    iterator
99  
    iterator
92  
{
100  
{
93  
    return iterator(ref_);
101  
    return iterator(ref_);
94  
}
102  
}
95  

103  

96  
auto
104  
auto
97  
segments_base::
105  
segments_base::
98  
end() const noexcept ->
106  
end() const noexcept ->
99  
    iterator
107  
    iterator
100  
{
108  
{
101  
    return iterator(ref_, 0);
109  
    return iterator(ref_, 0);
102  
}
110  
}
103  

111  

104  
//------------------------------------------------
112  
//------------------------------------------------
105  

113  

106  
std::ostream&
114  
std::ostream&
107  
operator<<(
115  
operator<<(
108  
    std::ostream& os,
116  
    std::ostream& os,
109  
    segments_base const& ps)
117  
    segments_base const& ps)
110  
{
118  
{
111  
    os << ps.buffer();
119  
    os << ps.buffer();
112  
    return os;
120  
    return os;
113  
}
121  
}
114  

122  

115  
} // urls
123  
} // urls
116  
} // boost
124  
} // boost
117  

125