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 <ostream>
14  
#include <ostream>
15  

15  

16  
namespace boost {
16  
namespace boost {
17  
namespace urls {
17  
namespace urls {
18  

18  

19  
auto
19  
auto
20  
segments_base::
20  
segments_base::
21  
iterator::
21  
iterator::
22  
operator*() const ->
22  
operator*() const ->
23  
    reference
23  
    reference
24  
{
24  
{
25  
    encoding_opts opt;
25  
    encoding_opts opt;
26  
    opt.space_as_plus = false;
26  
    opt.space_as_plus = false;
27  
    return it_.dereference().decode(opt);
27  
    return it_.dereference().decode(opt);
28  
}
28  
}
29  

29  

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

37  

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

46  

47  
//------------------------------------------------
47  
//------------------------------------------------
48  
//
48  
//
49  
// segments_base
49  
// segments_base
50  
//
50  
//
51  
//------------------------------------------------
51  
//------------------------------------------------
52  

52  

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

59  

60  
pct_string_view
60  
pct_string_view
61  
segments_base::
61  
segments_base::
62  
buffer() const noexcept
62  
buffer() const noexcept
63  
{
63  
{
64  
    return ref_.buffer();
64  
    return ref_.buffer();
65  
}
65  
}
66  

66  

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

73  

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

80  

81  
std::size_t
81  
std::size_t
82  
segments_base::
82  
segments_base::
83  
size() const noexcept
83  
size() const noexcept
84  
{
84  
{
85  
    return ref_.nseg();
85  
    return ref_.nseg();
86  
}
86  
}
87  

87  

88  
auto
88  
auto
89  
segments_base::
89  
segments_base::
90  
begin() const noexcept ->
90  
begin() const noexcept ->
91  
    iterator
91  
    iterator
92  
{
92  
{
93  
    return iterator(ref_);
93  
    return iterator(ref_);
94  
}
94  
}
95  

95  

96  
auto
96  
auto
97  
segments_base::
97  
segments_base::
98  
end() const noexcept ->
98  
end() const noexcept ->
99  
    iterator
99  
    iterator
100  
{
100  
{
101  
    return iterator(ref_, 0);
101  
    return iterator(ref_, 0);
102  
}
102  
}
103  

103  

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

105  

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

114  

115  
} // urls
115  
} // urls
116  
} // boost
116  
} // boost
117  

117