Dynamic buffers improvements:

fix #1305

Applies to:

    flat_buffer
    flat_static_buffer
    multi_buffer
    static_buffer

Changes:

* Revised all javadocs
* Move construction does not invalidate in some cases
* non-const data() returns a mutable buffer sequence
* Add cdata() to also return constant readable bytes
* Eligible member functions are declared noexcept
This commit is contained in:
Vinnie Falco
2018-11-30 13:46:56 -08:00
parent eb588ff82c
commit 29cf6ce61f
15 changed files with 1165 additions and 657 deletions
+50 -4
View File
@@ -17,17 +17,63 @@
#include <boost/beast/core/string.hpp>
#include <boost/beast/test/test_allocator.hpp>
#include <boost/beast/_experimental/unit_test/suite.hpp>
#include <boost/asio/buffers_iterator.hpp>
#include <algorithm>
#include <cctype>
namespace boost {
namespace beast {
BOOST_STATIC_ASSERT(
boost::asio::is_dynamic_buffer<flat_buffer>::value);
class flat_buffer_test : public beast::unit_test::suite
{
public:
BOOST_STATIC_ASSERT(
boost::asio::is_dynamic_buffer<
flat_buffer>::value);
BOOST_STATIC_ASSERT(
boost::asio::is_const_buffer_sequence<
flat_buffer::const_buffers_type>::value);
BOOST_STATIC_ASSERT(
boost::asio::is_mutable_buffer_sequence<
flat_buffer::mutable_data_type>::value);
BOOST_STATIC_ASSERT(
boost::asio::is_mutable_buffer_sequence<
flat_buffer::mutable_buffers_type>::value);
BOOST_STATIC_ASSERT(std::is_convertible<
flat_buffer::mutable_data_type,
flat_buffer::const_buffers_type>::value);
template<class DynamicBuffer>
void
testMutableData()
{
DynamicBuffer b;
DynamicBuffer const& cb = b;
ostream(b) << "Hello";
BOOST_STATIC_ASSERT(
boost::asio::is_const_buffer_sequence<
decltype(cb.data())>::value &&
! boost::asio::is_mutable_buffer_sequence<
decltype(cb.data())>::value);
BOOST_STATIC_ASSERT(
boost::asio::is_const_buffer_sequence<
decltype(cb.cdata())>::value &&
! boost::asio::is_mutable_buffer_sequence<
decltype(cb.cdata())>::value);
BOOST_STATIC_ASSERT(
boost::asio::is_mutable_buffer_sequence<
decltype(b.data())>::value);
std::for_each(
boost::asio::buffers_iterator<decltype(b.data())>::begin(b.data()),
boost::asio::buffers_iterator<decltype(b.data())>::end(b.data()),
[](char& c)
{
c = static_cast<char>(std::toupper(c));
});
BEAST_EXPECT(buffers_to_string(b.data()) == "HELLO");
BEAST_EXPECT(buffers_to_string(b.cdata()) == "HELLO");
}
void
testBuffer()
{
@@ -338,7 +384,6 @@ public:
BEAST_EXPECT(b.capacity() >= 125);
b.shrink_to_fit();
BEAST_EXPECT(b.capacity() == b.size());
}
}
@@ -346,6 +391,7 @@ public:
run() override
{
testBuffer();
testMutableData<flat_buffer>();
}
};