GCC Code Coverage Report


Directory: libs/buffers/
File: boost/buffers/range.hpp
Date: 2024-07-24 21:34:17
Exec Total Coverage
Lines: 26 26 100.0%
Functions: 57 57 100.0%
Branches: 0 0 -%

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 #ifndef BOOST_BUFFERS_RANGE_HPP
11 #define BOOST_BUFFERS_RANGE_HPP
12
13 #include <boost/buffers/detail/config.hpp>
14 #include <boost/buffers/const_buffer.hpp>
15 #include <boost/buffers/mutable_buffer.hpp>
16 #include <boost/buffers/type_traits.hpp>
17 #include <type_traits>
18
19 namespace boost {
20 namespace buffers {
21 namespace detail {
22
23 struct begin_impl
24 {
25 template<class MutableBuffer>
26 auto
27 578925 operator()(
28 MutableBuffer const& b) const noexcept ->
29 typename std::enable_if<
30 std::is_convertible<
31 MutableBuffer const*,
32 mutable_buffer const*>::value,
33 mutable_buffer const*>::type
34 {
35 return static_cast<
36 mutable_buffer const*>(
37 578925 std::addressof(b));
38 }
39
40 template<class ConstBuffer>
41 auto
42 295892 operator()(
43 ConstBuffer const& b) const noexcept ->
44 typename std::enable_if<
45 std::is_convertible<
46 ConstBuffer const*,
47 const_buffer const*>::value,
48 const_buffer const*>::type
49 {
50 return static_cast<
51 const_buffer const*>(
52 295892 std::addressof(b));
53 }
54
55 template<class BufferSequence>
56 auto
57 32944 operator()(
58 BufferSequence& bs) const noexcept ->
59 typename std::enable_if<
60 ! std::is_convertible<
61 BufferSequence const*,
62 const_buffer const*>::value &&
63 ! std::is_convertible<
64 BufferSequence const*,
65 mutable_buffer const*>::value,
66 decltype(bs.begin())>::type
67 {
68 32944 return bs.begin();
69 }
70
71 template<class BufferSequence>
72 auto
73 2504884 operator()(
74 BufferSequence const& bs) const noexcept ->
75 typename std::enable_if<
76 ! std::is_convertible<
77 BufferSequence const*,
78 const_buffer const*>::value &&
79 ! std::is_convertible<
80 BufferSequence const*,
81 mutable_buffer const*>::value,
82 decltype(bs.begin())>::type
83 {
84 2504884 return bs.begin();
85 }
86 };
87
88 struct end_impl
89 {
90 template<class MutableBuffer>
91 auto
92 578925 operator()(
93 MutableBuffer const& b) const noexcept ->
94 typename std::enable_if<
95 std::is_convertible<
96 MutableBuffer const*,
97 mutable_buffer const*>::value,
98 mutable_buffer const*>::type
99 {
100 return static_cast<
101 mutable_buffer const*>(
102 578925 std::addressof(b)) + 1;
103 }
104
105 template<class ConstBuffer>
106 auto
107 295892 operator()(
108 ConstBuffer const& b) const noexcept ->
109 typename std::enable_if<
110 std::is_convertible<
111 ConstBuffer const*,
112 const_buffer const*>::value,
113 const_buffer const*>::type
114 {
115 return static_cast<
116 const_buffer const*>(
117 295892 std::addressof(b)) + 1;
118 }
119
120 template<class BufferSequence>
121 auto
122 32944 operator()(
123 BufferSequence& bs) const noexcept ->
124 typename std::enable_if<
125 ! std::is_convertible<
126 BufferSequence const*,
127 const_buffer const*>::value &&
128 ! std::is_convertible<
129 BufferSequence const*,
130 mutable_buffer const*>::value,
131 decltype(bs.end())>::type
132 {
133 32944 return bs.end();
134 }
135
136 template<class BufferSequence>
137 auto
138 2496180 operator()(
139 BufferSequence const& bs) const noexcept ->
140 typename std::enable_if<
141 ! std::is_convertible<
142 BufferSequence const*,
143 const_buffer const*>::value &&
144 ! std::is_convertible<
145 BufferSequence const*,
146 mutable_buffer const*>::value,
147 decltype(bs.end())>::type
148 {
149 2496180 return bs.end();
150 }
151 };
152
153 } // detail
154
155 /** Return an iterator to the beginning of the buffer sequence.
156 */
157 constexpr detail::begin_impl begin{};
158
159 /** Return an iterator to the end of the buffer sequence.
160 */
161 constexpr detail::end_impl end{};
162
163 //------------------------------------------------
164
165 namespace detail {
166
167 template<class T>
168 class iter_range
169 {
170 using begin_type = decltype(
171 buffers::begin(std::declval<T&>()));
172 using end_type = decltype(
173 buffers::end(std::declval<T&>()));
174
175 begin_type begin_;
176 end_type end_;
177
178 public:
179 1217661 iter_range(T& t) noexcept
180 1217661 : begin_(buffers::begin(t))
181 1217661 , end_(buffers::end(t))
182 {
183 1217661 }
184
185 begin_type
186 1217661 begin() const noexcept
187 {
188 1217661 return begin_;
189 }
190
191 end_type
192 1217661 end() const noexcept
193 {
194 1217661 return end_;
195 }
196 };
197
198 struct range_impl
199 {
200 template<class BufferSequence>
201 auto
202 892875 operator()(
203 BufferSequence&& bs) const noexcept ->
204 iter_range<typename
205 std::remove_reference<
206 BufferSequence>::type>
207 {
208 892875 return { bs };
209 }
210 };
211
212 } // detail
213
214 /** Return a range representing the buffer sequence.
215 */
216 constexpr detail::range_impl range{};
217
218 } // buffers
219 } // boost
220
221 #endif
222