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