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/buffers
8 : //
9 :
10 : #ifndef BOOST_BUFFERS_IMPL_SOURCE_HPP
11 : #define BOOST_BUFFERS_IMPL_SOURCE_HPP
12 :
13 : #include <boost/http_proto/detail/except.hpp>
14 : #include <boost/assert.hpp>
15 :
16 : namespace boost {
17 : namespace http_proto {
18 :
19 : inline
20 : auto
21 2947 : source::
22 : results::
23 : operator+=(
24 : results const& rv) noexcept ->
25 : results&
26 : {
27 2947 : BOOST_ASSERT(! ec.failed());
28 2947 : BOOST_ASSERT(! finished);
29 2947 : ec = rv.ec;
30 2947 : bytes += rv.bytes;
31 2947 : finished = rv.finished;
32 2947 : return *this;
33 : }
34 :
35 : //------------------------------------------------
36 :
37 : template<class T>
38 : auto
39 987 : source::
40 : read_impl(
41 : T const& bs) ->
42 : results
43 : {
44 987 : results rv;
45 987 : constexpr int SmallArraySize = 16;
46 987 : buffers::mutable_buffer tmp[SmallArraySize];
47 987 : auto const tmp_end =
48 : tmp + SmallArraySize;
49 987 : auto it = buffers::begin(bs);
50 987 : auto const end_ = buffers::end(bs);
51 1951 : while(it != end_)
52 : {
53 987 : auto p = tmp;
54 : do
55 : {
56 1974 : *p++ = *it++;
57 : }
58 : while(
59 1974 : p != tmp_end &&
60 : it != end_);
61 987 : rv += on_read(boost::span<
62 : buffers::mutable_buffer const>(
63 987 : tmp, p - tmp));
64 987 : if(rv.ec.failed())
65 1 : return rv;
66 986 : if(rv.finished)
67 22 : break;
68 : }
69 986 : return rv;
70 : }
71 :
72 : } // http_proto
73 : } // boost
74 :
75 : #endif
|