LCOV - code coverage report
Current view: top level - libs/buffers/src/circular_buffer.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 36 36
Test Date: 2024-07-24 21:34:17 Functions: 100.0 % 4 4

            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/buffers
       8              : //
       9              : 
      10              : #include <boost/buffers/circular_buffer.hpp>
      11              : #include <boost/buffers/type_traits.hpp>
      12              : #include <boost/buffers/detail/except.hpp>
      13              : #include <boost/assert.hpp>
      14              : #include <boost/static_assert.hpp>
      15              : 
      16              : namespace boost {
      17              : namespace buffers {
      18              : 
      19              : BOOST_STATIC_ASSERT(
      20              :     is_dynamic_buffer<
      21              :         circular_buffer>::value);
      22              : 
      23              : auto
      24        35378 : circular_buffer::
      25              : data() const noexcept ->
      26              :     const_buffers_type
      27              : {
      28        35378 :     if(in_pos_ + in_len_ <= cap_)
      29              :         return {
      30        39788 :             const_buffer{
      31        19894 :                 base_ + in_pos_, in_len_ },
      32        19894 :             const_buffer{ base_, 0} };
      33              :     return {
      34        30968 :         const_buffer{
      35        15484 :             base_ + in_pos_, cap_ - in_pos_},
      36        15484 :         const_buffer{
      37        15484 :             base_, in_len_- (cap_ - in_pos_)}};
      38              : }
      39              : 
      40              : auto
      41        23586 : circular_buffer::
      42              : prepare(std::size_t n) ->
      43              :     mutable_buffers_type
      44              : {
      45              :     // Buffer is too small for n
      46        23586 :     if(n > cap_ - in_len_)
      47            1 :         detail::throw_length_error();
      48              : 
      49        23585 :     out_size_ = n;
      50        23585 :     auto const pos = (
      51        23585 :         in_pos_ + in_len_) % cap_;
      52        23585 :     if(pos + n <= cap_)
      53              :         return {
      54        35522 :             mutable_buffer{
      55        17761 :                 base_ + pos, n},
      56        17761 :             mutable_buffer{base_, 0}};
      57              :     return {
      58        11648 :         mutable_buffer{
      59         5824 :             base_ + pos, cap_ - pos},
      60         5824 :         mutable_buffer{
      61         5824 :             base_, n - (cap_ - pos)}};
      62              : }
      63              : 
      64              : void
      65        23585 : circular_buffer::
      66              : commit(
      67              :     std::size_t n) noexcept
      68              : {
      69        23585 :     if(n < out_size_)
      70            1 :         in_len_ += n;
      71              :     else
      72        23584 :         in_len_ += out_size_;
      73        23585 :     out_size_ = 0;
      74        23585 : }
      75              : 
      76              : void
      77        22592 : circular_buffer::
      78              : consume(
      79              :     std::size_t n) noexcept
      80              : {
      81        22592 :     if(n < in_len_)
      82              :     {
      83        21600 :         in_pos_ = (in_pos_ + n) % cap_;
      84        21600 :         in_len_ -= n;
      85              :     }
      86              :     else
      87              :     {
      88              :         // make prepare return a
      89              :         // bigger single buffer
      90          992 :         in_pos_ = 0;
      91          992 :         in_len_ = 0;
      92              :     }
      93        22592 : }
      94              : 
      95              : } // buffers
      96              : } // boost
        

Generated by: LCOV version 2.1