diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7a312f..5b6ba677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Version 75: * Construct buffer_prefix_view in-place * Shrink serializer buffers using buffers_ref * Tidy up BEAST_NO_BIG_VARIANTS +* Shrink serializer buffers using buffers_ref -------------------------------------------------------------------------------- diff --git a/include/beast/core/detail/buffers_ref.hpp b/include/beast/core/detail/buffers_ref.hpp new file mode 100644 index 00000000..92fe9f53 --- /dev/null +++ b/include/beast/core/detail/buffers_ref.hpp @@ -0,0 +1,61 @@ +// +// Copyright (c) 2013-2017 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) +// + +#ifndef BEAST_DETAIL_BUFFERS_REF_HPP +#define BEAST_DETAIL_BUFFERS_REF_HPP + +#include + +namespace beast { +namespace detail { + +// A very lightweight reference to a buffer sequence +template +class buffers_ref +{ + BufferSequence const& buffers_; + +public: + using value_type = + typename BufferSequence::value_type; + + using const_iterator = + typename BufferSequence::const_iterator; + + buffers_ref(buffers_ref const&) = default; + + explicit + buffers_ref(BufferSequence const& buffers) + : buffers_(buffers) + { + } + + const_iterator + begin() const + { + return buffers_.begin(); + } + + const_iterator + end() const + { + return buffers_.end(); + } +}; + +// Return a reference to a buffer sequence +template +buffers_ref +make_buffers_ref(BufferSequence const& buffers) +{ + return buffers_ref(buffers); +} + +} // detail +} // beast + +#endif diff --git a/include/beast/http/impl/serializer.ipp b/include/beast/http/impl/serializer.ipp index d6984cfa..17618edc 100644 --- a/include/beast/http/impl/serializer.ipp +++ b/include/beast/http/impl/serializer.ipp @@ -8,6 +8,7 @@ #ifndef BEAST_HTTP_IMPL_SERIALIZER_IPP #define BEAST_HTTP_IMPL_SERIALIZER_IPP +#include #include #include #include @@ -53,6 +54,7 @@ serializer:: next(error_code& ec, Visit&& visit) { using boost::asio::buffer_size; + using beast::detail::make_buffers_ref; switch(s_) { case do_construct: @@ -90,14 +92,16 @@ next(error_code& ec, Visit&& visit) } case do_header: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; go_header_only: v_ = ch_t{frd_->get()}; s_ = do_header_only; case do_header_only: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; case do_body: @@ -124,7 +128,8 @@ next(error_code& ec, Visit&& visit) } case do_body + 2: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; //---------------------------------------------------------------------- @@ -198,14 +203,16 @@ next(error_code& ec, Visit&& visit) } case do_header_c: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; go_header_only_c: v_ = ch_t{frd_->get()}; s_ = do_header_only_c; case do_header_only_c: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; case do_body_c: @@ -276,20 +283,23 @@ next(error_code& ec, Visit&& visit) } case do_body_c + 2: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; #ifndef BEAST_NO_BIG_VARIANTS go_body_final_c: s_ = do_body_final_c; case do_body_final_c: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; go_all_c: s_ = do_all_c; case do_all_c: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; #endif @@ -311,7 +321,8 @@ next(error_code& ec, Visit&& visit) BEAST_FALLTHROUGH; case do_final_c + 1: - visit(ec, boost::get(v_)); + visit(ec, make_buffers_ref( + boost::get(v_))); break; //----------------------------------------------------------------------