include/boost/capy/buffers/buffer_copy.hpp

95.3% Lines (202/212) 100.0% Functions (10/11) 69.7% Branches (124/178)
include/boost/capy/buffers/buffer_copy.hpp
Line Branch Hits Source Code
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/capy
8 //
9
10 #ifndef BOOST_CAPY_BUFFERS_BUFFER_COPY_HPP
11 #define BOOST_CAPY_BUFFERS_BUFFER_COPY_HPP
12
13 #include <boost/capy/detail/config.hpp>
14 #include <boost/capy/buffers.hpp>
15 #include <cstring>
16 #include <utility>
17
18 namespace boost {
19 namespace capy {
20
21 /** Copy the contents of a buffer sequence into another buffer sequence.
22
23 This function copies bytes from the constant buffer sequence `src` into
24 the mutable buffer sequence `dest`, stopping when any limit is reached.
25
26 @par Constraints
27 @code
28 MutableBufferSequence<decltype(dest)> &&
29 ConstBufferSequence<decltype(src)>
30 @endcode
31
32 @return The number of bytes copied, equal to
33 `std::min(size(dest), size(src), at_most)`.
34
35 @param dest The destination buffer sequence.
36 @param src The source buffer sequence.
37 @param at_most The maximum bytes to copy. Default copies all available.
38 */
39 constexpr struct buffer_copy_mrdocs_workaround_t
40 {
41 template<
42 MutableBufferSequence MB,
43 ConstBufferSequence CB>
44 std::size_t
45 14686 operator()(
46 MB const& dest,
47 CB const& src,
48 std::size_t at_most = std::size_t(-1)) const noexcept
49 {
50 14686 std::size_t total = 0;
51 14686 std::size_t pos0 = 0;
52 14686 std::size_t pos1 = 0;
53 14686 auto const end0 = end(src);
54 14686 auto const end1 = end(dest);
55 14686 auto it0 = begin(src);
56 14686 auto it1 = begin(dest);
57 14686 while(
58
6/6
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const:
✓ Branch 0 taken 278 times.
✓ Branch 1 taken 104 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const:
✓ Branch 0 taken 838 times.
✓ Branch 1 taken 596 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const:
✓ Branch 0 taken 825 times.
✓ Branch 1 taken 197 times.
45752 total < at_most &&
59
25/30
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const:
✓ Branch 0 taken 382 times.
✓ Branch 1 taken 166 times.
✓ Branch 2 taken 274 times.
✓ Branch 3 taken 4 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const:
✓ Branch 0 taken 1434 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 838 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 838 times.
✓ Branch 6 taken 596 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const:
✓ Branch 0 taken 299 times.
✓ Branch 1 taken 45 times.
✓ Branch 3 taken 257 times.
✓ Branch 4 taken 42 times.
✓ Branch 5 taken 257 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 257 times.
✓ Branch 8 taken 87 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const:
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 120 times.
✓ Branch 3 taken 180 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 180 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 180 times.
✓ Branch 8 taken 180 times.
unsigned long boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const:
✓ Branch 0 taken 1022 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 595 times.
✓ Branch 3 taken 427 times.
65220 it0 != end0 &&
60
2/2
✓ Branch 1 taken 595 times.
✓ Branch 2 taken 230 times.
9310 it1 != end1)
61 {
62 24865 const_buffer b0 = *it0;
63 24865 mutable_buffer b1 = *it1;
64 24865 b0 += pos0;
65 24865 b1 += pos1;
66 std::size_t const amount =
67 74595 [&]
68 {
69 24865 std::size_t n = b0.size();
70
35/52
<unknown function 45>:
✗ Branch 1 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 1 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 4515 times.
✓ Branch 2 taken 115 times.
✓ Branch 2 taken 18 times.
✓ Branch 2 taken 78 times.
✗ Branch 4 not taken.
✓ Branch 4 taken 3145 times.
✓ Branch 4 taken 42 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4378 times.
✓ Branch 5 taken 5201 times.
✓ Branch 5 taken 46 times.
✓ Branch 5 taken 78 times.
✓ Branch 7 taken 1916 times.
✓ Branch 7 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3130 times.
✓ Branch 8 taken 12 times.
✓ Branch 8 taken 3 times.
✗ Branch 10 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 11 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 11 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 time.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 270 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 1 not taken.
✓ Branch 2 taken 838 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 253 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 92 times.
✓ Branch 2 taken 88 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 398 times.
✓ Branch 2 taken 197 times.
24865 if( n > b1.size())
71 5606 n = b1.size();
72
19/34
<unknown function 45>:
✗ Branch 0 not taken.
✓ Branch 1 taken 4727 times.
✓ Branch 2 taken 3150 times.
✓ Branch 3 taken 9740 times.
✓ Branch 4 taken 1728 times.
✓ Branch 5 taken 3337 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 11 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 11 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 time.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 274 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 838 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 257 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 180 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 595 times.
24865 if( n > at_most - total)
73 4878 n = at_most - total;
74
20/34
<unknown function 45>:
✓ Branch 0 taken 3969 times.
✓ Branch 1 taken 758 times.
✓ Branch 2 taken 11640 times.
✓ Branch 3 taken 1250 times.
✓ Branch 4 taken 4715 times.
✓ Branch 5 taken 350 times.
✓ Branch 6 taken 11 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 11 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 time.
✗ Branch 23 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 0 taken 274 times.
✗ Branch 1 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 0 taken 838 times.
✗ Branch 1 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 0 taken 257 times.
✗ Branch 1 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 0 taken 595 times.
✗ Branch 1 not taken.
24865 if(n != 0)
75 22507 std::memcpy(
76 b1.data(),
77 b0.data(),
78 n);
79 24865 return n;
80 24865 }();
81 24865 total += amount;
82
8/10
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 174 times.
✓ Branch 2 taken 100 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const::{lambda()#1}::operator()() const:
✗ Branch 1 not taken.
✓ Branch 2 taken 838 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 87 times.
✓ Branch 2 taken 170 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 428 times.
✓ Branch 2 taken 167 times.
24865 if(amount == b1.size())
83 {
84 6879 ++it1;
85 6879 pos1 = 0;
86 }
87 else
88 {
89 17986 pos1 += amount;
90 }
91
9/10
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::mutable_buffer>(boost::capy::mutable_buffer const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 270 times.
✓ Branch 2 taken 4 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > >(boost::capy::mutable_buffer const&, boost::capy::slice_of<std::vector<boost::capy::const_buffer, std::allocator<boost::capy::const_buffer> > > const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 838 times.
✗ Branch 2 not taken.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer const, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer const, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 253 times.
✓ Branch 2 taken 4 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<boost::capy::mutable_buffer, std::span<boost::capy::const_buffer, 18446744073709551615ul> >(boost::capy::mutable_buffer const&, std::span<boost::capy::const_buffer, 18446744073709551615ul> const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 88 times.
✓ Branch 2 taken 92 times.
boost::capy::buffer_copy_mrdocs_workaround_t::operator()<std::span<boost::capy::mutable_buffer const, 18446744073709551615ul>, boost::capy::mutable_buffer>(std::span<boost::capy::mutable_buffer const, 18446744073709551615ul> const&, boost::capy::mutable_buffer const&, unsigned long) const::{lambda()#1}::operator()() const:
✓ Branch 1 taken 197 times.
✓ Branch 2 taken 398 times.
24865 if(amount == b0.size())
92 {
93 15797 ++it0;
94 15797 pos0 = 0;
95 }
96 else
97 {
98 9068 pos0 += amount;
99 }
100 }
101 14686 return total;
102 }
103 } buffer_copy {};
104
105 } // capy
106 } // boost
107
108 #endif
109