buffer_view skips empty buffer sequences

This commit is contained in:
Vinnie Falco
2017-05-28 12:57:41 -07:00
parent c29974eec9
commit 056bf5ff99
2 changed files with 49 additions and 22 deletions

View File

@ -6,6 +6,7 @@ Version 45
* Add test::pipe
* Fix header::reason
* Documentation work
* buffer_view skips empty buffer sequences
--------------------------------------------------------------------------------

View File

@ -125,8 +125,8 @@ private:
void
construct(C<I> const&)
{
if(std::get<I>(*bn_).begin() !=
std::get<I>(*bn_).end())
if(boost::asio::buffer_size(
std::get<I>(*bn_)) != 0)
{
n_ = I;
new(&buf_[0]) iter_t<I>{
@ -136,6 +136,37 @@ private:
construct(C<I+1>{});
}
void
rconstruct(C<0> const&)
{
auto constexpr I = 0;
if(boost::asio::buffer_size(
std::get<I>(*bn_)) != 0)
{
n_ = I;
new(&buf_[0]) iter_t<I>{
std::get<I>(*bn_).end()};
return;
}
BOOST_THROW_EXCEPTION(std::logic_error{
"invalid iterator"});
}
template<std::size_t I>
void
rconstruct(C<I> const&)
{
if(boost::asio::buffer_size(
std::get<I>(*bn_)) != 0)
{
n_ = I;
new(&buf_[0]) iter_t<I>{
std::get<I>(*bn_).end()};
return;
}
rconstruct(C<I-1>{});
}
void
destroy(C<sizeof...(Bn)> const&)
{
@ -258,27 +289,10 @@ private:
{
auto constexpr I = sizeof...(Bn);
if(n_ == I)
{
--n_;
new(&buf_[0]) iter_t<I-1>{
std::get<I-1>(*bn_).end()};
}
rconstruct(C<I-1>{});
decrement(C<I-1>{});
}
void
decrement(C<0> const&)
{
auto constexpr I = 0;
if(iter<I>() != std::get<I>(*bn_).begin())
{
--iter<I>();
return;
}
BOOST_THROW_EXCEPTION(std::logic_error{
"invalid iterator"});
}
template<std::size_t I>
void
decrement(C<I> const&)
@ -293,11 +307,23 @@ private:
--n_;
using Iter = iter_t<I>;
iter<I>().~Iter();
new(&buf_[0]) iter_t<I-1>{
std::get<I-1>(*bn_).end()};
rconstruct(C<I-1>{});
}
decrement(C<I-1>{});
}
void
decrement(C<0> const&)
{
auto constexpr I = 0;
if(iter<I>() != std::get<I>(*bn_).begin())
{
--iter<I>();
return;
}
BOOST_THROW_EXCEPTION(std::logic_error{
"invalid iterator"});
}
};
//------------------------------------------------------------------------------