diff --git a/CHANGELOG.md b/CHANGELOG.md index a55e5fb4..4994b411 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Version 200 * Tidy up msvc-14 workaround in multi_buffer * buffers_cat fixes and coverage * Refactor buffers_adaptor +* Refactor buffers_range API Changes: diff --git a/include/boost/beast/core/detail/buffers_range.hpp b/include/boost/beast/core/detail/buffers_range.hpp index 3521f53e..3ee56fbe 100644 --- a/include/boost/beast/core/detail/buffers_range.hpp +++ b/include/boost/beast/core/detail/buffers_range.hpp @@ -46,9 +46,13 @@ public: buffer_sequence_iterator::type; iter_type it_; + buffers_range_adaptor const* b_ = nullptr; - const_iterator(iter_type const& it) + const_iterator( + buffers_range_adaptor const& b, + iter_type const& it) : it_(it) + , b_(&b) { } @@ -60,17 +64,19 @@ public: using difference_type = std::ptrdiff_t; using iterator_category = std::bidirectional_iterator_tag; - + + const_iterator() = default; + bool operator==(const_iterator const& other) const { - return it_ == other.it_; + return b_ == other.b_ && it_ == other.it_; } bool operator!=(const_iterator const& other) const { - return ! (*this == other); + return !(*this == other); } reference @@ -97,7 +103,6 @@ public: return temp; } - // deprecated const_iterator& operator--() { @@ -105,7 +110,6 @@ public: return *this; } - // deprecated const_iterator operator--(int) { @@ -121,16 +125,21 @@ public: { } + buffers_range_adaptor( + buffers_range_adaptor const&) = default; + buffers_range_adaptor& operator=( + buffers_range_adaptor const&) = default; + const_iterator begin() const noexcept { - return net::buffer_sequence_begin(b_); + return {*this, net::buffer_sequence_begin(b_)}; } const_iterator end() const noexcept { - return net::buffer_sequence_end(b_); + return {*this, net::buffer_sequence_end(b_)}; } }; diff --git a/test/beast/core/buffers_range.cpp b/test/beast/core/buffers_range.cpp index 4c895506..d0e62ac8 100644 --- a/test/beast/core/buffers_range.cpp +++ b/test/beast/core/buffers_range.cpp @@ -9,3 +9,46 @@ // Test that header file is self-contained. #include + +#include "buffer_test.hpp" + +#include + +namespace boost { +namespace beast { + +class buffers_range_test : public beast::unit_test::suite +{ +public: + BOOST_STATIC_ASSERT( + net::is_mutable_buffer_sequence< + decltype(beast::buffers_range( + std::declval()))>::value); + + void + testBufferSequence() + { + { + string_view s = "Hello, world!"; + test_buffer_sequence(*this, buffers_range( + net::const_buffer{s.data(), s.size()})); + } + { + char buf[13]; + test_buffer_sequence(*this, + buffers_range(net::mutable_buffer{ + buf, sizeof(buf)})); + } + } + + void + run() override + { + testBufferSequence(); + } +}; + +BEAST_DEFINE_TESTSUITE(beast,core,buffers_range); + +} // beast +} // boost