mirror of
https://github.com/boostorg/beast.git
synced 2025-07-30 12:57:31 +02:00
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:
committed by
Vinnie Falco
parent
35e4f321bc
commit
776462a8a4
@ -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:
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user