GCC Code Coverage Report


Directory: libs/url/
File: libs/url/src/params_encoded_ref.cpp
Date: 2024-08-20 16:05:55
Exec Total Coverage
Lines: 74 76 97.4%
Functions: 15 15 100.0%
Branches: 14 26 53.8%

Line Branch Exec Source
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
12 #include <boost/url/detail/config.hpp>
13 #include <boost/url/decode_view.hpp>
14 #include <boost/url/params_encoded_ref.hpp>
15 #include <boost/url/params_encoded_view.hpp>
16 #include <boost/url/url_base.hpp>
17 #include <boost/url/grammar/ci_string.hpp>
18 #include <boost/assert.hpp>
19 #include <utility>
20
21 namespace boost {
22 namespace urls {
23
24 //------------------------------------------------
25 //
26 // Special Members
27 //
28 //------------------------------------------------
29
30 77 params_encoded_ref::
31 params_encoded_ref(
32 77 url_base& u) noexcept
33 77 : params_encoded_base(u.impl_)
34 77 , u_(&u)
35 {
36 77 }
37
38 params_encoded_ref&
39 1 params_encoded_ref::
40 operator=(
41 params_encoded_ref const& other)
42 {
43
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (!ref_.alias_of( other.ref_ ))
44 1 assign(other.begin(), other.end());
45 1 return *this;
46 }
47
48 params_encoded_ref&
49 2 params_encoded_ref::
50 operator=(std::initializer_list<
51 param_pct_view> init)
52 {
53 2 assign(init.begin(), init.end());
54 2 return *this;
55 }
56
57 58 params_encoded_ref::
58 operator
59 params_encoded_view() const noexcept
60 {
61 58 return {ref_};
62 }
63
64 //------------------------------------------------
65 //
66 // Modifiers
67 //
68 //------------------------------------------------
69
70 void
71 3 params_encoded_ref::
72 assign(
73 std::initializer_list<
74 param_pct_view> init)
75 {
76 3 assign(init.begin(), init.end());
77 3 }
78
79 auto
80 7 params_encoded_ref::
81 insert(
82 iterator before,
83 param_pct_view const& p) ->
84 iterator
85 {
86
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 return u_->edit_params(
87 before.it_,
88 before.it_,
89 14 detail::param_encoded_iter(p));
90 }
91
92 auto
93 12 params_encoded_ref::
94 insert(
95 iterator before,
96 std::initializer_list<
97 param_pct_view> init) ->
98 iterator
99 {
100 12 return insert(
101 before,
102 init.begin(),
103 12 init.end());
104 }
105
106 std::size_t
107 2 params_encoded_ref::
108 erase(
109 pct_string_view key,
110 ignore_case_param ic) noexcept
111 {
112 // end() can't be fully cached,
113 // since erase invalidates it.
114 2 iterator it;
115 {
116 2 auto const end_ = end();
117 2 it = find_last(end_, key, ic);
118
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if(it == end_)
119 return 0;
120 }
121 2 std::size_t n = 0;
122 for(;;)
123 {
124 5 ++n;
125 // Use it->key instead of key,
126 // to handle self-intersection
127 5 auto prev = find_last(it, it->key, ic);
128
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 3 times.
5 if(prev == end())
129 2 break;
130 3 erase(it);
131 3 it = prev;
132 3 }
133 2 erase(it);
134 2 return n;
135 }
136
137 auto
138 5 params_encoded_ref::
139 replace(
140 iterator pos,
141 param_pct_view const& p) ->
142 iterator
143 {
144
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 return u_->edit_params(
145 pos.it_,
146
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 std::next(pos).it_,
147 10 detail::param_encoded_iter(p));
148 }
149
150 auto
151 1 params_encoded_ref::
152 replace(
153 iterator from,
154 iterator to,
155 std::initializer_list<
156 param_pct_view> init) ->
157 iterator
158 {
159 1 return replace(
160 from,
161 to,
162 init.begin(),
163 1 init.end());
164 }
165
166 auto
167 4 params_encoded_ref::
168 unset(
169 iterator pos) noexcept ->
170 iterator
171 {
172
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 BOOST_ASSERT(pos.it_.nk > 0);
173 4 pct_string_view s;
174 4 return u_->edit_params(
175 4 pos.it_, pos.it_.next(),
176 4 detail::param_encoded_value_iter(
177 8 pos.it_.nk - 1, s, false));
178 }
179
180 auto
181 4 params_encoded_ref::
182 set(
183 iterator pos,
184 pct_string_view value) ->
185 iterator
186 {
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 BOOST_ASSERT(pos.it_.nk > 0);
188
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 return u_->edit_params(
189 pos.it_,
190 4 pos.it_.next(),
191 4 detail::param_encoded_value_iter(
192 12 pos.it_.nk - 1, value, true));
193 }
194
195 auto
196 1 params_encoded_ref::
197 set(
198 pct_string_view key,
199 pct_string_view value,
200 ignore_case_param ic) ->
201 iterator
202 {
203 // VFALCO we can't cache end() here
204 // because it is invalidated
205 // every time we set or erase.
206 1 auto it0 = find(key, ic);
207
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
1 if(it0 == end())
208 return append({key, value});
209
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 it0 = set(it0, value);
210 1 auto it = end();
211 for(;;)
212 {
213 2 it = find_last(it, key, ic);
214
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
2 if(it == it0)
215 1 return it0;
216 1 it = erase(it);
217 }
218 }
219
220 auto
221 9 params_encoded_ref::
222 erase(
223 iterator pos) noexcept ->
224 iterator
225 {
226 9 return erase(
227 pos,
228 9 std::next(pos));
229 }
230
231 auto
232 11 params_encoded_ref::
233 erase(
234 iterator first,
235 iterator last) noexcept ->
236 iterator
237 {
238 11 core::string_view s("", 0);
239 11 return u_->edit_params(
240 first.it_,
241 last.it_,
242 22 detail::query_iter(s));
243 }
244
245 } // urls
246 } // boost
247
248