libs/capy/include/boost/capy/buffers/buffer_copy.hpp

100.0% Lines (36/36) 100.0% Functions (10/11) 67.8% Branches (78/115)
libs/capy/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
2/2
✓ Branch 0 taken 1941 times.
✓ Branch 1 taken 897 times.
45752 total < at_most &&
59
13/15
✓ Branch 0 taken 3377 times.
✓ Branch 1 taken 331 times.
✓ Branch 2 taken 274 times.
✓ Branch 2 taken 595 times.
✓ Branch 3 taken 441 times.
✓ Branch 3 taken 838 times.
✓ Branch 3 taken 427 times.
✓ Branch 4 taken 102 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 437 times.
✓ Branch 5 taken 838 times.
✗ Branch 6 not taken.
✓ Branch 6 taken 596 times.
✓ Branch 7 taken 437 times.
✓ Branch 8 taken 267 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
28/44
✓ Branch 1 taken 498 times.
✗ Branch 1 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 1 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 1646 times.
✓ 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.
24865 if( n > b1.size())
71 5606 n = b1.size();
72
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 6871 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.
24865 if( n > at_most - total)
73 4878 n = at_most - total;
74
15/24
✓ Branch 0 taken 6113 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.
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
2/2
✓ Branch 1 taken 869 times.
✓ Branch 2 taken 1275 times.
24865 if(amount == b1.size())
83 {
84 6879 ++it1;
85 6879 pos1 = 0;
86 }
87 else
88 {
89 17986 pos1 += amount;
90 }
91
2/2
✓ Branch 1 taken 1646 times.
✓ Branch 2 taken 498 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