96.97% Lines (32/33) 100.00% Functions (4/4)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com) 2   // Copyright (c) 2023 Vinnie Falco (vinnie.falco@gmail.com)
3   // 3   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 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) 5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 6   //
7   // Official repository: https://github.com/cppalliance/http 7   // Official repository: https://github.com/cppalliance/http
8   // 8   //
9   9  
10   #include <boost/http/detail/circular_buffer.hpp> 10   #include <boost/http/detail/circular_buffer.hpp>
11   #include <boost/http/detail/except.hpp> 11   #include <boost/http/detail/except.hpp>
12   12  
13   namespace boost { 13   namespace boost {
14   namespace http { 14   namespace http {
15   namespace detail { 15   namespace detail {
16   16  
17   auto 17   auto
HITCBC 18   169490 circular_buffer:: 18   169700 circular_buffer::
19   data() const noexcept -> 19   data() const noexcept ->
20   const_buffers_type 20   const_buffers_type
21   { 21   {
HITCBC 22   169490 if(in_pos_ + in_len_ <= cap_) 22   169700 if(in_pos_ + in_len_ <= cap_)
23   return {{ 23   return {{
HITCBC 24   153209 capy::const_buffer{ base_ + in_pos_, in_len_ }, 24   153419 capy::const_buffer{ base_ + in_pos_, in_len_ },
HITCBC 25   153209 capy::const_buffer{ base_, 0} }}; 25   153419 capy::const_buffer{ base_, 0} }};
26   return {{ 26   return {{
HITCBC 27   16281 capy::const_buffer{ base_ + in_pos_, cap_ - in_pos_}, 27   16281 capy::const_buffer{ base_ + in_pos_, cap_ - in_pos_},
HITCBC 28   16281 capy::const_buffer{ base_, in_len_- (cap_ - in_pos_)} }}; 28   16281 capy::const_buffer{ base_, in_len_- (cap_ - in_pos_)} }};
29   } 29   }
30   30  
31   auto 31   auto
HITCBC 32   89946 circular_buffer:: 32   90154 circular_buffer::
33   prepare(std::size_t n) -> 33   prepare(std::size_t n) ->
34   mutable_buffers_type 34   mutable_buffers_type
35   { 35   {
36   // Buffer is too small for n 36   // Buffer is too small for n
HITCBC 37   89946 if(n > cap_ - in_len_) 37   90154 if(n > cap_ - in_len_)
MISUBC 38   detail::throw_length_error(); 38   detail::throw_length_error();
39   39  
HITCBC 40   89946 out_size_ = n; 40   90154 out_size_ = n;
HITCBC 41   89946 auto const pos = ( 41   90154 auto const pos = (
HITCBC 42   89946 in_pos_ + in_len_) % cap_; 42   90154 in_pos_ + in_len_) % cap_;
HITCBC 43   89946 if(pos + n <= cap_) 43   90154 if(pos + n <= cap_)
44   return {{ 44   return {{
HITCBC 45   53870 capy::mutable_buffer{ base_ + pos, n }, 45   54078 capy::mutable_buffer{ base_ + pos, n },
HITCBC 46   53870 capy::mutable_buffer{ base_, 0 } }}; 46   54078 capy::mutable_buffer{ base_, 0 } }};
47   return {{ 47   return {{
HITCBC 48   36076 capy::mutable_buffer{ base_ + pos, cap_ - pos }, 48   36076 capy::mutable_buffer{ base_ + pos, cap_ - pos },
HITCBC 49   36076 capy::mutable_buffer{ base_, n - (cap_ - pos) } }}; 49   36076 capy::mutable_buffer{ base_, n - (cap_ - pos) } }};
50   } 50   }
51   51  
52   void 52   void
HITCBC 53   89644 circular_buffer:: 53   89826 circular_buffer::
54   commit( 54   commit(
55   std::size_t n) noexcept 55   std::size_t n) noexcept
56   { 56   {
HITCBC 57   89644 if(n < out_size_) 57   89826 if(n < out_size_)
HITCBC 58   89367 in_len_ += n; 58   89549 in_len_ += n;
59   else 59   else
HITCBC 60   277 in_len_ += out_size_; 60   277 in_len_ += out_size_;
HITCBC 61   89644 out_size_ = 0; 61   89826 out_size_ = 0;
HITCBC 62   89644 } 62   89826 }
63   63  
64   void 64   void
HITCBC 65   143741 circular_buffer:: 65   143923 circular_buffer::
66   consume( 66   consume(
67   std::size_t n) noexcept 67   std::size_t n) noexcept
68   { 68   {
HITCBC 69   143741 if(n < in_len_) 69   143923 if(n < in_len_)
70   { 70   {
HITCBC 71   115209 in_pos_ = (in_pos_ + n) % cap_; 71   115209 in_pos_ = (in_pos_ + n) % cap_;
HITCBC 72   115209 in_len_ -= n; 72   115209 in_len_ -= n;
73   } 73   }
74   else 74   else
75   { 75   {
76   // preserve in_pos_ if there is 76   // preserve in_pos_ if there is
77   // a prepared buffer 77   // a prepared buffer
HITCBC 78   28532 if(out_size_ != 0) 78   28714 if(out_size_ != 0)
79   { 79   {
HITCBC 80   1 in_pos_ = (in_pos_ + in_len_) % cap_; 80   1 in_pos_ = (in_pos_ + in_len_) % cap_;
HITCBC 81   1 in_len_ = 0; 81   1 in_len_ = 0;
82   } 82   }
83   else 83   else
84   { 84   {
85   // make prepare return a 85   // make prepare return a
86   // bigger single buffer 86   // bigger single buffer
HITCBC 87   28531 in_pos_ = 0; 87   28713 in_pos_ = 0;
HITCBC 88   28531 in_len_ = 0; 88   28713 in_len_ = 0;
89   } 89   }
90   } 90   }
HITCBC 91   143741 } 91   143923 }
92   92  
93   } // detail 93   } // detail
94   } // http 94   } // http
95   } // boost 95   } // boost