From 39697ea37f3f9402d0a545c1f9e427bd3bd65237 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sat, 20 May 2017 19:46:30 -0700 Subject: [PATCH] Additional constructors for consuming_buffers --- CHANGELOG.md | 1 + include/beast/core/consuming_buffers.hpp | 11 +++++ include/beast/core/impl/consuming_buffers.ipp | 23 +++++++++++ test/core/consuming_buffers.cpp | 40 +++++++++++++++++-- 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e52e7ef3..36bc0863 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Version 43 * Fix strict aliasing warnings in buffers_view * Tidy up buffer_prefix overloads and test * Add write limit to test::string_ostream +* Additional constructors for consuming_buffers -------------------------------------------------------------------------------- diff --git a/include/beast/core/consuming_buffers.hpp b/include/beast/core/consuming_buffers.hpp index cd32baa9..9c9f1dee 100644 --- a/include/beast/core/consuming_buffers.hpp +++ b/include/beast/core/consuming_buffers.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -78,6 +79,9 @@ public: #endif + /// Default constructor. + consuming_buffers(); + /// Move constructor. consuming_buffers(consuming_buffers&&); @@ -98,6 +102,13 @@ public: explicit consuming_buffers(BufferSequence const& buffers); + /** Construct a buffer sequence in-place. + + @param args Arguments forwarded to the contained buffers constructor. + */ + template + consuming_buffers(boost::in_place_init_t, Args&&... args); + /// Get a bidirectional iterator to the first element. const_iterator begin() const; diff --git a/include/beast/core/impl/consuming_buffers.ipp b/include/beast/core/impl/consuming_buffers.ipp index 4cc90a9c..d22ddf2b 100644 --- a/include/beast/core/impl/consuming_buffers.ipp +++ b/include/beast/core/impl/consuming_buffers.ipp @@ -109,6 +109,14 @@ private: } }; +template +consuming_buffers:: +consuming_buffers() + : begin_(bs_.begin()) + , end_(bs_.end()) +{ +} + template consuming_buffers:: consuming_buffers(consuming_buffers&& other) @@ -167,6 +175,21 @@ consuming_buffers(BufferSequence const& bs) "BufferSequence requirements not met"); } +template +template +consuming_buffers:: +consuming_buffers(boost::in_place_init_t, Args&&... args) + : bs_(std::forward(args)...) + , begin_(bs_.begin()) + , end_(bs_.end()) +{ + static_assert(sizeof...(Args) > 0, + "Missing constructor arguments"); + static_assert( + std::is_constructible::value, + "BufferSequence is not constructible from arguments"); +} + template inline auto diff --git a/test/core/consuming_buffers.cpp b/test/core/consuming_buffers.cpp index 2a10ab00..afd43f58 100644 --- a/test/core/consuming_buffers.cpp +++ b/test/core/consuming_buffers.cpp @@ -9,6 +9,7 @@ #include #include "buffer_test.hpp" +#include #include #include #include @@ -56,7 +57,8 @@ public: BEAST_EXPECT(test::size_rev_post(buffers) == n); } - void testMatrix() + void + testMatrix() { using boost::asio::buffer; using boost::asio::const_buffer; @@ -98,8 +100,37 @@ public: } }}}} } + + void + testDefaultCtor() + { + class test_buffer : public boost::asio::const_buffers_1 + { + public: + test_buffer() + : boost::asio::const_buffers_1("\r\n", 2) + { + } + }; - void testNullBuffers() + consuming_buffers cb; + BEAST_EXPECT(to_string(cb) == "\r\n"); + } + + void + testInPlace() + { + consuming_buffers> cb( + boost::in_place_init, + boost::asio::const_buffers_1("\r", 1), + boost::asio::const_buffers_1("\n", 1)); + BEAST_EXPECT(to_string(cb) == "\r\n"); + } + + void + testNullBuffers() { using boost::asio::buffer_copy; using boost::asio::buffer_size; @@ -112,7 +143,8 @@ public: BEAST_EXPECT(buffer_copy(cb2, cb) == 0); } - void testIterator() + void + testIterator() { using boost::asio::const_buffer; std::array ba; @@ -126,6 +158,8 @@ public: void run() override { testMatrix(); + testDefaultCtor(); + testInPlace(); testNullBuffers(); testIterator(); }