Refactor buffers_adaptor

This commit is contained in:
Richard Hodges
2020-02-29 10:43:00 -08:00
committed by Vinnie Falco
parent eebf5773ed
commit 69ef525d5c
5 changed files with 474 additions and 282 deletions
+77
View File
@@ -24,6 +24,33 @@
namespace boost {
namespace beast {
struct buffers_adaptor_test_hook
{
template<class MutableBufferSequence>
static
auto
make_subrange(
buffers_adaptor <MutableBufferSequence> &adaptor,
std::size_t pos = 0,
std::size_t n = (std::numeric_limits<std::size_t>::max)())
-> typename buffers_adaptor<MutableBufferSequence>::mutable_buffers_type
{
return adaptor.make_subrange(pos, n);
}
template<class MutableBufferSequence>
static
auto
make_subrange(
buffers_adaptor<MutableBufferSequence> const& adaptor,
std::size_t pos = 0,
std::size_t n = (std::numeric_limits<std::size_t>::max)())
-> typename buffers_adaptor<MutableBufferSequence>::const_buffers_type
{
return adaptor.make_subrange(pos, n);
}
};
class buffers_adaptor_test : public unit_test::suite
{
public:
@@ -85,6 +112,54 @@ public:
read_size(ba, 1024);
}
template<bool isMutable>
void
testSubrange()
{
auto exemplar = std::string("the quick brown fox jumps over the lazy dog");
auto iterate_test = [&](
std::size_t a,
std::size_t b,
std::size_t c)
{
static const auto func = "iterate_test";
auto buffers = std::vector<net::mutable_buffer>();
if (a)
buffers.push_back(net::buffer(&exemplar[0], a));
if (b - a)
buffers.push_back(net::buffer(&exemplar[a], (b - a)));
if (c - b)
buffers.push_back(net::buffer(&exemplar[b], (c - b)));
auto adapter = buffers_adaptor<std::vector<net::mutable_buffer>>(buffers);
using value_type =
typename std::conditional<
isMutable,
net::mutable_buffer,
net::const_buffer>::type;
using maybe_mutable =
typename std::conditional<
isMutable,
buffers_adaptor<std::vector<net::mutable_buffer>>&,
buffers_adaptor<std::vector<net::mutable_buffer>> const&>::type;
auto sub = buffers_adaptor_test_hook::make_subrange(static_cast<maybe_mutable>(adapter));
BEAST_EXPECTS(typeid(typename decltype(sub)::value_type) == typeid(value_type), func);
BEAST_EXPECT(buffers_to_string(sub) == exemplar.substr(0, c));
};
iterate_test(0, 0, 1);
for (std::size_t a = 0; a <= exemplar.size(); ++a)
for (std::size_t b = a; b <= exemplar.size(); ++b)
for (std::size_t c = b; c <= exemplar.size(); ++c)
iterate_test(a, b, c);
}
void
run() override
{
@@ -95,6 +170,8 @@ public:
testBuffersAdapter();
testCommit();
#endif
testSubrange<true>();
testSubrange<false>();
}
};