// // Copyright (c) 2022 Seth Heeren (sgheeren 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_HTTP_IMPL_MESSAGE_GENERATOR_HPP #define BOOST_BEAST_HTTP_IMPL_MESSAGE_GENERATOR_HPP #include #include #include namespace boost { namespace beast { namespace http { template message_generator::message_generator( http::message&& m) : impl_(boost::make_unique< generator_impl>( std::move(m))) { } template struct message_generator::generator_impl : message_generator::impl_base { explicit generator_impl( http::message&& m) : m_(std::move(m)) , sr_(m_) { } bool is_done() override { return sr_.is_done(); } const_buffers_type prepare(error_code& ec) override { sr_.next(ec, visit{*this}); return current_; } void consume(std::size_t n) override { sr_.consume((std::min)(n, beast::buffer_bytes(current_))); } bool keep_alive() const noexcept override { return m_.keep_alive(); } private: static constexpr unsigned max_fixed_bufs = 12; http::message m_; http::serializer sr_; std::array bs_; const_buffers_type current_ = bs_; // subspan struct visit { generator_impl& self_; template void operator()(error_code&, ConstBufferSequence const& buffers) { auto& s = self_.bs_; auto& cur = self_.current_; auto it = net::buffer_sequence_begin(buffers); std::size_t n = std::distance(it, net::buffer_sequence_end(buffers)); n = (std::min)(s.size(), n); cur = { s.data(), n }; std::copy_n(it, n, cur.begin()); } }; }; } // namespace http } // namespace beast } // namespace boost #endif