Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2023 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/buffers | ||
8 | // | ||
9 | |||
10 | #include <boost/buffers/const_buffer_subspan.hpp> | ||
11 | #include <boost/buffers/algorithm.hpp> | ||
12 | #include <boost/assert.hpp> | ||
13 | |||
14 | namespace boost { | ||
15 | namespace buffers { | ||
16 | |||
17 | auto | ||
18 | 772431 | const_buffer_subspan:: | |
19 | const_iterator:: | ||
20 | operator*() const noexcept -> | ||
21 | reference | ||
22 | { | ||
23 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 772431 times.
|
772431 | BOOST_ASSERT(s_->n_ > 0); |
24 | 772431 | auto b = s_->p_[i_]; | |
25 |
2/2✓ Branch 0 taken 526091 times.
✓ Branch 1 taken 246340 times.
|
772431 | if(s_->n_ > 1) |
26 | { | ||
27 |
2/2✓ Branch 0 taken 246866 times.
✓ Branch 1 taken 279225 times.
|
526091 | if(i_ > 0) |
28 | { | ||
29 |
2/2✓ Branch 0 taken 281 times.
✓ Branch 1 taken 246585 times.
|
246866 | if(i_ < s_->n_ - 1) |
30 | 281 | return b; | |
31 | 246585 | return prefix(b, s_->p1_); | |
32 | } | ||
33 | 279225 | return sans_prefix(b, s_->p0_); | |
34 | } | ||
35 | return { static_cast< | ||
36 | unsigned char const*>( | ||
37 | 246340 | b.data()) + s_->p0_, | |
38 | 246340 | s_->p1_ - s_->p0_ }; | |
39 | } | ||
40 | |||
41 | 7 | const_buffer_subspan:: | |
42 | const_buffer_subspan( | ||
43 | const_buffer const* p, | ||
44 | 7 | std::size_t n) noexcept | |
45 | 7 | : p_(p) | |
46 | 7 | , n_(n) | |
47 | 14 | , p1_([&]() -> std::size_t | |
48 | { | ||
49 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1 times.
|
7 | if(n > 0) |
50 | 6 | return p[n-1].size(); | |
51 | 1 | return 0; | |
52 | 7 | }()) | |
53 | { | ||
54 | 7 | } | |
55 | |||
56 | const_buffer_subspan | ||
57 | 139996 | const_buffer_subspan:: | |
58 | prefix_impl( | ||
59 | std::size_t n) const noexcept | ||
60 | { | ||
61 |
3/3✓ Branch 0 taken 16 times.
✓ Branch 1 taken 146 times.
✓ Branch 2 taken 139834 times.
|
139996 | switch(n_) |
62 | { | ||
63 | 16 | case 0: | |
64 | { | ||
65 | 16 | return *this; | |
66 | } | ||
67 | 146 | case 1: | |
68 | { | ||
69 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 137 times.
|
146 | if(n == 0) |
70 | 9 | return { p_, 0, p0_, p0_ }; | |
71 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 135 times.
|
137 | if(n == std::size_t(-1)) |
72 | 2 | return *this; | |
73 | 135 | auto const d = p1_ - p0_; | |
74 |
2/2✓ Branch 0 taken 58 times.
✓ Branch 1 taken 77 times.
|
135 | if(n <= d) |
75 | 58 | return { p_, 1, p0_, p0_ + n }; | |
76 | 77 | return *this; | |
77 | } | ||
78 | 139834 | default: | |
79 | { | ||
80 |
2/2✓ Branch 0 taken 8227 times.
✓ Branch 1 taken 131607 times.
|
139834 | if(n == 0) |
81 | 8227 | return { p_, 0, p0_, p0_ }; | |
82 |
2/2✓ Branch 0 taken 8202 times.
✓ Branch 1 taken 123405 times.
|
131607 | if(n == std::size_t(-1)) |
83 | 8202 | return *this; | |
84 | 123405 | auto d = p_[0].size() - p0_; | |
85 |
2/2✓ Branch 0 taken 75950 times.
✓ Branch 1 taken 47455 times.
|
123405 | if(n <= d) |
86 | 75950 | return { p_, 1, p0_, p0_ + n }; | |
87 | 47455 | n -= d; | |
88 | 47455 | std::size_t i = 1; | |
89 | for(;;) | ||
90 | { | ||
91 |
2/2✓ Branch 0 taken 47315 times.
✓ Branch 1 taken 339 times.
|
47654 | if(i == n_ - 1) |
92 | 47315 | break; | |
93 |
2/2✓ Branch 1 taken 140 times.
✓ Branch 2 taken 199 times.
|
339 | if(n <= p_[i].size()) |
94 | 140 | return { p_, i + 1, p0_, n }; | |
95 | 199 | n -= p_[i].size(); | |
96 | 199 | ++i; | |
97 | } | ||
98 |
2/2✓ Branch 0 taken 47287 times.
✓ Branch 1 taken 28 times.
|
47315 | if(n <= p1_) |
99 | 47287 | return { p_, n_, p0_, n }; | |
100 | 28 | return { p_, n_, p0_, p1_ }; | |
101 | } | ||
102 | } | ||
103 | } | ||
104 | |||
105 | const_buffer_subspan | ||
106 | 139996 | const_buffer_subspan:: | |
107 | suffix_impl( | ||
108 | std::size_t n) const noexcept | ||
109 | { | ||
110 |
3/3✓ Branch 0 taken 16 times.
✓ Branch 1 taken 82 times.
✓ Branch 2 taken 139898 times.
|
139996 | switch(n_) |
111 | { | ||
112 | 16 | case 0: | |
113 | { | ||
114 | 16 | return *this; | |
115 | } | ||
116 | 82 | case 1: | |
117 | { | ||
118 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 77 times.
|
82 | if(n == 0) |
119 | 5 | return { p_, 0, p1_, p1_ }; | |
120 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 75 times.
|
77 | if(n == std::size_t(-1)) |
121 | 2 | return *this; | |
122 | 75 | auto const d = p1_ - p0_; | |
123 |
2/2✓ Branch 0 taken 31 times.
✓ Branch 1 taken 44 times.
|
75 | if(n < d) |
124 | 31 | return { p_, 1, p1_ - n, p1_ }; | |
125 | 44 | return *this; | |
126 | } | ||
127 | 139898 | default: | |
128 | { | ||
129 |
2/2✓ Branch 0 taken 8231 times.
✓ Branch 1 taken 131667 times.
|
139898 | if(n == 0) |
130 | 8231 | return { p_, 0, p1_, p1_ }; | |
131 |
2/2✓ Branch 0 taken 8202 times.
✓ Branch 1 taken 123465 times.
|
131667 | if(n == std::size_t(-1)) |
132 | 8202 | return *this; | |
133 | 123465 | std::size_t i = n_ - 1; | |
134 |
2/2✓ Branch 0 taken 47274 times.
✓ Branch 1 taken 76191 times.
|
123465 | if(n <= p1_) |
135 | 47274 | return { p_ + i, 1, p1_ - n, p1_ }; | |
136 | 76191 | n -= p1_; | |
137 | for(;;) | ||
138 | { | ||
139 |
2/2✓ Branch 0 taken 76031 times.
✓ Branch 1 taken 277 times.
|
76308 | if(--i == 0) |
140 | 76031 | break; | |
141 |
2/2✓ Branch 1 taken 160 times.
✓ Branch 2 taken 117 times.
|
277 | if(n <= p_[i].size()) |
142 | 160 | return { p_ + i, n_ - i, | |
143 | 160 | p_[i].size() - n, p1_ }; | |
144 | 117 | n -= p_[i].size(); | |
145 | } | ||
146 | 76031 | auto d = p_[0].size() - p0_; | |
147 |
2/2✓ Branch 0 taken 75965 times.
✓ Branch 1 taken 66 times.
|
76031 | if(n <= d) |
148 | 75965 | return { p_, n_, | |
149 | 75965 | p_[0].size() - n, p1_ }; | |
150 | 66 | return { p_, n_, p0_, p1_ }; | |
151 | } | ||
152 | } | ||
153 | } | ||
154 | |||
155 | } // buffers | ||
156 | } // boost | ||
157 |