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-10 23:49:12 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 P0,
      70             :     class... Pn>
      71             : serializer::
      72             : serializer(
      73             :     std::size_t buffer_size,
      74             :     P0&& p0,
      75             :     Pn&&... pn)
      76             :     : serializer(buffer_size)
      77             : {
      78             :     apply_params(
      79             :         std::forward<P0>(p0),
      80             :         std::forward<Pn>(pn)...);
      81             : }
      82             : 
      83             : //------------------------------------------------
      84             : 
      85             : template<
      86             :     class ConstBufferSequence,
      87             :     class>
      88             : void
      89           7 : serializer::
      90             : start(
      91             :     message_view_base const& m,
      92             :     ConstBufferSequence&& body)   
      93             : {
      94           7 :     start_init(m);
      95           7 :     auto const& bs =
      96             :         ws_.push(std::forward<
      97             :             ConstBufferSequence>(body));
      98           7 :     std::size_t n = std::distance(
      99             :         buffers::begin(bs),
     100             :         buffers::end(bs));
     101           7 :     buf_ = make_array(n);
     102           7 :     auto p = buf_.data();
     103          14 :     for(buffers::const_buffer b : bs)
     104           7 :         *p++ = b;
     105           7 :     start_buffers(m);
     106           7 : }
     107             : 
     108             : template<
     109             :     class Source,
     110             :     class>
     111             : auto
     112           6 : serializer::
     113             : start(
     114             :     message_view_base const& m,
     115             :     Source&& src0) ->
     116             :         typename std::decay<
     117             :             Source>::type&
     118             : {
     119           6 :     start_init(m);
     120           6 :     auto& src = ws_.push(
     121             :         std::forward<
     122             :             Source>(src0));
     123           6 :     start_source(
     124           6 :         m, std::addressof(src));
     125           6 :     return src;
     126             : }
     127             : 
     128             : //------------------------------------------------
     129             : 
     130             : inline
     131             : auto
     132          24 : serializer::
     133             : make_array(std::size_t n) ->
     134             :     detail::array_of_const_buffers 
     135             : {
     136             :     return {
     137             :         ws_.push_array(n,
     138          48 :         buffers::const_buffer{}),
     139          24 :         n };
     140             : }
     141             : 
     142             : inline
     143             : void
     144             : serializer::
     145             : apply_params() noexcept
     146             : {
     147             : }
     148             : 
     149             : template<
     150             :     class P0,
     151             :     class... Pn>
     152             : void
     153             : serializer::
     154             : apply_params(
     155             :     P0&& p0,
     156             :     Pn&&... pn)
     157             : {
     158             :     // If you get an error here it means
     159             :     // you passed an unknown parameter type.
     160             :     apply_param(std::forward<P0>(p0));
     161             : 
     162             :     apply_params(
     163             :         std::forward<Pn>(pn)...);
     164             : }
     165             : 
     166             : } // http_proto
     167             : } // boost
     168             : 
     169             : #endif

Generated by: LCOV version 1.15