diff --git a/CHANGELOG.md b/CHANGELOG.md index 244c69f1..6705cc38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Version 45 * Add test::pipe * Fix header::reason * Documentation work +* buffer_view skips empty buffer sequences -------------------------------------------------------------------------------- diff --git a/include/beast/core/impl/buffer_cat.ipp b/include/beast/core/impl/buffer_cat.ipp index 5b16c9c3..7d5877db 100644 --- a/include/beast/core/impl/buffer_cat.ipp +++ b/include/beast/core/impl/buffer_cat.ipp @@ -125,8 +125,8 @@ private: void construct(C const&) { - if(std::get(*bn_).begin() != - std::get(*bn_).end()) + if(boost::asio::buffer_size( + std::get(*bn_)) != 0) { n_ = I; new(&buf_[0]) iter_t{ @@ -136,6 +136,37 @@ private: construct(C{}); } + void + rconstruct(C<0> const&) + { + auto constexpr I = 0; + if(boost::asio::buffer_size( + std::get(*bn_)) != 0) + { + n_ = I; + new(&buf_[0]) iter_t{ + std::get(*bn_).end()}; + return; + } + BOOST_THROW_EXCEPTION(std::logic_error{ + "invalid iterator"}); + } + + template + void + rconstruct(C const&) + { + if(boost::asio::buffer_size( + std::get(*bn_)) != 0) + { + n_ = I; + new(&buf_[0]) iter_t{ + std::get(*bn_).end()}; + return; + } + rconstruct(C{}); + } + void destroy(C const&) { @@ -258,27 +289,10 @@ private: { auto constexpr I = sizeof...(Bn); if(n_ == I) - { - --n_; - new(&buf_[0]) iter_t{ - std::get(*bn_).end()}; - } + rconstruct(C{}); decrement(C{}); } - void - decrement(C<0> const&) - { - auto constexpr I = 0; - if(iter() != std::get(*bn_).begin()) - { - --iter(); - return; - } - BOOST_THROW_EXCEPTION(std::logic_error{ - "invalid iterator"}); - } - template void decrement(C const&) @@ -293,11 +307,23 @@ private: --n_; using Iter = iter_t; iter().~Iter(); - new(&buf_[0]) iter_t{ - std::get(*bn_).end()}; + rconstruct(C{}); } decrement(C{}); } + + void + decrement(C<0> const&) + { + auto constexpr I = 0; + if(iter() != std::get(*bn_).begin()) + { + --iter(); + return; + } + BOOST_THROW_EXCEPTION(std::logic_error{ + "invalid iterator"}); + } }; //------------------------------------------------------------------------------