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