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 : // 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 : template<class ElasticBuffer>
25 : typename std::enable_if<
26 : ! detail::is_reference_wrapper<
27 : ElasticBuffer>::value &&
28 : ! is_sink<ElasticBuffer>::value>::type
29 11 : parser::
30 : set_body(
31 : ElasticBuffer&& eb)
32 : {
33 : // If this goes off it means you are trying
34 : // to pass by lvalue reference. Use std::ref
35 : // instead.
36 : static_assert(
37 : ! std::is_reference<ElasticBuffer>::value,
38 : "Use std::ref instead of pass-by-reference");
39 :
40 : // Check ElasticBuffer type requirements
41 : static_assert(
42 : buffers::is_dynamic_buffer<ElasticBuffer>::value,
43 : "Type requirements not met.");
44 :
45 : // body must not already be set
46 11 : if(is_body_set())
47 0 : detail::throw_logic_error();
48 :
49 : // headers must be complete
50 11 : if(! got_header())
51 0 : detail::throw_logic_error();
52 :
53 11 : auto& dyn = ws().emplace<
54 : buffers::any_dynamic_buffer_impl<typename
55 : std::decay<ElasticBuffer>::type,
56 11 : buffers_N>>(std::forward<ElasticBuffer>(eb));
57 :
58 11 : set_body_impl(dyn);
59 11 : }
60 :
61 : template<class ElasticBuffer>
62 : void
63 372 : parser::
64 : set_body(
65 : std::reference_wrapper<ElasticBuffer> eb)
66 : {
67 : // Check ElasticBuffer type requirements
68 : static_assert(
69 : buffers::is_dynamic_buffer<ElasticBuffer>::value,
70 : "Type requirements not met.");
71 :
72 : // body must not already be set
73 372 : if(is_body_set())
74 0 : detail::throw_logic_error();
75 :
76 : // headers must be complete
77 372 : if(! got_header())
78 0 : detail::throw_logic_error();
79 :
80 372 : auto& dyn = ws().emplace<
81 : buffers::any_dynamic_buffer_impl<typename
82 : std::decay<ElasticBuffer>::type&,
83 372 : buffers_N>>(eb);
84 :
85 372 : set_body_impl(dyn);
86 372 : }
87 :
88 : template<
89 : class Sink,
90 : class... Args,
91 : class>
92 : Sink&
93 372 : parser::
94 : set_body(Args&&... args)
95 : {
96 : // body must not already be set
97 372 : if(is_body_set())
98 0 : detail::throw_logic_error();
99 :
100 : // headers must be complete
101 372 : if(! got_header())
102 0 : detail::throw_logic_error();
103 :
104 372 : auto& s = ws().emplace<Sink>(
105 : std::forward<Args>(args)...);
106 :
107 372 : set_body_impl(s);
108 372 : return s;
109 : }
110 :
111 : } // http_proto
112 : } // boost
113 :
114 : #endif
|