Use a struct instead of pair in flat_stream

No need to instantiate a pair and a custom struct has better member
names.

Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
This commit is contained in:
Damian Jarek
2018-12-03 22:30:45 +01:00
committed by Vinnie Falco
parent 35e4f321bc
commit 776462a8a4
4 changed files with 29 additions and 23 deletions

View File

@ -2,6 +2,7 @@ Version 197:
* Improvements to echo-op example * Improvements to echo-op example
* Crawler example clears the response before each read * Crawler example clears the response before each read
* Use a struct instead of a pair in flat_stream (experimental)
API Changes: API Changes:

View File

@ -12,7 +12,6 @@
#include <boost/asio/buffer.hpp> #include <boost/asio/buffer.hpp>
#include <cstdlib> #include <cstdlib>
#include <iterator>
namespace boost { namespace boost {
namespace beast { namespace beast {
@ -25,19 +24,25 @@ public:
// 16KB is the upper limit on reasonably sized HTTP messages. // 16KB is the upper limit on reasonably sized HTTP messages.
static std::size_t constexpr coalesce_limit = 16 * 1024; static std::size_t constexpr coalesce_limit = 16 * 1024;
struct coalesce_result
{
std::size_t size;
bool needs_coalescing;
};
// calculates the coalesce settings for a buffer sequence // calculates the coalesce settings for a buffer sequence
template<class BufferSequence> template<class BufferSequence>
static static
std::pair<std::size_t, bool> coalesce_result
coalesce(BufferSequence const& buffers, std::size_t limit) coalesce(BufferSequence const& buffers, std::size_t limit)
{ {
std::pair<std::size_t, bool> result{0, false}; coalesce_result result{0, false};
auto first = net::buffer_sequence_begin(buffers); auto first = net::buffer_sequence_begin(buffers);
auto last = net::buffer_sequence_end(buffers); auto last = net::buffer_sequence_end(buffers);
if(first != last) if(first != last)
{ {
result.first = net::buffer_size(*first); result.size = net::buffer_size(*first);
if(result.first < limit) if(result.size < limit)
{ {
auto it = first; auto it = first;
auto prev = first; auto prev = first;
@ -45,12 +50,12 @@ public:
{ {
auto const n = auto const n =
net::buffer_size(*it); net::buffer_size(*it);
if(result.first + n > limit) if(result.size + n > limit)
break; break;
result.first += n; result.size += n;
prev = it; prev = it;
} }
result.second = prev != first; result.needs_coalescing = prev != first;
} }
} }
return result; return result;

View File

@ -27,7 +27,7 @@ template<class ConstBufferSequence, class Handler>
class flat_stream<NextLayer>::write_op class flat_stream<NextLayer>::write_op
: public net::coroutine : public net::coroutine
{ {
using alloc_type = typename using alloc_type = typename
#if defined(BOOST_NO_CXX11_ALLOCATOR) #if defined(BOOST_NO_CXX11_ALLOCATOR)
net::associated_allocator_t<Handler>::template net::associated_allocator_t<Handler>::template
rebind<char>::other; rebind<char>::other;
@ -128,15 +128,15 @@ operator()(
BOOST_ASIO_CORO_YIELD BOOST_ASIO_CORO_YIELD
{ {
auto const result = coalesce(b_, coalesce_limit); auto const result = coalesce(b_, coalesce_limit);
if(result.second) if(result.needs_coalescing)
{ {
p_.get_deleter().size = result.first; p_.get_deleter().size = result.size;
p_.reset(p_.get_deleter().alloc.allocate( p_.reset(p_.get_deleter().alloc.allocate(
p_.get_deleter().size)); p_.get_deleter().size));
net::buffer_copy( net::buffer_copy(
net::buffer( net::buffer(
p_.get(), p_.get_deleter().size), p_.get(), p_.get_deleter().size),
b_, result.first); b_, result.size);
s_.stream_.async_write_some( s_.stream_.async_write_some(
net::buffer( net::buffer(
p_.get(), p_.get_deleter().size), p_.get(), p_.get_deleter().size),
@ -145,7 +145,7 @@ operator()(
else else
{ {
s_.stream_.async_write_some( s_.stream_.async_write_some(
boost::beast::buffers_prefix(result.first, b_), boost::beast::buffers_prefix(result.size, b_),
std::move(*this)); std::move(*this));
} }
} }
@ -223,15 +223,15 @@ write_some(ConstBufferSequence const& buffers)
ConstBufferSequence>::value, ConstBufferSequence>::value,
"ConstBufferSequence requirements not met"); "ConstBufferSequence requirements not met");
auto const result = coalesce(buffers, coalesce_limit); auto const result = coalesce(buffers, coalesce_limit);
if(result.second) if(result.needs_coalescing)
{ {
std::unique_ptr<char[]> p{new char[result.first]}; std::unique_ptr<char[]> p{new char[result.size]};
auto const b = net::buffer(p.get(), result.first); auto const b = net::buffer(p.get(), result.size);
net::buffer_copy(b, buffers); net::buffer_copy(b, buffers);
return stream_.write_some(b); return stream_.write_some(b);
} }
return stream_.write_some( return stream_.write_some(
boost::beast::buffers_prefix(result.first, buffers)); boost::beast::buffers_prefix(result.size, buffers));
} }
template<class NextLayer> template<class NextLayer>
@ -246,15 +246,15 @@ write_some(ConstBufferSequence const& buffers, error_code& ec)
ConstBufferSequence>::value, ConstBufferSequence>::value,
"ConstBufferSequence requirements not met"); "ConstBufferSequence requirements not met");
auto const result = coalesce(buffers, coalesce_limit); auto const result = coalesce(buffers, coalesce_limit);
if(result.second) if(result.needs_coalescing)
{ {
std::unique_ptr<char[]> p{new char[result.first]}; std::unique_ptr<char[]> p{new char[result.size]};
auto const b = net::buffer(p.get(), result.first); auto const b = net::buffer(p.get(), result.size);
net::buffer_copy(b, buffers); net::buffer_copy(b, buffers);
return stream_.write_some(b, ec); return stream_.write_some(b, ec);
} }
return stream_.write_some( return stream_.write_some(
boost::beast::buffers_prefix(result.first, buffers), ec); boost::beast::buffers_prefix(result.size, buffers), ec);
} }
template<class NextLayer> template<class NextLayer>

View File

@ -40,8 +40,8 @@ public:
v.emplace_back("", n); v.emplace_back("", n);
auto const result = auto const result =
boost::beast::detail::flat_stream_base::coalesce(v, limit); boost::beast::detail::flat_stream_base::coalesce(v, limit);
BEAST_EXPECT(result.first == count); BEAST_EXPECT(result.size == count);
BEAST_EXPECT(result.second == copy); BEAST_EXPECT(result.needs_coalescing == copy);
return result; return result;
}; };
check({}, 1, 0, false); check({}, 1, 0, false);