GCC Code Coverage Report


Directory: libs/http_proto/include/boost/http_proto/
File: boost/http_proto/impl/fields_view_base.ipp
Date: 2023-12-22 17:54:30
Exec Total Coverage
Lines: 135 140 96.4%
Functions: 20 21 95.2%
Branches: 50 56 89.3%

Line Branch Exec Source
1 //
2 // Copyright (c) 2021 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/CPPAlliance/http_proto
8 //
9
10 #ifndef BOOST_HTTP_PROTO_IMPL_FIELDS_VIEW_BASE_IPP
11 #define BOOST_HTTP_PROTO_IMPL_FIELDS_VIEW_BASE_IPP
12
13 #include <boost/http_proto/fields_view.hpp>
14 #include <boost/http_proto/field.hpp>
15 #include <boost/http_proto/detail/except.hpp>
16 #include <boost/url/grammar/ci_string.hpp>
17 #include <boost/url/grammar/parse.hpp>
18 #include <boost/assert.hpp>
19 #include <boost/assert/source_location.hpp>
20 #include <utility>
21
22 namespace boost {
23 namespace http_proto {
24
25 fields_view_base::
26 value_type::
27 value_type(
28 reference const& other)
29 : id(other.id)
30 , name(other.name)
31 , value(other.value)
32 {
33 }
34
35 //------------------------------------------------
36
37 auto
38 1682 fields_view_base::
39 iterator::
40 operator*() const noexcept ->
41 reference
42 {
43
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1682 times.
1682 BOOST_ASSERT(i_ < ph_->count);
44 auto const& e =
45 1682 ph_->tab()[i_];
46 1682 auto const* p =
47 1682 ph_->cbuf + ph_->prefix;
48 return {
49 1682 e.id,
50 core::string_view(
51 1682 p + e.np, e.nn),
52 core::string_view(
53 1682 p + e.vp, e.vn) };
54 }
55
56 //------------------------------------------------
57
58 auto
59 24 fields_view_base::
60 reverse_iterator::
61 operator*() const noexcept ->
62 reference
63 {
64
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 BOOST_ASSERT(i_ > 0);
65 auto const& e =
66 24 ph_->tab()[i_-1];
67 24 auto const* p =
68 24 ph_->cbuf + ph_->prefix;
69 return {
70 24 e.id,
71 core::string_view(
72 24 p + e.np, e.nn),
73 core::string_view(
74 24 p + e.vp, e.vn) };
75 }
76
77 //------------------------------------------------
78
79 66 fields_view_base::
80 subrange::
81 iterator::
82 iterator(
83 detail::header const* ph,
84 66 std::size_t i) noexcept
85 : ph_(ph)
86 66 , i_(i)
87 {
88
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 66 times.
66 BOOST_ASSERT(i <= ph_->count);
89 66 }
90
91 66 fields_view_base::
92 subrange::
93 iterator::
94 iterator(
95 66 detail::header const* ph) noexcept
96 : ph_(ph)
97 66 , i_(ph->count)
98 {
99 66 }
100
101 auto
102 71 fields_view_base::
103 subrange::
104 iterator::
105 operator*() const noexcept ->
106 reference const
107 {
108 auto const& e =
109 71 ph_->tab()[i_];
110 71 auto const p =
111 71 ph_->cbuf + ph_->prefix;
112 142 return core::string_view(
113 71 p + e.vp, e.vn);
114 }
115
116 auto
117 79 fields_view_base::
118 subrange::
119 iterator::
120 operator++() noexcept ->
121 iterator&
122 {
123
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 79 times.
79 BOOST_ASSERT(i_ < ph_->count);
124 79 auto const* e = &ph_->tab()[i_];
125 79 auto const id = e->id;
126
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 7 times.
79 if(id != field::unknown)
127 {
128 72 ++i_;
129 72 --e;
130
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 49 times.
93 while(i_ != ph_->count)
131 {
132
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 21 times.
44 if(e->id == id)
133 23 break;
134 21 ++i_;
135 21 --e;
136 }
137 72 return *this;
138 }
139 7 auto const p =
140 7 ph_->cbuf + ph_->prefix;
141 auto name = core::string_view(
142 7 p + e->np, e->nn);
143 7 ++i_;
144 7 --e;
145
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 4 times.
24 while(i_ != ph_->count)
146 {
147
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 17 times.
20 if(grammar::ci_is_equal(
148 name, core::string_view(
149 20 p + e->np, e->nn)))
150 3 break;
151 17 ++i_;
152 17 --e;
153 }
154 7 return *this;
155 }
156
157 //------------------------------------------------
158 //
159 // fields_view_base
160 //
161 //------------------------------------------------
162
163 bool
164 4 fields_view_base::
165 exists(
166 field id) const noexcept
167 {
168 4 return find(id) != end();
169 }
170
171 bool
172 7 fields_view_base::
173 exists(
174 core::string_view name) const noexcept
175 {
176 7 return find(name) != end();
177 }
178
179 std::size_t
180 12 fields_view_base::
181 count(field id) const noexcept
182 {
183 12 std::size_t n = 0;
184
2/2
✓ Branch 3 taken 43 times.
✓ Branch 4 taken 12 times.
55 for(auto v : *this)
185
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 32 times.
43 if(v.id == id)
186 11 ++n;
187 12 return n;
188 }
189
190 std::size_t
191 5 fields_view_base::
192 count(
193 core::string_view name) const noexcept
194 {
195 5 std::size_t n = 0;
196
2/2
✓ Branch 3 taken 44 times.
✓ Branch 4 taken 5 times.
49 for(auto v : *this)
197
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 37 times.
44 if(grammar::ci_is_equal(
198 v.name, name))
199 7 ++n;
200 5 return n;
201 }
202
203 auto
204 58 fields_view_base::
205 find(field id) const noexcept ->
206 iterator
207 {
208 58 auto it = begin();
209 58 auto const last = end();
210
2/2
✓ Branch 1 taken 146 times.
✓ Branch 2 taken 8 times.
154 while(it != last)
211 {
212
2/2
✓ Branch 2 taken 50 times.
✓ Branch 3 taken 96 times.
146 if(it->id == id)
213 50 break;
214 96 ++it;
215 }
216 58 return it;
217 }
218
219 auto
220 66 fields_view_base::
221 find(
222 core::string_view name) const noexcept ->
223 iterator
224 {
225 66 auto it = begin();
226 66 auto const last = end();
227
2/2
✓ Branch 1 taken 160 times.
✓ Branch 2 taken 8 times.
168 while(it != last)
228 {
229 160 if(grammar::ci_is_equal(
230
2/2
✓ Branch 2 taken 58 times.
✓ Branch 3 taken 102 times.
320 it->name, name))
231 58 break;
232 102 ++it;
233 }
234 66 return it;
235 }
236
237 auto
238 2 fields_view_base::
239 find(
240 iterator from,
241 field id) const noexcept ->
242 iterator
243 {
244 2 auto const last = end();
245
2/2
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
11 while(from != last)
246 {
247
2/2
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 9 times.
10 if(from->id == id)
248 1 break;
249 9 ++from;
250 }
251 2 return from;
252 }
253
254 auto
255 2 fields_view_base::
256 find(
257 iterator from,
258 core::string_view name) const noexcept ->
259 iterator
260 {
261 2 auto const last = end();
262
2/2
✓ Branch 1 taken 11 times.
✓ Branch 2 taken 1 times.
12 while(from != last)
263 {
264 11 if(grammar::ci_is_equal(
265
2/2
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 10 times.
22 name, from->name))
266 1 break;
267 10 ++from;
268 }
269 2 return from;
270 }
271
272 auto
273 27 fields_view_base::
274 find_last(
275 iterator it,
276 field id) const noexcept ->
277 iterator
278 {
279 27 auto const it0 = begin();
280 for(;;)
281 {
282
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 36 times.
40 if(it == it0)
283 4 return end();
284 36 --it;
285
2/2
✓ Branch 2 taken 23 times.
✓ Branch 3 taken 13 times.
36 if(it->id == id)
286 23 return it;
287 }
288 }
289
290 auto
291 3 fields_view_base::
292 find_last(
293 iterator it,
294 core::string_view name) const noexcept ->
295 iterator
296 {
297 3 auto const it0 = begin();
298 for(;;)
299 {
300
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 13 times.
14 if(it == it0)
301 1 return end();
302 13 --it;
303 13 if(grammar::ci_is_equal(
304
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 11 times.
26 it->name, name))
305 2 return it;
306 }
307 }
308
309 core::string_view
310 2 fields_view_base::
311 value_or(
312 field id,
313 core::string_view s) const noexcept
314 {
315 2 auto it = find(id);
316
2/2
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
2 if(it != end())
317 1 return it->value;
318 1 return s;
319 }
320
321 core::string_view
322 2 fields_view_base::
323 value_or(
324 core::string_view name,
325 core::string_view s) const noexcept
326 {
327 2 auto it = find(name);
328
2/2
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
2 if(it != end())
329 1 return it->value;
330 1 return s;
331 }
332
333 //------------------------------------------------
334
335 auto
336 16 fields_view_base::
337 find_all(
338 field id) const noexcept ->
339 subrange
340 {
341 32 return subrange(
342 16 ph_, find(id).i_);
343 }
344
345 auto
346 5 fields_view_base::
347 find_all(
348 core::string_view name) const noexcept ->
349 subrange
350 {
351 10 return subrange(
352 5 ph_, find(name).i_);
353 }
354
355 //------------------------------------------------
356
357 } // http_proto
358 } // boost
359
360 #endif
361