GCC Code Coverage Report


Directory: libs/http_proto/
File: libs/http_proto/src/detail/move_chars.hpp
Date: 2024-04-04 20:17:10
Exec Total Coverage
Lines: 24 24 100.0%
Functions: 5 5 100.0%
Branches: 12 14 85.7%

Line Branch Exec Source
1 //
2 // Copyright (c) 2019 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/http_proto
8 //
9
10 #ifndef BOOST_HTTP_PROTO_DETAIL_MOVE_CHARS_HPP
11 #define BOOST_HTTP_PROTO_DETAIL_MOVE_CHARS_HPP
12
13 #include <boost/core/detail/string_view.hpp>
14 #include <cstring>
15 #include <functional>
16
17 namespace boost {
18 namespace http_proto {
19 namespace detail {
20
21 // Moves characters, and adjusts any passed
22 // views if they point to any moved characters.
23
24 // true if s completely overlapped by buf
25 inline
26 bool
27 251 is_overlapping(
28 core::string_view buf,
29 core::string_view s) noexcept
30 {
31 251 auto const b0 = buf.data();
32 251 auto const e0 = b0 + buf.size();
33 251 auto const b1 = s.data();
34 251 auto const e1 = b1 + s.size();
35 auto const less_equal =
36 std::less_equal<char const*>();
37
2/2
✓ Branch 1 taken 111 times.
✓ Branch 2 taken 140 times.
251 if(less_equal(e0, b1))
38 111 return false;
39
2/2
✓ Branch 1 taken 134 times.
✓ Branch 2 taken 6 times.
140 if(less_equal(e1, b0))
40 134 return false;
41 // partial overlap is undefined
42
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 BOOST_ASSERT(less_equal(e1, e0));
43
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 BOOST_ASSERT(less_equal(b0, b1));
44 6 return true;
45 }
46
47 inline
48 void
49 133 move_chars_impl(
50 std::ptrdiff_t,
51 core::string_view const&) noexcept
52 {
53 133 }
54
55 template<class... Sn>
56 void
57 532 move_chars_impl(
58 std::ptrdiff_t d,
59 core::string_view const& buf,
60 core::string_view* s,
61 Sn&&... sn) noexcept
62 {
63
6/6
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 245 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 260 times.
1034 if( s != nullptr &&
64 502 is_overlapping(buf, *s))
65 {
66 12 *s = { s->data() + d, s->size() };
67 }
68 532 move_chars_impl(d, buf, sn...);
69 532 }
70
71 template<class... Args>
72 void
73 133 move_chars(
74 char* dest,
75 char const* src,
76 std::size_t n,
77 Args&&... args) noexcept
78 {
79 133 move_chars_impl(
80 dest - src,
81 core::string_view(src, n),
82 args...);
83 133 std::memmove(
84 dest, src, n);
85 133 }
86
87 } // detail
88 } // http_proto
89 } // boost
90
91 #endif
92