Line data Source code
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/assert.hpp> 15 : 16 : namespace boost { 17 : namespace http_proto { 18 : namespace detail { 19 : 20 0 : circular_buffer:: 21 : circular_buffer( 22 : void* base, 23 0 : std::size_t capacity) noexcept 24 : : base_(reinterpret_cast< 25 : unsigned char*>(base)) 26 0 : , cap_(capacity) 27 : { 28 0 : } 29 : 30 : bool 31 0 : circular_buffer:: 32 : empty() const noexcept 33 : { 34 0 : return in_len_ == 0; 35 : } 36 : 37 : auto 38 0 : circular_buffer:: 39 : data() const noexcept -> 40 : buffers 41 : { 42 0 : if(in_pos_ + in_len_ <= cap_) 43 : return { 44 : mutable_buffer{ 45 0 : base_ + in_pos_, in_len_ }, 46 0 : mutable_buffer{ base_, 0} }; 47 : return { 48 : mutable_buffer{ 49 0 : base_ + in_pos_, cap_ - in_pos_}, 50 : mutable_buffer{ 51 0 : base_, in_len_- (cap_ - in_pos_)}}; 52 : } 53 : 54 : auto 55 0 : circular_buffer:: 56 : prepare() noexcept -> 57 : buffers 58 : { 59 0 : auto const n = cap_ - in_len_; 60 0 : auto const out_pos = 61 0 : (in_pos_ + in_len_) % cap_; 62 0 : if(out_pos + n <= cap_) 63 : return { 64 : mutable_buffer{ 65 0 : base_ + out_pos, n}, 66 0 : mutable_buffer{base_, 67 0 : n - (cap_ - out_pos)} }; 68 : return { 69 : mutable_buffer{ 70 0 : base_ + out_pos, cap_ - out_pos}, 71 : mutable_buffer{ 72 0 : base_, n - (cap_ - out_pos)}}; 73 : } 74 : 75 : void 76 0 : circular_buffer:: 77 : commit(std::size_t n) noexcept 78 : { 79 0 : BOOST_ASSERT(n <= cap_ - in_len_); 80 0 : in_len_ += n; 81 0 : } 82 : 83 : void 84 0 : circular_buffer:: 85 : consume(std::size_t n) noexcept 86 : { 87 0 : if(n < in_len_) 88 : { 89 0 : in_pos_ = (in_pos_ + n) % cap_; 90 0 : in_len_ -= n; 91 : } 92 : else 93 : { 94 : // make prepare return a 95 : // bigger single buffer 96 0 : in_pos_ = 0; 97 0 : in_len_ = 0; 98 : } 99 0 : } 100 : 101 : } // detail 102 : } // http_proto 103 : } // boost 104 : 105 : #endif