GCC Code Coverage Report


Directory: libs/http_proto/include/boost/http_proto/
File: boost/http_proto/detail/impl/circular_buffer.ipp
Date: 2023-01-15 07:18:31
Exec Total Coverage
Lines: 32 45 71.1%
Functions: 8 9 88.9%
Branches: 5 14 35.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_IMPL_CIRCULAR_BUFFER_IPP
11 #define BOOST_HTTP_PROTO_DETAIL_IMPL_CIRCULAR_BUFFER_IPP
12
13 #include <boost/http_proto/detail/circular_buffer.hpp>
14 #include <boost/http_proto/detail/except.hpp>
15 #include <boost/assert.hpp>
16
17 namespace boost {
18 namespace http_proto {
19 namespace detail {
20
21 8 circular_buffer::
22 circular_buffer(
23 void* base,
24 8 std::size_t capacity) noexcept
25 : base_(reinterpret_cast<
26 unsigned char*>(base))
27 8 , cap_(capacity)
28 {
29 8 }
30
31 bool
32 4 circular_buffer::
33 empty() const noexcept
34 {
35 4 return in_len_ == 0;
36 }
37
38 std::size_t
39 5 circular_buffer::
40 size() const noexcept
41 {
42 5 return in_len_;
43 }
44
45 std::size_t
46 5 circular_buffer::
47 capacity() const noexcept
48 {
49 5 return cap_;
50 }
51
52 auto
53 5 circular_buffer::
54 data() const noexcept ->
55 const_buffers_pair
56 {
57
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if(in_pos_ + in_len_ <= cap_)
58 return {
59 const_buffer{
60 5 base_ + in_pos_, in_len_ },
61 5 const_buffer{ base_, 0} };
62 return {
63 const_buffer{
64 base_ + in_pos_, cap_ - in_pos_},
65 const_buffer{
66 base_, in_len_- (cap_ - in_pos_)}};
67 }
68
69 auto
70 10 circular_buffer::
71 prepare(std::size_t n) ->
72 mutable_buffers_pair
73 {
74 // Precondition violation
75
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if(n > cap_ - in_len_)
76 detail::throw_length_error();
77 10 out_size_ = n;
78 10 auto const pos = (
79 10 in_pos_ + in_len_) % cap_;
80
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if(pos + n <= cap_)
81 return {
82 mutable_buffer{
83 10 base_ + pos, n},
84 10 mutable_buffer{base_, 0}};
85 return {
86 mutable_buffer{
87 base_ + pos, cap_ - pos},
88 mutable_buffer{
89 base_, n - (cap_ - pos)}};
90 }
91
92 void
93 9 circular_buffer::
94 commit(std::size_t n)
95 {
96 // Precondition violation
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if(n > out_size_)
98 detail::throw_length_error();
99
100 9 in_len_ += n;
101 9 out_size_ = 0;
102 9 }
103
104 void
105 circular_buffer::
106 uncommit(
107 std::size_t n)
108 {
109 // Precondition violation
110 if( n > in_len_ ||
111 out_size_ > 0)
112 detail::throw_length_error();
113
114 in_len_ -= n;
115 }
116
117 void
118 4 circular_buffer::
119 consume(std::size_t n) noexcept
120 {
121
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if(n < in_len_)
122 {
123 in_pos_ = (in_pos_ + n) % cap_;
124 in_len_ -= n;
125 }
126 else
127 {
128 // make prepare return a
129 // bigger single buffer
130 4 in_pos_ = 0;
131 4 in_len_ = 0;
132 }
133 4 }
134
135 } // detail
136 } // http_proto
137 } // boost
138
139 #endif
140