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 55317 : sink::
24 : results::
25 : operator+=(
26 : results const& rv) noexcept ->
27 : results&
28 : {
29 55317 : BOOST_ASSERT(! ec.failed());
30 55317 : ec = rv.ec;
31 55317 : bytes += rv.bytes;
32 55317 : return *this;
33 : }
34 :
35 : //------------------------------------------------
36 :
37 : template<class T>
38 : auto
39 18436 : sink::
40 : write_impl(
41 : T const& bs,
42 : bool more) ->
43 : results
44 : {
45 18436 : results rv;
46 18436 : constexpr int SmallArraySize = 16;
47 18436 : buffers::const_buffer tmp[SmallArraySize];
48 18436 : auto const tmp_end = tmp + SmallArraySize;
49 18436 : auto it = buffers::begin(bs);
50 18436 : auto const end_ = buffers::end(bs);
51 36872 : while(it != end_)
52 : {
53 18436 : auto p = tmp;
54 : do
55 : {
56 36872 : *p++ = *it++;
57 : }
58 : while(
59 36872 : p != tmp_end &&
60 : it != end_);
61 18436 : rv += on_write(boost::span<
62 : buffers::const_buffer const>(
63 18436 : tmp, p - tmp),
64 18436 : it != end_ || more);
65 18436 : if(rv.ec.failed())
66 0 : return rv;
67 : }
68 18436 : return rv;
69 : }
70 :
71 : } // http_proto
72 : } // boost
73 :
74 : #endif
|