// // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Official repository: https://github.com/boostorg/beast // #ifndef BOOST_BEAST_CORE_DETAIL_FLAT_STREAM_HPP #define BOOST_BEAST_CORE_DETAIL_FLAT_STREAM_HPP #include #include #include namespace boost { namespace beast { namespace detail { class flat_stream_base { public: // Largest buffer size we will flatten. // 16KB is the upper limit on reasonably sized HTTP messages. static std::size_t constexpr max_size = 16 * 1024; // Largest stack we will use to flatten static std::size_t constexpr max_stack = 8 * 1024; struct flatten_result { std::size_t size; bool flatten; }; // calculates the flatten settings for a buffer sequence template static flatten_result flatten( BufferSequence const& buffers, std::size_t limit) { flatten_result result{0, false}; auto first = net::buffer_sequence_begin(buffers); auto last = net::buffer_sequence_end(buffers); if(first != last) { result.size = buffer_bytes(*first); if(result.size < limit) { auto it = first; auto prev = first; while(++it != last) { auto const n = buffer_bytes(*it); if(result.size + n > limit) break; result.size += n; prev = it; } result.flatten = prev != first; } } return result; } }; } // detail } // beast } // boost #endif