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