Line data Source code
1 : //
2 : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3 : //
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)
6 : //
7 : // Official repository: https://github.com/boostorg/url
8 : //
9 :
10 : #ifndef BOOST_URL_DETAIL_IMPL_ANY_SEGMENTS_ITER_IPP
11 : #define BOOST_URL_DETAIL_IMPL_ANY_SEGMENTS_ITER_IPP
12 :
13 : #include <boost/url/detail/config.hpp>
14 : #include <boost/url/rfc/detail/charsets.hpp>
15 : #include <boost/url/detail/any_segments_iter.hpp>
16 : #include <boost/core/detail/string_view.hpp>
17 : #include <boost/url/encode.hpp>
18 : #include <boost/url/rfc/pchars.hpp>
19 :
20 : namespace boost {
21 : namespace urls {
22 : namespace detail {
23 :
24 : //------------------------------------------------
25 : //
26 : // segment_iter
27 : //
28 : //------------------------------------------------
29 :
30 74 : segment_iter::
31 : segment_iter(
32 74 : core::string_view s_) noexcept
33 74 : : any_segments_iter(s_)
34 : {
35 74 : front = s;
36 74 : fast_nseg = 1;
37 74 : }
38 :
39 : void
40 74 : segment_iter::
41 : rewind() noexcept
42 : {
43 74 : at_end_ = false;
44 74 : }
45 :
46 : bool
47 148 : segment_iter::
48 : measure(
49 : std::size_t& n) noexcept
50 : {
51 148 : if(at_end_)
52 74 : return false;
53 74 : encoding_opts opt;
54 74 : opt.space_as_plus = false;
55 74 : n += encoded_size(
56 : s,
57 74 : encode_colons ?
58 : nocolon_pchars :
59 : pchars,
60 : opt);
61 74 : at_end_ = true;
62 74 : return true;
63 : }
64 :
65 : void
66 74 : segment_iter::
67 : copy(
68 : char*& dest,
69 : char const* end) noexcept
70 : {
71 74 : encoding_opts opt;
72 74 : opt.space_as_plus = false;
73 74 : dest += encode(
74 : dest,
75 74 : end - dest,
76 : s,
77 74 : encode_colons ?
78 : nocolon_pchars :
79 : pchars,
80 : opt);
81 74 : }
82 :
83 : //------------------------------------------------
84 : //
85 : // segments_iter_base
86 : //
87 : //------------------------------------------------
88 :
89 : void
90 188 : segments_iter_base::
91 : measure_impl(
92 : std::size_t& n,
93 : core::string_view s,
94 : bool encode_colons) noexcept
95 : {
96 188 : encoding_opts opt;
97 188 : opt.space_as_plus = false;
98 188 : n += encoded_size(
99 : s,
100 : encode_colons ?
101 : nocolon_pchars :
102 : pchars,
103 : opt);
104 188 : }
105 :
106 : void
107 188 : segments_iter_base::
108 : copy_impl(
109 : char*& dest,
110 : char const* end,
111 : core::string_view s,
112 : bool encode_colons) noexcept
113 : {
114 188 : encoding_opts opt;
115 188 : opt.space_as_plus = false;
116 188 : dest += encode(
117 : dest,
118 188 : end - dest,
119 : s,
120 : encode_colons ?
121 : nocolon_pchars :
122 : pchars,
123 : opt);
124 188 : }
125 :
126 : //------------------------------------------------
127 : //
128 : // segment_encoded_iter
129 : //
130 : //------------------------------------------------
131 :
132 72 : segment_encoded_iter::
133 : segment_encoded_iter(
134 72 : pct_string_view const& s_) noexcept
135 72 : : any_segments_iter(s_)
136 : {
137 72 : front = s;
138 72 : fast_nseg = 1;
139 72 : }
140 :
141 : void
142 72 : segment_encoded_iter::
143 : rewind() noexcept
144 : {
145 72 : at_end_ = false;
146 72 : }
147 :
148 : bool
149 144 : segment_encoded_iter::
150 : measure(
151 : std::size_t& n) noexcept
152 : {
153 144 : if(at_end_)
154 72 : return false;
155 72 : encoding_opts opt;
156 72 : opt.space_as_plus = false;
157 72 : n += detail::re_encoded_size_unsafe(
158 : s,
159 72 : encode_colons ?
160 : nocolon_pchars :
161 : pchars,
162 : opt);
163 72 : at_end_ = true;
164 72 : return true;
165 : }
166 :
167 : void
168 72 : segment_encoded_iter::
169 : copy(
170 : char*& dest,
171 : char const* end) noexcept
172 : {
173 72 : encoding_opts opt;
174 72 : opt.space_as_plus = false;
175 72 : detail::re_encode_unsafe(
176 : dest,
177 : end,
178 : s,
179 72 : encode_colons ?
180 : nocolon_pchars :
181 : pchars,
182 : opt);
183 72 : }
184 :
185 : //------------------------------------------------
186 : //
187 : // segments_encoded_iter_base
188 : //
189 : //------------------------------------------------
190 :
191 : void
192 327 : segments_encoded_iter_base::
193 : measure_impl(
194 : std::size_t& n,
195 : core::string_view s,
196 : bool encode_colons) noexcept
197 : {
198 327 : encoding_opts opt;
199 327 : opt.space_as_plus = false;
200 327 : n += detail::re_encoded_size_unsafe(
201 : s,
202 : encode_colons ?
203 : nocolon_pchars :
204 : pchars,
205 : opt);
206 327 : }
207 :
208 : void
209 325 : segments_encoded_iter_base::
210 : copy_impl(
211 : char*& dest,
212 : char const* end,
213 : core::string_view s,
214 : bool encode_colons) noexcept
215 : {
216 325 : encoding_opts opt;
217 325 : opt.space_as_plus = false;
218 325 : detail::re_encode_unsafe(
219 : dest,
220 : end,
221 : s,
222 : encode_colons ?
223 : nocolon_pchars :
224 : pchars,
225 : opt);
226 325 : }
227 :
228 : } // detail
229 : } // urls
230 : } // boost
231 :
232 : #endif
|