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

100.0% Lines (36/36) 100.0% Functions (8/9) 67.0% Branches (77/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 no more than `at_most` bytes from the constant buffer
24 sequence denoted by `src` into the mutable buffer sequence denoted by `dest`.
25
26 @par Constraints
27 @code
28 MutableBufferSequence<decltype(dest)> &&
29 ConstBufferSequence<decltype(src)>
30 @endcode
31
32 @return The number of bytes actually copied, which will be exactly equal to
33 `std::min( size(dest), size(src), at_most )`.
34
35 @param dest The destination buffer sequence
36
37 @param src The source buffer sequence
38 */
39 constexpr struct buffer_copy_mrdocs_workaround_t
40 {
41 template<
42 MutableBufferSequence MutableBufferSequence,
43 ConstBufferSequence ConstBufferSequence>
44 std::size_t
45 12450 operator()(
46 MutableBufferSequence const& dest,
47 ConstBufferSequence const& src,
48 std::size_t at_most = std::size_t(-1)) const noexcept
49 {
50 12450 std::size_t total = 0;
51 12450 std::size_t pos0 = 0;
52 12450 std::size_t pos1 = 0;
53 12450 auto const end0 = end(src);
54 12450 auto const end1 = end(dest);
55 12450 auto it0 = begin(src);
56 12450 auto it1 = begin(dest);
57 12450 while(
58
2/2
✓ Branch 0 taken 1908 times.
✓ Branch 1 taken 1052 times.
39845 total < at_most &&
59
12/15
✓ Branch 0 taken 3282 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 274 times.
✓ Branch 2 taken 576 times.
✓ Branch 3 taken 326 times.
✓ Branch 3 taken 838 times.
✓ Branch 3 taken 568 times.
✗ Branch 4 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 322 times.
✓ Branch 5 taken 838 times.
✗ Branch 6 not taken.
✓ Branch 6 taken 596 times.
✓ Branch 7 taken 322 times.
✓ Branch 8 taken 314 times.
56626 it0 != end0 &&
60
2/2
✓ Branch 1 taken 576 times.
✓ Branch 2 taken 216 times.
9119 it1 != end1)
61 {
62 21581 const_buffer b0 = *it0;
63 21581 mutable_buffer b1 = *it1;
64 21581 b0 += pos0;
65 21581 b1 += pos1;
66 std::size_t const amount =
67 64743 [&]
68 {
69 21581 std::size_t n = b0.size();
70
28/44
✓ Branch 1 taken 356 times.
✗ Branch 1 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 1 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 1654 times.
✓ Branch 2 taken 3060 times.
✓ Branch 2 taken 1 time.
✓ Branch 2 taken 24 times.
✓ Branch 2 taken 78 times.
✗ Branch 4 not taken.
✓ Branch 4 taken 3145 times.
✓ Branch 4 taken 48 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2923 times.
✓ Branch 5 taken 5137 times.
✓ Branch 5 taken 52 times.
✓ Branch 5 taken 78 times.
✓ Branch 7 taken 1898 times.
✓ Branch 7 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3068 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.
21581 if( n > b1.size())
71 5452 n = b1.size();
72
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 5174 times.
✓ Branch 2 taken 3150 times.
✓ Branch 3 taken 8233 times.
✓ Branch 4 taken 1728 times.
✓ Branch 5 taken 3257 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.
21581 if( n > at_most - total)
73 4878 n = at_most - total;
74
15/24
✓ Branch 0 taken 4416 times.
✓ Branch 1 taken 758 times.
✓ Branch 2 taken 10135 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 4635 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.
21581 if(n != 0)
75 19225 std::memcpy(
76 b1.data(),
77 b0.data(),
78 n);
79 21581 return n;
80 21581 }();
81 21581 total += amount;
82
2/2
✓ Branch 1 taken 734 times.
✓ Branch 2 taken 1276 times.
21581 if(amount == b1.size())
83 {
84 6650 ++it1;
85 6650 pos1 = 0;
86 }
87 else
88 {
89 14931 pos1 += amount;
90 }
91
2/2
✓ Branch 1 taken 1654 times.
✓ Branch 2 taken 356 times.
21581 if(amount == b0.size())
92 {
93 12667 ++it0;
94 12667 pos0 = 0;
95 }
96 else
97 {
98 8914 pos0 += amount;
99 }
100 }
101 12450 return total;
102 }
103 } buffer_copy {};
104
105 } // capy
106 } // boost
107
108 #endif
109