TLA Line data 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/http
8 : //
9 :
10 : #include <boost/http/detail/circular_buffer.hpp>
11 : #include <boost/http/detail/except.hpp>
12 :
13 : namespace boost {
14 : namespace http {
15 : namespace detail {
16 :
17 : auto
18 HIT 169700 : circular_buffer::
19 : data() const noexcept ->
20 : const_buffers_type
21 : {
22 169700 : if(in_pos_ + in_len_ <= cap_)
23 : return {{
24 153419 : capy::const_buffer{ base_ + in_pos_, in_len_ },
25 153419 : capy::const_buffer{ base_, 0} }};
26 : return {{
27 16281 : capy::const_buffer{ base_ + in_pos_, cap_ - in_pos_},
28 16281 : capy::const_buffer{ base_, in_len_- (cap_ - in_pos_)} }};
29 : }
30 :
31 : auto
32 90154 : circular_buffer::
33 : prepare(std::size_t n) ->
34 : mutable_buffers_type
35 : {
36 : // Buffer is too small for n
37 90154 : if(n > cap_ - in_len_)
38 MIS 0 : detail::throw_length_error();
39 :
40 HIT 90154 : out_size_ = n;
41 90154 : auto const pos = (
42 90154 : in_pos_ + in_len_) % cap_;
43 90154 : if(pos + n <= cap_)
44 : return {{
45 54078 : capy::mutable_buffer{ base_ + pos, n },
46 54078 : capy::mutable_buffer{ base_, 0 } }};
47 : return {{
48 36076 : capy::mutable_buffer{ base_ + pos, cap_ - pos },
49 36076 : capy::mutable_buffer{ base_, n - (cap_ - pos) } }};
50 : }
51 :
52 : void
53 89826 : circular_buffer::
54 : commit(
55 : std::size_t n) noexcept
56 : {
57 89826 : if(n < out_size_)
58 89549 : in_len_ += n;
59 : else
60 277 : in_len_ += out_size_;
61 89826 : out_size_ = 0;
62 89826 : }
63 :
64 : void
65 143923 : circular_buffer::
66 : consume(
67 : std::size_t n) noexcept
68 : {
69 143923 : if(n < in_len_)
70 : {
71 115209 : in_pos_ = (in_pos_ + n) % cap_;
72 115209 : in_len_ -= n;
73 : }
74 : else
75 : {
76 : // preserve in_pos_ if there is
77 : // a prepared buffer
78 28714 : if(out_size_ != 0)
79 : {
80 1 : in_pos_ = (in_pos_ + in_len_) % cap_;
81 1 : in_len_ = 0;
82 : }
83 : else
84 : {
85 : // make prepare return a
86 : // bigger single buffer
87 28713 : in_pos_ = 0;
88 28713 : in_len_ = 0;
89 : }
90 : }
91 143923 : }
92 :
93 : } // detail
94 : } // http
95 : } // boost
|