mirror of
https://github.com/boostorg/beast.git
synced 2025-07-31 13:27:33 +02:00
Shrink serializer buffers using buffers_ref
This commit is contained in:
@@ -4,6 +4,7 @@ Version 75:
|
|||||||
* Construct buffer_prefix_view in-place
|
* Construct buffer_prefix_view in-place
|
||||||
* Shrink serializer buffers using buffers_ref
|
* Shrink serializer buffers using buffers_ref
|
||||||
* Tidy up BEAST_NO_BIG_VARIANTS
|
* Tidy up BEAST_NO_BIG_VARIANTS
|
||||||
|
* Shrink serializer buffers using buffers_ref
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
61
include/beast/core/detail/buffers_ref.hpp
Normal file
61
include/beast/core/detail/buffers_ref.hpp
Normal 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
|
@@ -8,6 +8,7 @@
|
|||||||
#ifndef BEAST_HTTP_IMPL_SERIALIZER_IPP
|
#ifndef BEAST_HTTP_IMPL_SERIALIZER_IPP
|
||||||
#define 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/error.hpp>
|
||||||
#include <beast/http/status.hpp>
|
#include <beast/http/status.hpp>
|
||||||
#include <beast/core/detail/config.hpp>
|
#include <beast/core/detail/config.hpp>
|
||||||
@@ -53,6 +54,7 @@ serializer<isRequest, Body, Fields, ChunkDecorator>::
|
|||||||
next(error_code& ec, Visit&& visit)
|
next(error_code& ec, Visit&& visit)
|
||||||
{
|
{
|
||||||
using boost::asio::buffer_size;
|
using boost::asio::buffer_size;
|
||||||
|
using beast::detail::make_buffers_ref;
|
||||||
switch(s_)
|
switch(s_)
|
||||||
{
|
{
|
||||||
case do_construct:
|
case do_construct:
|
||||||
@@ -90,14 +92,16 @@ next(error_code& ec, Visit&& visit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case do_header:
|
case do_header:
|
||||||
visit(ec, boost::get<cb0_t>(v_));
|
visit(ec, make_buffers_ref(
|
||||||
|
boost::get<cb0_t>(v_)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
go_header_only:
|
go_header_only:
|
||||||
v_ = ch_t{frd_->get()};
|
v_ = ch_t{frd_->get()};
|
||||||
s_ = do_header_only;
|
s_ = do_header_only;
|
||||||
case 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;
|
break;
|
||||||
|
|
||||||
case do_body:
|
case do_body:
|
||||||
@@ -124,7 +128,8 @@ next(error_code& ec, Visit&& visit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case do_body + 2:
|
case do_body + 2:
|
||||||
visit(ec, boost::get<cb1_t>(v_));
|
visit(ec, make_buffers_ref(
|
||||||
|
boost::get<cb1_t>(v_)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
@@ -198,14 +203,16 @@ next(error_code& ec, Visit&& visit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case do_header_c:
|
case do_header_c:
|
||||||
visit(ec, boost::get<ch0_t>(v_));
|
visit(ec, make_buffers_ref(
|
||||||
|
boost::get<ch0_t>(v_)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
go_header_only_c:
|
go_header_only_c:
|
||||||
v_ = ch_t{frd_->get()};
|
v_ = ch_t{frd_->get()};
|
||||||
s_ = do_header_only_c;
|
s_ = do_header_only_c;
|
||||||
case 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;
|
break;
|
||||||
|
|
||||||
case do_body_c:
|
case do_body_c:
|
||||||
@@ -276,20 +283,23 @@ next(error_code& ec, Visit&& visit)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case do_body_c + 2:
|
case do_body_c + 2:
|
||||||
visit(ec, boost::get<ch1_t>(v_));
|
visit(ec, make_buffers_ref(
|
||||||
|
boost::get<ch1_t>(v_)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifndef BEAST_NO_BIG_VARIANTS
|
#ifndef BEAST_NO_BIG_VARIANTS
|
||||||
go_body_final_c:
|
go_body_final_c:
|
||||||
s_ = do_body_final_c;
|
s_ = do_body_final_c;
|
||||||
case 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;
|
break;
|
||||||
|
|
||||||
go_all_c:
|
go_all_c:
|
||||||
s_ = do_all_c;
|
s_ = do_all_c;
|
||||||
case 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;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -311,7 +321,8 @@ next(error_code& ec, Visit&& visit)
|
|||||||
BEAST_FALLTHROUGH;
|
BEAST_FALLTHROUGH;
|
||||||
|
|
||||||
case do_final_c + 1:
|
case do_final_c + 1:
|
||||||
visit(ec, boost::get<ch4_t>(v_));
|
visit(ec, make_buffers_ref(
|
||||||
|
boost::get<ch4_t>(v_)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user