Line data Source code
1 : //
2 : // Copyright (c) 2022 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 : #include <boost/url/detail/config.hpp>
12 : #include <boost/url/detail/url_impl.hpp>
13 :
14 : namespace boost {
15 : namespace urls {
16 : namespace detail {
17 :
18 : //------------------------------------------------
19 : //
20 : // path_ref
21 : //
22 : //------------------------------------------------
23 :
24 2 : path_ref::
25 : path_ref() noexcept = default;
26 :
27 2096 : path_ref::
28 : path_ref(
29 2096 : url_impl const& impl) noexcept
30 : {
31 2096 : if(impl.from_ == url_impl::from::url)
32 : {
33 1594 : impl_ = &impl;
34 : }
35 : else
36 : {
37 502 : core::string_view s = impl.get(id_path);
38 502 : data_ = s.data();
39 502 : size_ = s.size();
40 502 : nseg_ = impl.nseg_;
41 502 : dn_ = impl.decoded_[id_path];
42 : }
43 2096 : }
44 :
45 181 : path_ref::
46 : path_ref(
47 : core::string_view s,
48 : std::size_t dn,
49 181 : std::size_t nseg) noexcept
50 362 : : data_(s.data())
51 181 : , size_(s.size())
52 181 : , nseg_(nseg)
53 181 : , dn_(dn)
54 : {
55 181 : }
56 :
57 : pct_string_view
58 4738 : path_ref::
59 : buffer() const noexcept
60 : {
61 4738 : if(impl_)
62 2392 : return make_pct_string_view_unsafe(
63 2392 : impl_->cs_ +
64 2392 : impl_->offset(id_path),
65 2392 : impl_->len(id_path),
66 4784 : impl_->decoded_[id_path]);
67 2346 : return make_pct_string_view_unsafe(
68 2346 : data_, size_, dn_);
69 : }
70 :
71 : std::size_t
72 4487 : path_ref::
73 : size() const noexcept
74 : {
75 4487 : if(impl_)
76 3116 : return impl_->len(id_path);
77 1371 : return size_;
78 : }
79 :
80 : char const*
81 12995 : path_ref::
82 : data() const noexcept
83 : {
84 12995 : if(impl_)
85 7472 : return impl_->cs_ +
86 7472 : impl_->offset(id_path);
87 5523 : return data_;
88 : }
89 :
90 : char const*
91 4460 : path_ref::
92 : end() const noexcept
93 : {
94 4460 : if(impl_)
95 2842 : return impl_->cs_ +
96 2842 : impl_->offset(id_query);
97 1618 : return data_ + size_;
98 : }
99 :
100 : std::size_t
101 9622 : path_ref::
102 : nseg() const noexcept
103 : {
104 9622 : if(impl_)
105 6161 : return impl_->nseg_;
106 3461 : return nseg_;
107 : }
108 :
109 : std::size_t
110 2040 : path_ref::
111 : decoded_size() const noexcept
112 : {
113 2040 : if(impl_)
114 1359 : return impl_->decoded_[id_path];
115 681 : return dn_;
116 : }
117 :
118 : //------------------------------------------------
119 : //
120 : // query_ref
121 : //
122 : //------------------------------------------------
123 :
124 255 : query_ref::
125 : query_ref(
126 : core::string_view s,
127 : std::size_t dn,
128 255 : std::size_t nparam) noexcept
129 510 : : data_(s.data())
130 255 : , size_(s.size())
131 255 : , nparam_(nparam)
132 255 : , dn_(dn)
133 : {
134 255 : }
135 :
136 479 : query_ref::
137 : query_ref(
138 479 : url_impl const& impl) noexcept
139 : {
140 479 : if(impl.from_ == url_impl::from::url)
141 : {
142 362 : impl_ = &impl;
143 : }
144 : else
145 : {
146 117 : core::string_view s = impl.get(id_query);
147 117 : if (!s.empty())
148 : {
149 111 : s.remove_prefix(1);
150 111 : question_mark_ = true;
151 : }
152 117 : data_ = s.data();
153 117 : size_ = s.size();
154 117 : nparam_ = impl.nparam_;
155 117 : dn_ = impl.decoded_[id_query];
156 : }
157 479 : }
158 :
159 : pct_string_view
160 24 : query_ref::
161 : buffer() const noexcept
162 : {
163 24 : if(impl_)
164 : {
165 2 : auto pos = impl_->offset_[id_query];
166 2 : auto pos1 = impl_->offset_[id_frag];
167 2 : if(pos < pos1)
168 : {
169 0 : ++pos; // no '?'
170 0 : return make_pct_string_view_unsafe(
171 0 : impl_->cs_ + pos,
172 0 : pos1 - pos,
173 0 : impl_->decoded_[id_query]);
174 : }
175 : // empty
176 2 : return make_pct_string_view_unsafe(
177 2 : impl_->cs_ + pos,
178 : 0,
179 2 : 0);
180 : }
181 : // no '?'
182 22 : return make_pct_string_view_unsafe(
183 22 : data_, size_, dn_);
184 : }
185 :
186 : // with '?'
187 : std::size_t
188 5562 : query_ref::
189 : size() const noexcept
190 : {
191 5562 : if(impl_)
192 2029 : return impl_->len(id_query);
193 3533 : if(size_ > 0)
194 3496 : return size_ + 1;
195 37 : return question_mark_;
196 : }
197 :
198 : // no '?'
199 : char const*
200 6034 : query_ref::
201 : begin() const noexcept
202 : {
203 6034 : if(impl_)
204 : {
205 : // using the offset array here
206 2288 : auto pos = impl_->offset_[id_query];
207 2288 : auto pos1 = impl_->offset_[id_frag];
208 2288 : if(pos < pos1)
209 2288 : return impl_->cs_ + pos + 1; // no '?'
210 : // empty
211 0 : return impl_->cs_ + pos;
212 : }
213 3746 : return data_;
214 : }
215 :
216 : char const*
217 2380 : query_ref::
218 : end() const noexcept
219 : {
220 2380 : if(impl_)
221 917 : return impl_->cs_ +
222 917 : impl_->offset(id_frag);
223 1463 : return data_ + size_;
224 : }
225 :
226 : std::size_t
227 8862 : query_ref::
228 : nparam() const noexcept
229 : {
230 8862 : if(impl_)
231 3171 : return impl_->nparam_;
232 5691 : return nparam_;
233 : }
234 :
235 : } // detail
236 : } // urls
237 : } // boost
|