include/boost/capy/buffers.hpp
100.0% Lines (65 / 65)
90.2% Functions (221 / 245)
Functions (245)
Function
Calls
Lines
Blocks
boost::capy::mutable_buffer::mutable_buffer()
:53
22x
100.0%
100.0%
boost::capy::mutable_buffer::mutable_buffer(void*, unsigned long)
:82
35269x
100.0%
100.0%
boost::capy::mutable_buffer::data() const
:96
53991x
100.0%
100.0%
boost::capy::mutable_buffer::size() const
:105
80492x
100.0%
100.0%
boost::capy::mutable_buffer::operator+=(unsigned long)
:117
17716x
100.0%
100.0%
boost::capy::const_buffer::const_buffer()
:143
58x
100.0%
100.0%
boost::capy::const_buffer::const_buffer(void const*, unsigned long)
:171
31999x
100.0%
100.0%
boost::capy::const_buffer::const_buffer(boost::capy::mutable_buffer const&)
:182
7865x
100.0%
100.0%
boost::capy::const_buffer::data() const
:196
46540x
100.0%
100.0%
boost::capy::const_buffer::size() const
:205
78400x
100.0%
100.0%
boost::capy::const_buffer::operator+=(unsigned long)
:217
17361x
100.0%
100.0%
boost::capy::(anonymous namespace)::converts_to_both const* boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::converts_to_both>(boost::capy::(anonymous namespace)::converts_to_both const&) const
:324
0
0.0%
0.0%
boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable const* boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable>(boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable const&) const
:324
2x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_buffer const* boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::user_buffer>(boost::capy::(anonymous namespace)::user_buffer const&) const
:324
1x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_const const* boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::user_const>(boost::capy::(anonymous namespace)::user_const const&) const
:324
1x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_mutable const* boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::user_mutable>(boost::capy::(anonymous namespace)::user_mutable const&) const
:324
1x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_117::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:324
622x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_130::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:324
96x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_151::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:324
98x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_152::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:324
0
50.0%
0.0%
boost::capy::mutable_buffer const* boost::capy::._anon_117::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:324
5533x
100.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_130::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:324
113x
100.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_134::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:324
7x
100.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_151::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:324
183x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<(anonymous namespace)::chained_buffers>((anonymous namespace)::chained_buffers const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::(anonymous namespace)::ambiguous_range_of_const>(boost::capy::(anonymous namespace)::ambiguous_range_of_const const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::const_buffer [3]>(boost::capy::const_buffer const (&) [3]) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<2ul, false> >(boost::capy::detail::buffer_array<2ul, false> const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<2ul, true> >(boost::capy::detail::buffer_array<2ul, true> const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<4ul, false> >(boost::capy::detail::buffer_array<4ul, false> const&) const
:337
1217x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<4ul, true> >(boost::capy::detail::buffer_array<4ul, true> const&) const
:337
1218x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:337
17x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > const&) const
:337
7616x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > const&) const
:337
7616x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:337
104x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > const&) const
:337
28x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 5ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 5ul> > const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > const&) const
:337
5x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > const&) const
:337
16x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 3ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 3ul> > const&) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > const&) const
:337
308x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > const&) const
:337
308x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::mutable_buffer [3]>(boost::capy::mutable_buffer const (&) [3]) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::__cxx11::list<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::__cxx11::list<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:337
14x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::(anonymous namespace)::converts_to_both, 2ul> >(std::array<boost::capy::(anonymous namespace)::converts_to_both, 2ul> const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> >(std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::(anonymous namespace)::user_const, 2ul> >(std::array<boost::capy::(anonymous namespace)::user_const, 2ul> const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::(anonymous namespace)::user_mutable, 2ul> >(std::array<boost::capy::(anonymous namespace)::user_mutable, 2ul> const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 100ul> >(std::array<boost::capy::const_buffer, 100ul> const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul> const&) const
:337
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:337
2584x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 3ul> >(std::array<boost::capy::const_buffer, 3ul> const&) const
:337
21x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 5ul> >(std::array<boost::capy::const_buffer, 5ul> const&) const
:337
15x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::mutable_buffer, 1ul> >(std::array<boost::capy::mutable_buffer, 1ul> const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:337
2579x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::mutable_buffer, 3ul> >(std::array<boost::capy::mutable_buffer, 3ul> const&) const
:337
3x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > >(std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > const&) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:337
4448x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::const_buffer, 18446744073709551615ul> >(std::span<boost::capy::const_buffer, 18446744073709551615ul> const&) const
:337
16x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::const_buffer, 3ul> >(std::span<boost::capy::const_buffer, 3ul> const&) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:337
4425x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::mutable_buffer, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer, 18446744073709551615ul> const&) const
:337
14x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::mutable_buffer, 3ul> >(std::span<boost::capy::mutable_buffer, 3ul> const&) const
:337
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:337
23x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > >(std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > const&) const
:337
26x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:337
124x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:337
10x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:337
30x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul> const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_130::operator()<std::array<boost::capy::const_buffer, 256ul> >(std::array<boost::capy::const_buffer, 256ul> const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_130::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:337
42x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:337
6x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:337
125x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::span<boost::capy::const_buffer, 18446744073709551615ul> >(std::span<boost::capy::const_buffer, 18446744073709551615ul> const&) const
:337
41x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:337
110x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::span<boost::capy::mutable_buffer, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer, 18446744073709551615ul> const&) const
:337
38x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:337
6x
100.0%
100.0%
auto boost::capy::._anon_130::operator()<std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > >(std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > const&) const
:337
6x
100.0%
100.0%
auto boost::capy::._anon_134::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:337
0
0.0%
0.0%
auto boost::capy::._anon_151::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:337
98x
100.0%
100.0%
auto boost::capy::._anon_151::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:337
89x
100.0%
100.0%
auto boost::capy::._anon_151::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:337
60x
100.0%
100.0%
auto boost::capy::._anon_151::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > const&) const
:337
64x
100.0%
100.0%
auto boost::capy::._anon_151::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:337
72x
100.0%
100.0%
auto boost::capy::._anon_151::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:337
80x
100.0%
100.0%
auto boost::capy::._anon_152::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:337
0
50.0%
0.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<4ul, false> >(boost::capy::detail::buffer_array<4ul, false>&) const
:350
64x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::buffer_array<4ul, true> >(boost::capy::detail::buffer_array<4ul, true>&) const
:350
64x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> >&) const
:350
4352x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> >&) const
:350
4352x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >&) const
:350
176x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >&) const
:350
176x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul>&) const
:350
1x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::array<boost::capy::const_buffer, 3ul> >(std::array<boost::capy::const_buffer, 3ul>&) const
:350
2x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul>&) const
:350
4x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>&) const
:350
4x
100.0%
100.0%
auto boost::capy::._anon_117::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> >&) const
:350
1x
100.0%
100.0%
boost::capy::(anonymous namespace)::converts_to_both const* boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::converts_to_both>(boost::capy::(anonymous namespace)::converts_to_both const&) const
:369
0
0.0%
0.0%
boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable const* boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable>(boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable const&) const
:369
2x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_buffer const* boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::user_buffer>(boost::capy::(anonymous namespace)::user_buffer const&) const
:369
1x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_const const* boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::user_const>(boost::capy::(anonymous namespace)::user_const const&) const
:369
1x
100.0%
100.0%
boost::capy::(anonymous namespace)::user_mutable const* boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::user_mutable>(boost::capy::(anonymous namespace)::user_mutable const&) const
:369
1x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_118::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:369
623x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_131::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:369
96x
100.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_152::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:369
98x
50.0%
100.0%
boost::capy::const_buffer const* boost::capy::._anon_153::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:369
0
0.0%
0.0%
boost::capy::mutable_buffer const* boost::capy::._anon_118::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:369
5535x
50.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_131::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:369
113x
100.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_135::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:369
7x
100.0%
100.0%
boost::capy::mutable_buffer const* boost::capy::._anon_152::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:369
183x
90.0%
100.0%
auto boost::capy::._anon_118::operator()<(anonymous namespace)::chained_buffers>((anonymous namespace)::chained_buffers const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::(anonymous namespace)::ambiguous_range_of_const>(boost::capy::(anonymous namespace)::ambiguous_range_of_const const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::const_buffer [3]>(boost::capy::const_buffer const (&) [3]) const
:382
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<2ul, false> >(boost::capy::detail::buffer_array<2ul, false> const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<2ul, true> >(boost::capy::detail::buffer_array<2ul, true> const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<4ul, false> >(boost::capy::detail::buffer_array<4ul, false> const&) const
:382
1217x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<4ul, true> >(boost::capy::detail::buffer_array<4ul, true> const&) const
:382
1218x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:382
17x
90.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > const&) const
:382
7616x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > const&) const
:382
7616x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:382
104x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > const&) const
:382
28x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 5ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 5ul> > const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > const&) const
:382
6x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > const&) const
:382
29x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 3ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 3ul> > const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > const&) const
:382
308x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > const&) const
:382
308x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::mutable_buffer [3]>(boost::capy::mutable_buffer const (&) [3]) const
:382
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::__cxx11::list<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::__cxx11::list<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:382
26x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::(anonymous namespace)::converts_to_both, 2ul> >(std::array<boost::capy::(anonymous namespace)::converts_to_both, 2ul> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> >(std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 100ul> >(std::array<boost::capy::const_buffer, 100ul> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul> const&) const
:382
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:382
53x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 3ul> >(std::array<boost::capy::const_buffer, 3ul> const&) const
:382
21x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 5ul> >(std::array<boost::capy::const_buffer, 5ul> const&) const
:382
21x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::mutable_buffer, 1ul> >(std::array<boost::capy::mutable_buffer, 1ul> const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:382
43x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::mutable_buffer, 3ul> >(std::array<boost::capy::mutable_buffer, 3ul> const&) const
:382
3x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > >(std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > const&) const
:382
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:382
96x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::const_buffer, 18446744073709551615ul> >(std::span<boost::capy::const_buffer, 18446744073709551615ul> const&) const
:382
16x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::const_buffer, 3ul> >(std::span<boost::capy::const_buffer, 3ul> const&) const
:382
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:382
73x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::mutable_buffer, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer, 18446744073709551615ul> const&) const
:382
14x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::mutable_buffer, 3ul> >(std::span<boost::capy::mutable_buffer, 3ul> const&) const
:382
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:382
22x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > >(std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > const&) const
:382
26x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:382
124x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:382
10x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:382
30x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_131::operator()<std::array<boost::capy::const_buffer, 256ul> >(std::array<boost::capy::const_buffer, 256ul> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_131::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:382
42x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:382
6x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:382
125x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::span<boost::capy::const_buffer, 18446744073709551615ul> >(std::span<boost::capy::const_buffer, 18446744073709551615ul> const&) const
:382
41x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:382
110x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::span<boost::capy::mutable_buffer, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer, 18446744073709551615ul> const&) const
:382
38x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > const&) const
:382
6x
100.0%
100.0%
auto boost::capy::._anon_131::operator()<std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > >(std::vector<boost::capy::mutable_buffer, std::allocator<boost::capy::mutable_buffer> > const&) const
:382
6x
100.0%
100.0%
auto boost::capy::._anon_135::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_152::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:382
98x
50.0%
100.0%
auto boost::capy::._anon_152::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:382
89x
100.0%
100.0%
auto boost::capy::._anon_152::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:382
60x
100.0%
100.0%
auto boost::capy::._anon_152::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > const&) const
:382
64x
100.0%
100.0%
auto boost::capy::._anon_152::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:382
72x
100.0%
100.0%
auto boost::capy::._anon_152::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:382
80x
100.0%
100.0%
auto boost::capy::._anon_153::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:382
0
0.0%
0.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<4ul, false> >(boost::capy::detail::buffer_array<4ul, false>&) const
:395
64x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::buffer_array<4ul, true> >(boost::capy::detail::buffer_array<4ul, true>&) const
:395
64x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, false> >&) const
:395
4352x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> > >(boost::capy::detail::slice_of<boost::capy::detail::buffer_array<4ul, true> >&) const
:395
4352x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >&) const
:395
176x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >&) const
:395
176x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul>&) const
:395
1x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::array<boost::capy::const_buffer, 3ul> >(std::array<boost::capy::const_buffer, 3ul>&) const
:395
2x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul>&) const
:395
4x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>&) const
:395
4x
100.0%
100.0%
auto boost::capy::._anon_118::operator()<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >(std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> >&) const
:395
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::(anonymous namespace)::ambiguous_range_of_const>(boost::capy::(anonymous namespace)::ambiguous_range_of_const const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable>(boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::(anonymous namespace)::user_buffer>(boost::capy::(anonymous namespace)::user_buffer const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::const_buffer [3]>(boost::capy::const_buffer const (&) [3]) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:431
301x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::ambiguous_range_of_const> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> >(boost::capy::detail::slice_of<boost::capy::(anonymous namespace)::converts_to_const_range_of_mutable> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:431
5x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> > const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 100ul> > const&) const
:431
0
0.0%
0.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 3ul> > const&) const
:431
14x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > const&) const
:431
1x
83.3%
60.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 2ul> > const&) const
:431
4x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::const_buffer const, 18446744073709551615ul> > const&) const
:431
88x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > >(boost::capy::detail::slice_of<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> > const&) const
:431
88x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::mutable_buffer [3]>(boost::capy::mutable_buffer const (&) [3]) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:431
840x
42.9%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> >(std::array<boost::capy::(anonymous namespace)::user_buffer, 2ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::const_buffer, 100ul> >(std::array<boost::capy::const_buffer, 100ul> const&) const
:431
0
0.0%
0.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:431
20x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::const_buffer, 3ul> >(std::array<boost::capy::const_buffer, 3ul> const&) const
:431
4x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::const_buffer, 5ul> >(std::array<boost::capy::const_buffer, 5ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::array<boost::capy::mutable_buffer, 3ul> >(std::array<boost::capy::mutable_buffer, 3ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > >(std::ranges::reverse_view<std::span<boost::capy::const_buffer, 18446744073709551615ul> > const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:431
37x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::span<boost::capy::const_buffer, 18446744073709551615ul> >(std::span<boost::capy::const_buffer, 18446744073709551615ul> const&) const
:431
3x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::span<boost::capy::const_buffer, 3ul> >(std::span<boost::capy::const_buffer, 3ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:431
3x
100.0%
100.0%
unsigned long boost::capy::._anon_119::operator()<std::span<boost::capy::mutable_buffer, 3ul> >(std::span<boost::capy::mutable_buffer, 3ul> const&) const
:431
1x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:431
48x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:431
32x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:431
2x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:431
6x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:431
6x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<std::array<boost::capy::const_buffer, 1ul> >(std::array<boost::capy::const_buffer, 1ul> const&) const
:431
0
0.0%
0.0%
unsigned long boost::capy::._anon_132::operator()<std::array<boost::capy::const_buffer, 256ul> >(std::array<boost::capy::const_buffer, 256ul> const&) const
:431
0
0.0%
0.0%
unsigned long boost::capy::._anon_132::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:431
18x
100.0%
100.0%
unsigned long boost::capy::._anon_132::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:431
27x
100.0%
100.0%
unsigned long boost::capy::._anon_136::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:431
1x
92.9%
100.0%
unsigned long boost::capy::._anon_153::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:431
49x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<boost::capy::detail::slice_of<boost::capy::const_buffer> >(boost::capy::detail::slice_of<boost::capy::const_buffer> const&) const
:431
26x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:431
6x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::const_buffer, 2ul> > const&) const
:431
12x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:431
54x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<std::array<boost::capy::const_buffer, 2ul> >(std::array<boost::capy::const_buffer, 2ul> const&) const
:431
36x
100.0%
100.0%
unsigned long boost::capy::._anon_153::operator()<std::array<boost::capy::mutable_buffer, 2ul> >(std::array<boost::capy::mutable_buffer, 2ul> const&) const
:431
40x
100.0%
100.0%
unsigned long boost::capy::._anon_154::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:431
0
0.0%
0.0%
bool boost::capy::._anon_120::operator()<boost::capy::const_buffer>(boost::capy::const_buffer const&) const
:464
2x
87.5%
90.0%
bool boost::capy::._anon_120::operator()<boost::capy::detail::slice_of<boost::capy::mutable_buffer> >(boost::capy::detail::slice_of<boost::capy::mutable_buffer> const&) const
:464
0
27.3%
0.0%
bool boost::capy::._anon_120::operator()<boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > >(boost::capy::detail::slice_of<std::array<boost::capy::mutable_buffer, 1ul> > const&) const
:464
1x
62.5%
53.0%
bool boost::capy::._anon_120::operator()<boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&) const
:464
170x
87.5%
82.0%
bool boost::capy::._anon_133::operator()<std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&) const
:464
63x
87.5%
86.0%
bool boost::capy::._anon_133::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> >(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&) const
:464
75x
100.0%
93.0%
decltype (static_cast<unsigned long>({parm#2}-{parm#1})) boost::capy::detail::length_impl<__gnu_cxx::__normal_iterator<boost::capy::const_buffer const*, std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(__gnu_cxx::__normal_iterator<boost::capy::const_buffer const*, std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >, __gnu_cxx::__normal_iterator<boost::capy::const_buffer const*, std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > >, int)
:486
1x
100.0%
100.0%
decltype (static_cast<unsigned long>({parm#2}-{parm#1})) boost::capy::detail::length_impl<boost::capy::const_buffer const*>(boost::capy::const_buffer const*, boost::capy::const_buffer const*, int)
:486
7x
100.0%
100.0%
| Line | TLA | Hits | Source Code |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com) | ||
| 3 | // Copyright (c) 2026 Michael Vandeberg | ||
| 4 | // Copyright (c) 2026 Steve Gerbino | ||
| 5 | // | ||
| 6 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | ||
| 7 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||
| 8 | // | ||
| 9 | // Official repository: https://github.com/cppalliance/capy | ||
| 10 | // | ||
| 11 | |||
| 12 | #ifndef BOOST_CAPY_BUFFERS_HPP | ||
| 13 | #define BOOST_CAPY_BUFFERS_HPP | ||
| 14 | |||
| 15 | #include <boost/capy/detail/config.hpp> | ||
| 16 | #include <concepts> | ||
| 17 | #include <cstddef> | ||
| 18 | #include <iterator> | ||
| 19 | #include <memory> | ||
| 20 | #include <ranges> | ||
| 21 | #include <type_traits> | ||
| 22 | |||
| 23 | // https://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/ConstBufferSequence.html | ||
| 24 | |||
| 25 | namespace boost { | ||
| 26 | |||
| 27 | namespace asio { | ||
| 28 | class const_buffer; | ||
| 29 | class mutable_buffer; | ||
| 30 | } // asio | ||
| 31 | |||
| 32 | namespace capy { | ||
| 33 | |||
| 34 | class const_buffer; | ||
| 35 | class mutable_buffer; | ||
| 36 | |||
| 37 | /** A reference to a contiguous region of writable memory. | ||
| 38 | |||
| 39 | Represents a pointer and size pair for a modifiable byte range. | ||
| 40 | Does not own the memory. Satisfies `MutableBufferSequence` (as a | ||
| 41 | single-element sequence) and is implicitly convertible to | ||
| 42 | `const_buffer`. | ||
| 43 | |||
| 44 | @see @ref const_buffer, @ref MutableBufferSequence | ||
| 45 | */ | ||
| 46 | class mutable_buffer | ||
| 47 | { | ||
| 48 | unsigned char* p_ = nullptr; | ||
| 49 | std::size_t n_ = 0; | ||
| 50 | |||
| 51 | public: | ||
| 52 | /// Construct an empty buffer. | ||
| 53 | 22x | mutable_buffer() = default; | |
| 54 | |||
| 55 | /** Construct a copy. | ||
| 56 | |||
| 57 | @param other The buffer to copy. | ||
| 58 | */ | ||
| 59 | mutable_buffer( | ||
| 60 | mutable_buffer const& other) = default; | ||
| 61 | |||
| 62 | /** Assign by copying. | ||
| 63 | |||
| 64 | @param other The buffer to copy. | ||
| 65 | |||
| 66 | @return A reference to `*this`. | ||
| 67 | */ | ||
| 68 | mutable_buffer& operator=( | ||
| 69 | mutable_buffer const& other) = default; | ||
| 70 | |||
| 71 | /** Construct from a pointer and size. | ||
| 72 | |||
| 73 | Takes `void*` so a pointer to any object type binds without a | ||
| 74 | cast, since the buffer represents a raw, untyped writable | ||
| 75 | region. Stored internally as `unsigned char*` for byte-wise | ||
| 76 | pointer arithmetic (see `operator+=`). | ||
| 77 | |||
| 78 | @param data A pointer to the first byte of the region. | ||
| 79 | |||
| 80 | @param size The size of the region, in bytes. | ||
| 81 | */ | ||
| 82 | 35269x | constexpr mutable_buffer( | |
| 83 | void* data, std::size_t size) noexcept | ||
| 84 | 35269x | : p_(static_cast<unsigned char*>(data)) | |
| 85 | 35269x | , n_(size) | |
| 86 | { | ||
| 87 | 35269x | } | |
| 88 | |||
| 89 | /** Return a pointer to the memory region. | ||
| 90 | |||
| 91 | Returns `void*`, symmetric with the constructor, so the | ||
| 92 | caller can reinterpret the raw region as whatever type it needs. | ||
| 93 | |||
| 94 | @return A pointer to the first byte of the region. | ||
| 95 | */ | ||
| 96 | 53991x | constexpr void* data() const noexcept | |
| 97 | { | ||
| 98 | 53991x | return p_; | |
| 99 | } | ||
| 100 | |||
| 101 | /** Return the size in bytes. | ||
| 102 | |||
| 103 | @return The size of the region, in bytes. | ||
| 104 | */ | ||
| 105 | 80492x | constexpr std::size_t size() const noexcept | |
| 106 | { | ||
| 107 | 80492x | return n_; | |
| 108 | } | ||
| 109 | |||
| 110 | /** Advance the buffer start, shrinking the region. | ||
| 111 | |||
| 112 | @param n Bytes to skip. Clamped to `size()`. | ||
| 113 | |||
| 114 | @return A reference to `*this`. | ||
| 115 | */ | ||
| 116 | mutable_buffer& | ||
| 117 | 17716x | operator+=(std::size_t n) noexcept | |
| 118 | { | ||
| 119 | 17716x | if( n > n_) | |
| 120 | 1x | n = n_; | |
| 121 | 17716x | p_ += n; | |
| 122 | 17716x | n_ -= n; | |
| 123 | 17716x | return *this; | |
| 124 | } | ||
| 125 | }; | ||
| 126 | |||
| 127 | /** A reference to a contiguous region of read-only memory. | ||
| 128 | |||
| 129 | Represents a pointer and size pair for a non-modifiable byte range. | ||
| 130 | Does not own the memory. Satisfies `ConstBufferSequence` (as a | ||
| 131 | single-element sequence). Implicitly constructible from | ||
| 132 | `mutable_buffer`. | ||
| 133 | |||
| 134 | @see @ref mutable_buffer, @ref ConstBufferSequence | ||
| 135 | */ | ||
| 136 | class const_buffer | ||
| 137 | { | ||
| 138 | unsigned char const* p_ = nullptr; | ||
| 139 | std::size_t n_ = 0; | ||
| 140 | |||
| 141 | public: | ||
| 142 | /// Construct an empty buffer. | ||
| 143 | 58x | const_buffer() = default; | |
| 144 | |||
| 145 | /** Construct a copy. | ||
| 146 | |||
| 147 | @param other The buffer to copy. | ||
| 148 | */ | ||
| 149 | const_buffer(const_buffer const& other) = default; | ||
| 150 | |||
| 151 | /** Assign by copying. | ||
| 152 | |||
| 153 | @param other The buffer to copy. | ||
| 154 | |||
| 155 | @return A reference to `*this`. | ||
| 156 | */ | ||
| 157 | const_buffer& operator=( | ||
| 158 | const_buffer const& other) = default; | ||
| 159 | |||
| 160 | /** Construct from a pointer and size. | ||
| 161 | |||
| 162 | Takes `void const*` so a pointer to any object type binds | ||
| 163 | without a cast, since the buffer represents a raw, untyped | ||
| 164 | read-only region. Stored internally as `unsigned char const*` | ||
| 165 | for byte-wise pointer arithmetic (see `operator+=`). | ||
| 166 | |||
| 167 | @param data A pointer to the first byte of the region. | ||
| 168 | |||
| 169 | @param size The size of the region, in bytes. | ||
| 170 | */ | ||
| 171 | 31999x | constexpr const_buffer( | |
| 172 | void const* data, std::size_t size) noexcept | ||
| 173 | 31999x | : p_(static_cast<unsigned char const*>(data)) | |
| 174 | 31999x | , n_(size) | |
| 175 | { | ||
| 176 | 31999x | } | |
| 177 | |||
| 178 | /** Construct from mutable_buffer. | ||
| 179 | |||
| 180 | @param b The writable buffer whose region is referenced. | ||
| 181 | */ | ||
| 182 | 7865x | constexpr const_buffer( | |
| 183 | mutable_buffer const& b) noexcept | ||
| 184 | 7865x | : p_(static_cast<unsigned char const*>(b.data())) | |
| 185 | 7865x | , n_(b.size()) | |
| 186 | { | ||
| 187 | 7865x | } | |
| 188 | |||
| 189 | /** Return a pointer to the memory region. | ||
| 190 | |||
| 191 | Returns `void const*`, symmetric with the constructor, so the | ||
| 192 | caller can reinterpret the raw region as whatever type it needs. | ||
| 193 | |||
| 194 | @return A pointer to the first byte of the region. | ||
| 195 | */ | ||
| 196 | 46540x | constexpr void const* data() const noexcept | |
| 197 | { | ||
| 198 | 46540x | return p_; | |
| 199 | } | ||
| 200 | |||
| 201 | /** Return the size in bytes. | ||
| 202 | |||
| 203 | @return The size of the region, in bytes. | ||
| 204 | */ | ||
| 205 | 78400x | constexpr std::size_t size() const noexcept | |
| 206 | { | ||
| 207 | 78400x | return n_; | |
| 208 | } | ||
| 209 | |||
| 210 | /** Advance the buffer start, shrinking the region. | ||
| 211 | |||
| 212 | @param n Bytes to skip. Clamped to `size()`. | ||
| 213 | |||
| 214 | @return A reference to `*this`. | ||
| 215 | */ | ||
| 216 | const_buffer& | ||
| 217 | 17361x | operator+=(std::size_t n) noexcept | |
| 218 | { | ||
| 219 | 17361x | if( n > n_) | |
| 220 | 1x | n = n_; | |
| 221 | 17361x | p_ += n; | |
| 222 | 17361x | n_ -= n; | |
| 223 | 17361x | return *this; | |
| 224 | } | ||
| 225 | }; | ||
| 226 | |||
| 227 | /** Requires a type to convert to `const_buffer`. | ||
| 228 | |||
| 229 | This is the element requirement of @ref ConstBufferSequence. | ||
| 230 | |||
| 231 | For a `T const` lvalue `x`, both `const_buffer b = x;` and | ||
| 232 | `const_buffer(x)` must be valid, since algorithms convert elements | ||
| 233 | through a const reference and may use either form. A conversion | ||
| 234 | operator must therefore be `const`. | ||
| 235 | |||
| 236 | @note Algorithms that read buffer sequences are `noexcept`, so a | ||
| 237 | conversion that throws terminates the program. Conversion operators | ||
| 238 | should be `noexcept`. | ||
| 239 | |||
| 240 | @see @ref const_buffer, @ref MutableBuffer | ||
| 241 | */ | ||
| 242 | template<typename T> | ||
| 243 | concept ConstBuffer = | ||
| 244 | std::convertible_to<T const&, const_buffer>; | ||
| 245 | |||
| 246 | /** Requires a type to convert to both `mutable_buffer` and `const_buffer`. | ||
| 247 | |||
| 248 | This is the element requirement of @ref MutableBufferSequence. | ||
| 249 | |||
| 250 | A type that converts only to `mutable_buffer` does not qualify. | ||
| 251 | Reaching `const_buffer` from it takes two user-defined conversions, | ||
| 252 | and an implicit conversion sequence allows one. Such a type must | ||
| 253 | also provide a conversion to `const_buffer`. | ||
| 254 | |||
| 255 | As with @ref ConstBuffer, the conversion is from a `T const` lvalue, | ||
| 256 | and conversion operators should be `noexcept`. | ||
| 257 | |||
| 258 | @see @ref mutable_buffer, @ref ConstBuffer | ||
| 259 | */ | ||
| 260 | template<typename T> | ||
| 261 | concept MutableBuffer = | ||
| 262 | ConstBuffer<T> && std::convertible_to<T const&, mutable_buffer>; | ||
| 263 | |||
| 264 | /** Requires a type to be a @ref ConstBuffer, or a range of them. | ||
| 265 | |||
| 266 | A type satisfies `ConstBufferSequence` if it represents one or more | ||
| 267 | contiguous memory regions that can be read. This includes single | ||
| 268 | buffers and ranges of buffers. | ||
| 269 | |||
| 270 | @par Syntactic Requirements | ||
| 271 | @li @ref ConstBuffer, OR | ||
| 272 | @li A bidirectional range whose value type is a @ref ConstBuffer | ||
| 273 | |||
| 274 | @see @ref const_buffer, @ref MutableBufferSequence | ||
| 275 | */ | ||
| 276 | // tag::const_buffer_sequence_concept[] | ||
| 277 | template<typename T> | ||
| 278 | concept ConstBufferSequence = | ||
| 279 | ConstBuffer<T> || ( | ||
| 280 | std::ranges::bidirectional_range<T> && | ||
| 281 | ConstBuffer<std::ranges::range_value_t<T>>); | ||
| 282 | // end::const_buffer_sequence_concept[] | ||
| 283 | |||
| 284 | /** Requires a type to be a @ref MutableBuffer, or a range of them. | ||
| 285 | |||
| 286 | A type satisfies `MutableBufferSequence` if it represents one or more | ||
| 287 | contiguous memory regions that can be written. This includes single | ||
| 288 | buffers and ranges of buffers. | ||
| 289 | |||
| 290 | Every `MutableBufferSequence` is also a @ref ConstBufferSequence. | ||
| 291 | |||
| 292 | A @ref ConstBuffer is a single buffer, even if it is also a range, | ||
| 293 | so only its own conversion to `mutable_buffer` is considered. | ||
| 294 | |||
| 295 | @par Syntactic Requirements | ||
| 296 | @li @ref MutableBuffer, OR | ||
| 297 | @li A bidirectional range, not a @ref ConstBuffer, whose value type | ||
| 298 | is a @ref MutableBuffer | ||
| 299 | |||
| 300 | @see @ref mutable_buffer, @ref ConstBufferSequence | ||
| 301 | */ | ||
| 302 | // tag::mutable_buffer_sequence_concept[] | ||
| 303 | template<typename T> | ||
| 304 | concept MutableBufferSequence = | ||
| 305 | ConstBufferSequence<T> && (MutableBuffer<T> || ( | ||
| 306 | !ConstBuffer<T> && | ||
| 307 | std::ranges::bidirectional_range<T> && | ||
| 308 | MutableBuffer<std::ranges::range_value_t<T>>)); | ||
| 309 | // end::mutable_buffer_sequence_concept[] | ||
| 310 | |||
| 311 | /** Return an iterator to the first buffer in a sequence. | ||
| 312 | |||
| 313 | @functionobject | ||
| 314 | */ | ||
| 315 | constexpr struct | ||
| 316 | { | ||
| 317 | /** Return a pointer to a single buffer, forming a one-element range. | ||
| 318 | |||
| 319 | @param b A single buffer. | ||
| 320 | |||
| 321 | @return A pointer to `b`. | ||
| 322 | */ | ||
| 323 | template<ConstBuffer ConvertibleToBuffer> | ||
| 324 | 6657x | auto operator()(ConvertibleToBuffer const& b) const noexcept -> ConvertibleToBuffer const* | |
| 325 | { | ||
| 326 | 6657x | return std::addressof(b); | |
| 327 | } | ||
| 328 | |||
| 329 | /** Return an iterator to the first buffer of a sequence. | ||
| 330 | |||
| 331 | @param bs The buffer sequence. | ||
| 332 | |||
| 333 | @return An iterator to the first buffer of `bs`. | ||
| 334 | */ | ||
| 335 | template<ConstBufferSequence BS> | ||
| 336 | requires (!ConstBuffer<BS>) | ||
| 337 | 33657x | auto operator()(BS const& bs) const noexcept | |
| 338 | { | ||
| 339 | 33657x | return std::ranges::begin(bs); | |
| 340 | } | ||
| 341 | |||
| 342 | /** Return an iterator to the first buffer of a sequence. | ||
| 343 | |||
| 344 | @param bs The buffer sequence. | ||
| 345 | |||
| 346 | @return An iterator to the first buffer of `bs`. | ||
| 347 | */ | ||
| 348 | template<ConstBufferSequence BS> | ||
| 349 | requires (!ConstBuffer<BS>) | ||
| 350 | 9196x | auto operator()(BS& bs) const noexcept | |
| 351 | { | ||
| 352 | 9196x | return std::ranges::begin(bs); | |
| 353 | } | ||
| 354 | } buffer_sequence_begin {}; | ||
| 355 | |||
| 356 | /** Return an iterator past the last buffer in a sequence. | ||
| 357 | |||
| 358 | @functionobject | ||
| 359 | */ | ||
| 360 | constexpr struct | ||
| 361 | { | ||
| 362 | /** Return a pointer one past a single buffer, forming a one-element range. | ||
| 363 | |||
| 364 | @param b A single buffer. | ||
| 365 | |||
| 366 | @return A pointer one past `b`. | ||
| 367 | */ | ||
| 368 | template<ConstBuffer ConvertibleToBuffer> | ||
| 369 | 6660x | auto operator()(ConvertibleToBuffer const& b) const noexcept -> ConvertibleToBuffer const* | |
| 370 | { | ||
| 371 | 6660x | return std::addressof(b) + 1; | |
| 372 | } | ||
| 373 | |||
| 374 | /** Return an iterator past the last buffer of a sequence. | ||
| 375 | |||
| 376 | @param bs The buffer sequence. | ||
| 377 | |||
| 378 | @return An iterator one past the last buffer of `bs`. | ||
| 379 | */ | ||
| 380 | template<ConstBufferSequence BS> | ||
| 381 | requires (!ConstBuffer<BS>) | ||
| 382 | 33696x | auto operator()(BS const& bs) const noexcept | |
| 383 | { | ||
| 384 | 33696x | return std::ranges::end(bs); | |
| 385 | } | ||
| 386 | |||
| 387 | /** Return an iterator past the last buffer of a sequence. | ||
| 388 | |||
| 389 | @param bs The buffer sequence. | ||
| 390 | |||
| 391 | @return An iterator one past the last buffer of `bs`. | ||
| 392 | */ | ||
| 393 | template<ConstBufferSequence BS> | ||
| 394 | requires (!ConstBuffer<BS>) | ||
| 395 | 9196x | auto operator()(BS& bs) const noexcept | |
| 396 | { | ||
| 397 | 9196x | return std::ranges::end(bs); | |
| 398 | } | ||
| 399 | } buffer_sequence_end {}; | ||
| 400 | |||
| 401 | /** Return the total byte count across all buffers in a sequence. | ||
| 402 | |||
| 403 | @functionobject | ||
| 404 | */ | ||
| 405 | constexpr struct | ||
| 406 | { | ||
| 407 | // GCC 13 falsely flags reads of arr_[i].n_ in detail::buffer_array | ||
| 408 | // when iterating here. The class uses union storage with placement | ||
| 409 | // new for slots 0..n_-1, so reads inside this bounded loop are | ||
| 410 | // well-defined, but the optimizer can't prove the loop bound and | ||
| 411 | // warns. The runtime cost of value-initializing all N slots is | ||
| 412 | // non-trivial for non-trivial value types, so we suppress instead. | ||
| 413 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 414 | #pragma GCC diagnostic push | ||
| 415 | #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" | ||
| 416 | #endif | ||
| 417 | /** Return the total byte count across all buffers in a sequence. | ||
| 418 | |||
| 419 | Sums the `size()` of each buffer in the sequence. This differs | ||
| 420 | from `buffers_count` which counts the number of buffer elements. | ||
| 421 | |||
| 422 | @param bs The buffer sequence. | ||
| 423 | |||
| 424 | @return The sum of the sizes of all buffers in `bs`. | ||
| 425 | |||
| 426 | @par Example | ||
| 427 | @par !example example | ||
| 428 | |||
| 429 | */ | ||
| 430 | template<ConstBufferSequence CB> | ||
| 431 | 6291x | constexpr std::size_t operator()( | |
| 432 | CB const& bs) const noexcept | ||
| 433 | { | ||
| 434 | 6291x | std::size_t n = 0; | |
| 435 | 6291x | auto const e = capy::buffer_sequence_end(bs); | |
| 436 | 14581x | for(auto it = capy::buffer_sequence_begin(bs); it != e; ++it) | |
| 437 | 8290x | n += const_buffer(*it).size(); | |
| 438 | 6291x | return n; | |
| 439 | } | ||
| 440 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 441 | #pragma GCC diagnostic pop | ||
| 442 | #endif | ||
| 443 | } buffer_size {}; | ||
| 444 | |||
| 445 | /** Check if a buffer sequence contains no data. | ||
| 446 | |||
| 447 | @functionobject | ||
| 448 | */ | ||
| 449 | constexpr struct | ||
| 450 | { | ||
| 451 | // See note on buffer_size above — same union-storage false positive. | ||
| 452 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 453 | #pragma GCC diagnostic push | ||
| 454 | #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" | ||
| 455 | #endif | ||
| 456 | /** Check if a buffer sequence contains no data. | ||
| 457 | |||
| 458 | @param bs The buffer sequence. | ||
| 459 | |||
| 460 | @return `true` if all buffers have size zero or the sequence | ||
| 461 | is empty. | ||
| 462 | */ | ||
| 463 | template<ConstBufferSequence CB> | ||
| 464 | 1569x | constexpr bool operator()( | |
| 465 | CB const& bs) const noexcept | ||
| 466 | { | ||
| 467 | 1569x | auto it = buffer_sequence_begin(bs); | |
| 468 | 1569x | auto const end_ = buffer_sequence_end(bs); | |
| 469 | 1617x | while(it != end_) | |
| 470 | { | ||
| 471 | 1581x | const_buffer b(*it++); | |
| 472 | 1581x | if(b.size() != 0) | |
| 473 | 1533x | return false; | |
| 474 | } | ||
| 475 | 36x | return true; | |
| 476 | } | ||
| 477 | #if defined(__GNUC__) && !defined(__clang__) | ||
| 478 | #pragma GCC diagnostic pop | ||
| 479 | #endif | ||
| 480 | } buffers_empty {}; | ||
| 481 | |||
| 482 | namespace detail { | ||
| 483 | |||
| 484 | template<class It> | ||
| 485 | auto | ||
| 486 | 8x | length_impl(It first, It last, int) | |
| 487 | -> decltype(static_cast<std::size_t>(last - first)) | ||
| 488 | { | ||
| 489 | 8x | return static_cast<std::size_t>(last - first); | |
| 490 | } | ||
| 491 | |||
| 492 | template<class It> | ||
| 493 | std::size_t | ||
| 494 | length_impl(It first, It last, long) | ||
| 495 | { | ||
| 496 | std::size_t n = 0; | ||
| 497 | while(first != last) | ||
| 498 | { | ||
| 499 | ++first; | ||
| 500 | ++n; | ||
| 501 | } | ||
| 502 | return n; | ||
| 503 | } | ||
| 504 | |||
| 505 | } // detail | ||
| 506 | |||
| 507 | /** Return the number of buffer elements in a sequence. | ||
| 508 | |||
| 509 | Counts the number of individual buffer objects, not bytes. | ||
| 510 | For a single buffer, returns 1. For a range, returns the | ||
| 511 | distance from `buffer_sequence_begin` to `buffer_sequence_end`. | ||
| 512 | |||
| 513 | @param bs The buffer sequence. | ||
| 514 | |||
| 515 | @return The number of buffers in `bs`. | ||
| 516 | |||
| 517 | @see @ref buffer_size | ||
| 518 | */ | ||
| 519 | template<ConstBufferSequence CB> | ||
| 520 | std::size_t | ||
| 521 | 8x | buffers_count(CB const& bs) | |
| 522 | { | ||
| 523 | 8x | return detail::length_impl( | |
| 524 | 8x | buffer_sequence_begin(bs), buffer_sequence_end(bs), 0); | |
| 525 | } | ||
| 526 | |||
| 527 | /// Names `mutable_buffer` for a mutable sequence, `const_buffer` otherwise. | ||
| 528 | template<typename BS> | ||
| 529 | using buffer_type = std::conditional_t< | ||
| 530 | MutableBufferSequence<BS>, | ||
| 531 | mutable_buffer, const_buffer>; | ||
| 532 | |||
| 533 | } // capy | ||
| 534 | } // boost | ||
| 535 | |||
| 536 | #endif | ||
| 537 |