diff --git a/CHANGELOG.md b/CHANGELOG.md index 9435c41a..9ae17eb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Version 173: * Fix buffers_adapter iterator value type * Fix buffers_adapter max_size * Fix buffers_prefix iterator decrement +* buffers_adapter improvements -------------------------------------------------------------------------------- diff --git a/include/boost/beast/core/buffers_adapter.hpp b/include/boost/beast/core/buffers_adapter.hpp index 826183ed..0e0ce8b0 100644 --- a/include/boost/beast/core/buffers_adapter.hpp +++ b/include/boost/beast/core/buffers_adapter.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace boost { @@ -69,6 +70,9 @@ class buffers_adapter } public: + /// The type of the underlying mutable buffer sequence + using value_type = MutableBufferSequence; + #if BOOST_BEAST_DOXYGEN /// The type used to represent the input sequence as a list of buffers. using const_buffers_type = implementation_defined; @@ -104,6 +108,17 @@ public: explicit buffers_adapter(MutableBufferSequence const& buffers); + /** Constructor + + This constructs the buffer adapter in-place from + a list of arguments. + + @param args Arguments forwarded to the buffers constructor. + */ + template + explicit + buffers_adapter(boost::in_place_init_t, Args&&... args); + /// Returns the largest size output sequence possible. std::size_t max_size() const @@ -125,6 +140,13 @@ public: return max_size_; } + /// Returns the original mutable buffer sequence + value_type const& + value() const + { + return bs_; + } + /** Get a list of buffers that represents the output sequence, with the given size. @throws std::length_error if the size would exceed the limit diff --git a/include/boost/beast/core/impl/buffers_adapter.ipp b/include/boost/beast/core/impl/buffers_adapter.ipp index 04483afe..fa0872ae 100644 --- a/include/boost/beast/core/impl/buffers_adapter.ipp +++ b/include/boost/beast/core/impl/buffers_adapter.ipp @@ -17,6 +17,7 @@ #include #include #include +#include namespace boost { namespace beast { @@ -144,7 +145,8 @@ private: template inline auto -buffers_adapter::const_buffers_type::begin() const -> +buffers_adapter:: +const_buffers_type::begin() const -> const_iterator { return const_iterator{*ba_, ba_->begin_}; @@ -153,7 +155,8 @@ buffers_adapter::const_buffers_type::begin() const -> template inline auto -buffers_adapter::const_buffers_type::end() const -> +buffers_adapter:: +const_buffers_type::end() const -> const_iterator { return const_iterator{*ba_, ba_->out_ == @@ -308,8 +311,8 @@ end() const -> //------------------------------------------------------------------------------ template -buffers_adapter::buffers_adapter( - buffers_adapter&& other) +buffers_adapter:: +buffers_adapter(buffers_adapter&& other) : buffers_adapter(std::move(other), std::distance(boost::asio::buffer_sequence_begin(other.bs_), other.begin_), std::distance(boost::asio::buffer_sequence_begin(other.bs_), other.out_), @@ -318,8 +321,8 @@ buffers_adapter::buffers_adapter( } template -buffers_adapter::buffers_adapter( - buffers_adapter const& other) +buffers_adapter:: +buffers_adapter(buffers_adapter const& other) : buffers_adapter(other, std::distance(boost::asio::buffer_sequence_begin(other.bs_), other.begin_), std::distance(boost::asio::buffer_sequence_begin(other.bs_), other.out_), @@ -329,8 +332,9 @@ buffers_adapter::buffers_adapter( template auto -buffers_adapter::operator=( - buffers_adapter&& other) -> buffers_adapter& +buffers_adapter:: +operator=(buffers_adapter&& other) -> + buffers_adapter& { auto const nbegin = std::distance( boost::asio::buffer_sequence_begin(other.bs_), @@ -355,8 +359,9 @@ buffers_adapter::operator=( template auto -buffers_adapter::operator=( - buffers_adapter const& other) -> buffers_adapter& +buffers_adapter:: +operator=(buffers_adapter const& other) -> + buffers_adapter& { auto const nbegin = std::distance( boost::asio::buffer_sequence_begin(other.bs_), @@ -380,8 +385,8 @@ buffers_adapter::operator=( } template -buffers_adapter::buffers_adapter( - MutableBufferSequence const& bs) +buffers_adapter:: +buffers_adapter(MutableBufferSequence const& bs) : bs_(bs) , begin_(boost::asio::buffer_sequence_begin(bs_)) , out_ (boost::asio::buffer_sequence_begin(bs_)) @@ -390,9 +395,22 @@ buffers_adapter::buffers_adapter( { } +template +template +buffers_adapter:: +buffers_adapter(boost::in_place_init_t, Args&&... args) + : bs_{std::forward(args)...} + , begin_(boost::asio::buffer_sequence_begin(bs_)) + , out_ (boost::asio::buffer_sequence_begin(bs_)) + , end_ (boost::asio::buffer_sequence_begin(bs_)) + , max_size_(boost::asio::buffer_size(bs_)) +{ +} + template auto -buffers_adapter::prepare(std::size_t n) -> +buffers_adapter:: +prepare(std::size_t n) -> mutable_buffers_type { using boost::asio::buffer_size; @@ -433,7 +451,8 @@ buffers_adapter::prepare(std::size_t n) -> template void -buffers_adapter::commit(std::size_t n) +buffers_adapter:: +commit(std::size_t n) { using boost::asio::buffer_size; if(out_ == end_) @@ -469,7 +488,8 @@ buffers_adapter::commit(std::size_t n) template inline auto -buffers_adapter::data() const -> +buffers_adapter:: +data() const -> const_buffers_type { return const_buffers_type{*this}; @@ -477,7 +497,8 @@ buffers_adapter::data() const -> template void -buffers_adapter::consume(std::size_t n) +buffers_adapter:: +consume(std::size_t n) { using boost::asio::buffer_size; while(begin_ != out_) diff --git a/test/beast/core/buffers_adapter.cpp b/test/beast/core/buffers_adapter.cpp index 49f8091e..26562418 100644 --- a/test/beast/core/buffers_adapter.cpp +++ b/test/beast/core/buffers_adapter.cpp @@ -104,7 +104,8 @@ public: BEAST_EXPECT(buffer_size(d) == 0); } { - auto d = ba.prepare(z); BEAST_EXPECT(buffer_size(d) == z); + auto d = ba.prepare(z); + BEAST_EXPECT(buffer_size(d) == z); ba.commit(buffer_copy(d, buffer(s.data()+x+y, z))); } ba.commit(2);