GCC Code Coverage Report


Directory: libs/http_proto/
File: boost/http_proto/impl/serializer.hpp
Date: 2024-03-22 16:56:24
Exec Total Coverage
Lines: 27 27 100.0%
Functions: 11 11 100.0%
Branches: 3 4 75.0%

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