LCOV - code coverage report
Current view: top level - http_proto/impl - serializer.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 27 27 100.0 %
Date: 2023-02-21 17:23:31 Functions: 11 11 100.0 %

          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_IMPL_SERIALIZER_HPP
      11             : #define BOOST_HTTP_PROTO_IMPL_SERIALIZER_HPP
      12             : 
      13             : #include <boost/http_proto/detail/except.hpp>
      14             : #include <boost/buffers/iterators.hpp>
      15             : #include <iterator>
      16             : #include <new>
      17             : #include <utility>
      18             : 
      19             : namespace boost {
      20             : namespace http_proto {
      21             : 
      22             : class serializer::
      23             :     const_buffers_type
      24             : {
      25             :     std::size_t n_ = 0;
      26             :     buffers::const_buffer const* p_ = nullptr;
      27             : 
      28             :     friend class serializer;
      29             : 
      30          12 :     const_buffers_type(
      31             :         buffers::const_buffer const* p,
      32             :         std::size_t n) noexcept
      33          12 :         : n_(n)
      34          12 :         , p_(p)
      35             :     {
      36          12 :     }
      37             : 
      38             : public:
      39             :     using iterator = buffers::const_buffer const*;
      40             :     using const_iterator = iterator;
      41             :     using value_type = buffers::const_buffer;
      42             :     using reference = buffers::const_buffer;
      43             :     using const_reference = buffers::const_buffer;
      44             :     using size_type = std::size_t;
      45             :     using difference_type = std::ptrdiff_t;
      46             : 
      47             :     const_buffers_type() = default;
      48             :     const_buffers_type(
      49             :         const_buffers_type const&) = default;
      50             :     const_buffers_type& operator=(
      51             :         const_buffers_type const&) = default;
      52             : 
      53             :     iterator
      54          23 :     begin() const noexcept
      55             :     {
      56          23 :         return p_;
      57             :     }
      58             : 
      59             :     iterator
      60          23 :     end() const noexcept
      61             :     {
      62          23 :         return p_ + n_;
      63             :     }
      64             : };
      65             : 
      66             : //------------------------------------------------
      67             : 
      68             : template<
      69             :     class ConstBufferSequence,
      70             :     class>
      71             : void
      72           7 : serializer::
      73             : start(
      74             :     message_view_base const& m,
      75             :     ConstBufferSequence&& body)   
      76             : {
      77           7 :     start_init(m);
      78           7 :     auto const& bs =
      79             :         ws_.push(std::forward<
      80             :             ConstBufferSequence>(body));
      81           7 :     std::size_t n = std::distance(
      82             :         buffers::begin(bs),
      83             :         buffers::end(bs));
      84           7 :     buf_ = make_array(n);
      85           7 :     auto p = buf_.data();
      86          14 :     for(buffers::const_buffer b : bs)
      87           7 :         *p++ = b;
      88           7 :     start_buffers(m);
      89           7 : }
      90             : 
      91             : template<
      92             :     class Source,
      93             :     class>
      94             : auto
      95           6 : serializer::
      96             : start(
      97             :     message_view_base const& m,
      98             :     Source&& src0) ->
      99             :         typename std::decay<
     100             :             Source>::type&
     101             : {
     102           6 :     start_init(m);
     103           6 :     auto& src = ws_.push(
     104             :         std::forward<
     105             :             Source>(src0));
     106           6 :     start_source(
     107           6 :         m, std::addressof(src));
     108           6 :     return src;
     109             : }
     110             : 
     111             : //------------------------------------------------
     112             : 
     113             : inline
     114             : auto
     115          24 : serializer::
     116             : make_array(std::size_t n) ->
     117             :     detail::array_of_const_buffers 
     118             : {
     119             :     return {
     120             :         ws_.push_array(n,
     121          48 :         buffers::const_buffer{}),
     122          24 :         n };
     123             : }
     124             : 
     125             : } // http_proto
     126             : } // boost
     127             : 
     128             : #endif

Generated by: LCOV version 1.15