Line data Source code
1 : //
2 : // Copyright (c) 2023 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_SINK_HPP
11 : #define BOOST_HTTP_PROTO_IMPL_SINK_HPP
12 :
13 : #include <boost/buffers/buffer.hpp>
14 : #include <boost/buffers/range.hpp>
15 : #include <boost/http_proto/detail/except.hpp>
16 : #include <boost/assert.hpp>
17 :
18 : namespace boost {
19 : namespace http_proto {
20 :
21 : inline
22 : auto
23 55330 : sink::
24 : results::
25 : operator+=(
26 : results const& rv) noexcept ->
27 : results&
28 : {
29 55330 : BOOST_ASSERT(! ec.failed());
30 55330 : ec = rv.ec;
31 55330 : bytes += rv.bytes;
32 55330 : return *this;
33 : }
34 :
35 : //------------------------------------------------
36 :
37 : template<class T>
38 : auto
39 18444 : sink::
40 : write_impl(
41 : T const& bs,
42 : bool more) ->
43 : results
44 : {
45 18444 : results rv;
46 18444 : constexpr int SmallArraySize = 16;
47 18444 : buffers::const_buffer tmp[SmallArraySize];
48 18444 : auto const tmp_end = tmp + SmallArraySize;
49 18444 : auto it = buffers::begin(bs);
50 18444 : auto const end_ = buffers::end(bs);
51 36884 : while(it != end_)
52 : {
53 18443 : auto p = tmp;
54 : do
55 : {
56 36890 : *p++ = *it++;
57 : }
58 : while(
59 36890 : p != tmp_end &&
60 : it != end_);
61 18443 : rv += on_write(
62 : true,
63 : boost::span<
64 : buffers::const_buffer const>(
65 18443 : tmp, p - tmp),
66 18443 : it != end_ || more);
67 18443 : if(rv.ec.failed())
68 3 : return rv;
69 : }
70 18441 : return rv;
71 : }
72 :
73 : } // http_proto
74 : } // boost
75 :
76 : #endif
|