Shrink serializer buffers using buffers_ref

This commit is contained in:
Vinnie Falco
2017-07-06 20:15:37 -07:00
parent bb0e86ac01
commit d750364d6f
3 changed files with 82 additions and 9 deletions

View File

@ -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
--------------------------------------------------------------------------------

View File

@ -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 <beast/core/type_traits.hpp>
namespace beast {
namespace detail {
// A very lightweight reference to a buffer sequence
template<class BufferSequence>
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<class BufferSequence>
buffers_ref<BufferSequence>
make_buffers_ref(BufferSequence const& buffers)
{
return buffers_ref<BufferSequence>(buffers);
}
} // detail
} // beast
#endif

View File

@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_IMPL_SERIALIZER_IPP
#define BEAST_HTTP_IMPL_SERIALIZER_IPP
#include <beast/core/detail/buffers_ref.hpp>
#include <beast/http/error.hpp>
#include <beast/http/status.hpp>
#include <beast/core/detail/config.hpp>
@ -53,6 +54,7 @@ serializer<isRequest, Body, Fields, ChunkDecorator>::
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<cb0_t>(v_));
visit(ec, make_buffers_ref(
boost::get<cb0_t>(v_)));
break;
go_header_only:
v_ = ch_t{frd_->get()};
s_ = do_header_only;
case do_header_only:
visit(ec, boost::get<ch_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch_t>(v_)));
break;
case do_body:
@ -124,7 +128,8 @@ next(error_code& ec, Visit&& visit)
}
case do_body + 2:
visit(ec, boost::get<cb1_t>(v_));
visit(ec, make_buffers_ref(
boost::get<cb1_t>(v_)));
break;
//----------------------------------------------------------------------
@ -198,14 +203,16 @@ next(error_code& ec, Visit&& visit)
}
case do_header_c:
visit(ec, boost::get<ch0_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch0_t>(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<ch_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch_t>(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<ch1_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch1_t>(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<ch2_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch2_t>(v_)));
break;
go_all_c:
s_ = do_all_c;
case do_all_c:
visit(ec, boost::get<ch3_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch3_t>(v_)));
break;
#endif
@ -311,7 +321,8 @@ next(error_code& ec, Visit&& visit)
BEAST_FALLTHROUGH;
case do_final_c + 1:
visit(ec, boost::get<ch4_t>(v_));
visit(ec, make_buffers_ref(
boost::get<ch4_t>(v_)));
break;
//----------------------------------------------------------------------