LCOV - code coverage report
Current view: top level - boost/buffers/const_buffer.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 35 35
Test Date: 2024-07-24 21:34:17 Functions: 100.0 % 10 10

            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              : #ifndef BOOST_BUFFERS_CONST_BUFFER_HPP
      11              : #define BOOST_BUFFERS_CONST_BUFFER_HPP
      12              : 
      13              : #include <boost/buffers/detail/config.hpp>
      14              : #include <boost/buffers/mutable_buffer.hpp>
      15              : 
      16              : namespace boost {
      17              : namespace buffers {
      18              : 
      19              : /** Holds a buffer that cannot be modified.
      20              : */
      21              : class const_buffer
      22              : {
      23              :     unsigned char const* p_ = nullptr;
      24              :     std::size_t n_ = 0;
      25              : 
      26              : public:
      27              :     /** Constructor.
      28              :     */
      29       139809 :     const_buffer() = default;
      30              : 
      31              :     /** Constructor.
      32              :     */
      33       690360 :     const_buffer(
      34              :         void const* data,
      35              :         std::size_t size) noexcept
      36       690360 :         : p_(static_cast<
      37              :             unsigned char const*>(data))
      38       690360 :         , n_(size)
      39              :     {
      40       690360 :     }
      41              : 
      42              :     /** Constructor.
      43              :     */
      44              :     const_buffer(
      45              :         const_buffer const&) = default;
      46              : 
      47              :     /** Constructor.
      48              :     */
      49         9165 :     const_buffer(
      50              :         mutable_buffer const& b) noexcept
      51        18330 :         : p_(static_cast<
      52         9165 :             unsigned char const*>(b.data()))
      53         9165 :         , n_(b.size())
      54              :     {
      55         9165 :     }
      56              : 
      57              :     /** Assignment.
      58              :     */
      59              :     const_buffer& operator=(
      60              :         const_buffer const&) = default;
      61              : 
      62              :     // conversion to boost::asio::const_buffer
      63              :     template<
      64              :         class T
      65              :         , class = typename std::enable_if<
      66              :             std::is_constructible<T,
      67              :                 void const*, std::size_t>::value &&
      68              :             ! std::is_same<T, mutable_buffer>::value &&
      69              :             ! std::is_same<T, const_buffer>::value
      70              :         >::type
      71              :     >
      72              :     operator T() const noexcept
      73              :     {
      74              :         return T{ data(), size() };
      75              :     }
      76              : 
      77              :     void const*
      78      1388148 :     data() const noexcept
      79              :     {
      80      1388148 :         return p_;
      81              :     }
      82              : 
      83              :     std::size_t
      84      5324384 :     size() const noexcept
      85              :     {
      86      5324384 :         return n_;
      87              :     }
      88              : 
      89              :     /** Remove a prefix from the buffer.
      90              :     */
      91              :     const_buffer&
      92       950181 :     operator+=(std::size_t n) noexcept
      93              :     {
      94       950181 :         if(n >= n_)
      95              :         {
      96        26302 :             p_ = p_ + n_;
      97        26302 :             n_ = 0;
      98        26302 :             return *this;
      99              :         }
     100       923879 :         p_ = p_ + n;
     101       923879 :         n_ -= n;
     102       923879 :         return *this;
     103              :     }
     104              : 
     105              :     /** Return the buffer with a prefix removed.
     106              :     */
     107              :     friend
     108              :     const_buffer
     109       950178 :     operator+(
     110              :         const_buffer b,
     111              :         std::size_t n) noexcept
     112              :     {
     113       950178 :         return b += n;
     114              :     }
     115              : 
     116              :     /** Return the buffer with a prefix removed.
     117              :     */
     118              :     friend
     119              :     const_buffer
     120            1 :     operator+(
     121              :         std::size_t n,
     122              :         const_buffer b) noexcept
     123              :     {
     124            1 :         return b += n;
     125              :     }
     126              : 
     127              :     friend
     128              :     const_buffer
     129       246621 :     tag_invoke(
     130              :         prefix_tag const&,
     131              :         const_buffer const& b,
     132              :         std::size_t n) noexcept
     133              :     {
     134       246621 :         if(n < b.size())
     135        81945 :             return { b.data(), n };
     136       164676 :         return b;
     137              :     }
     138              : 
     139              :     friend
     140              :     const_buffer
     141       279261 :     tag_invoke(
     142              :         suffix_tag const&,
     143              :         const_buffer const& b,
     144              :         std::size_t n) noexcept
     145              :     {
     146       279261 :         auto const n0 = b.size();
     147       279261 :         if(n < n0)
     148       135583 :             return { b.p_ + (n0 - n), n };
     149       143678 :         return b;
     150              :     }
     151              : };
     152              : 
     153              : } // buffers
     154              : } // boost
     155              : 
     156              : #endif
        

Generated by: LCOV version 2.1