Line data Source code
1 : //
2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 : //
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)
7 : //
8 : // Official repository: https://github.com/boostorg/url
9 : //
10 :
11 : #ifndef BOOST_URL_IMPL_PARAMS_ENCODED_BASE_HPP
12 : #define BOOST_URL_IMPL_PARAMS_ENCODED_BASE_HPP
13 :
14 : #include <boost/url/detail/params_iter_impl.hpp>
15 :
16 : namespace boost {
17 : namespace urls {
18 :
19 : #ifndef BOOST_URL_DOCS
20 : class params_ref;
21 : #endif
22 :
23 : //------------------------------------------------
24 :
25 : class params_encoded_base::iterator
26 : {
27 : detail::params_iter_impl it_;
28 :
29 : friend class params_encoded_base;
30 : friend class params_encoded_ref;
31 :
32 : iterator(detail::query_ref const& ref) noexcept;
33 : iterator(detail::query_ref const& ref, int) noexcept;
34 159 : iterator(
35 : detail::params_iter_impl const& it)
36 159 : : it_(it)
37 : {
38 159 : }
39 :
40 : public:
41 : using value_type =
42 : params_encoded_base::value_type;
43 : using reference =
44 : params_encoded_base::reference;
45 : using pointer = reference;
46 : using difference_type = std::ptrdiff_t;
47 : using iterator_category =
48 : std::bidirectional_iterator_tag;
49 :
50 4 : iterator() = default;
51 : iterator(iterator const&) = default;
52 : iterator& operator=(
53 : iterator const&) = default;
54 :
55 : iterator&
56 696 : operator++() noexcept
57 : {
58 696 : it_.increment();
59 696 : return *this;
60 : }
61 :
62 : iterator
63 292 : operator++(int) noexcept
64 : {
65 292 : auto tmp = *this;
66 292 : ++*this;
67 292 : return tmp;
68 : }
69 :
70 : iterator&
71 580 : operator--() noexcept
72 : {
73 580 : it_.decrement();
74 580 : return *this;
75 : }
76 :
77 : iterator
78 290 : operator--(int) noexcept
79 : {
80 290 : auto tmp = *this;
81 290 : --*this;
82 290 : return tmp;
83 : }
84 :
85 : reference
86 622 : operator*() const
87 : {
88 622 : return it_.dereference();
89 : }
90 :
91 : pointer
92 21 : operator->() const
93 : {
94 21 : return it_.dereference();
95 : }
96 :
97 : friend
98 : bool
99 617 : operator==(
100 : iterator const& it0,
101 : iterator const& it1) noexcept
102 : {
103 617 : return it0.it_.equal(it1.it_);
104 : }
105 :
106 : friend
107 : bool
108 111 : operator!=(
109 : iterator const& it0,
110 : iterator const& it1) noexcept
111 : {
112 111 : return ! it0.it_.equal(it1.it_);
113 : }
114 : };
115 :
116 : //------------------------------------------------
117 : //
118 : // Observers
119 : //
120 : //------------------------------------------------
121 :
122 : inline
123 : bool
124 28 : params_encoded_base::
125 : contains(
126 : pct_string_view key,
127 : ignore_case_param ic) const noexcept
128 : {
129 28 : return find_impl(
130 56 : begin().it_, key, ic) != end();
131 : }
132 :
133 : inline
134 : auto
135 38 : params_encoded_base::
136 : find(
137 : pct_string_view key,
138 : ignore_case_param ic) const noexcept ->
139 : iterator
140 : {
141 38 : return find_impl(
142 76 : begin().it_, key, ic);
143 : }
144 :
145 : inline
146 : auto
147 32 : params_encoded_base::
148 : find(
149 : iterator it,
150 : pct_string_view key,
151 : ignore_case_param ic) const noexcept ->
152 : iterator
153 : {
154 64 : return find_impl(
155 32 : it.it_, key, ic);
156 : }
157 :
158 : inline
159 : auto
160 4 : params_encoded_base::
161 : find_last(
162 : pct_string_view key,
163 : ignore_case_param ic) const noexcept ->
164 : iterator
165 : {
166 4 : return find_last_impl(
167 8 : end().it_, key, ic);
168 : }
169 :
170 : inline
171 : auto
172 9 : params_encoded_base::
173 : find_last(
174 : iterator it,
175 : pct_string_view key,
176 : ignore_case_param ic) const noexcept ->
177 : iterator
178 : {
179 18 : return find_last_impl(
180 9 : it.it_, key, ic);
181 : }
182 :
183 : } // urls
184 : } // boost
185 :
186 : #endif
|