GCC Code Coverage Report


Directory: libs/http_proto/
File: boost/http_proto/impl/parser.hpp
Date: 2024-03-04 15:37:43
Exec Total Coverage
Lines: 16 20 80.0%
Functions: 2 2 100.0%
Branches: 6 12 50.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 // we need a pragma once for the circular includes required
11 // clangd's intellisense
12 #pragma once
13
14 #ifndef BOOST_HTTP_PROTO_IMPL_PARSER_HPP
15 #define BOOST_HTTP_PROTO_IMPL_PARSER_HPP
16
17 #include <boost/http_proto/parser.hpp>
18 #include <boost/http_proto/sink.hpp>
19 #include <boost/http_proto/detail/type_traits.hpp>
20
21 namespace boost {
22 namespace http_proto {
23
24 //------------------------------------------------
25
26 template<class ElasticBuffer>
27 typename std::enable_if<
28 ! detail::is_reference_wrapper<
29 ElasticBuffer>::value &&
30 ! is_sink<ElasticBuffer>::value>::type
31 11 parser::
32 set_body(
33 ElasticBuffer&& eb)
34 {
35 // If this goes off it means you are trying
36 // to pass by lvalue reference. Use std::ref
37 // instead.
38 static_assert(
39 ! std::is_reference<ElasticBuffer>::value,
40 "Use std::ref instead of pass-by-reference");
41
42 // Check ElasticBuffer type requirements
43 static_assert(
44 buffers::is_dynamic_buffer<ElasticBuffer>::value,
45 "Type requirements not met.");
46
47 // body must not be set already
48
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 if(how_ != how::in_place)
49 detail::throw_logic_error();
50
51 // headers must be complete
52
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
11 if(! got_header())
53 detail::throw_logic_error();
54
55
1/2
✓ Branch 3 taken 11 times.
✗ Branch 4 not taken.
11 auto& dyn = ws_.push(
56 buffers::any_dynamic_buffer_impl<typename
57 std::decay<ElasticBuffer>::type,
58 buffers_N>(std::forward<
59 ElasticBuffer>(eb)));
60 11 eb_ = &dyn;
61 11 how_ = how::elastic;
62 11 on_set_body();
63 11 }
64
65 template<class ElasticBuffer>
66 void
67 288 parser::
68 set_body(
69 std::reference_wrapper<ElasticBuffer> eb)
70 {
71 // Check ElasticBuffer type requirements
72 static_assert(
73 buffers::is_dynamic_buffer<ElasticBuffer>::value,
74 "Type requirements not met.");
75
76 // body must not be set already
77
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 288 times.
288 if(how_ != how::in_place)
78 detail::throw_logic_error();
79
80 // headers must be complete
81
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
288 if(! got_header())
82 detail::throw_logic_error();
83
84
1/2
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
288 auto& dyn = ws_.push(
85 buffers::any_dynamic_buffer_impl<typename
86 std::decay<ElasticBuffer>::type&,
87 buffers_N>(eb));
88 288 eb_ = &dyn;
89 288 how_ = how::elastic;
90 288 on_set_body();
91 288 }
92
93 //------------------------------------------------
94
95 template<class Sink>
96 typename std::enable_if<
97 is_sink<Sink>::value,
98 typename std::decay<Sink>::type
99 >::type&
100 parser::
101 set_body(
102 Sink&& sink)
103 {
104 // body must not be set already
105 if(how_ != how::in_place)
106 detail::throw_logic_error();
107
108 // headers must be complete
109 if(! got_header())
110 detail::throw_logic_error();
111
112 auto& s = ws_.push(
113 std::forward<Sink>(sink));
114 sink_ = &s;
115 how_ = how::sink;
116 on_set_body();
117 return s;
118 }
119
120 } // http_proto
121 } // boost
122
123 #endif
124