Fix consuming_buffers value_type (API Change):

This fixes a bug where instantiations of consuming_buffers with
buffer sequence types whose value_type is not const_buffer or
mutable_buffer can cause compilation errors.

The function consumed_buffers is removed.
This commit is contained in:
Vinnie Falco
2017-07-20 08:12:13 -07:00
parent 8f535ba74f
commit 6afa6afc98
6 changed files with 60 additions and 69 deletions
+36 -34
View File
@@ -18,10 +18,10 @@
namespace beast {
template<class BufferSequence, class ValueType>
class consuming_buffers<BufferSequence, ValueType>::const_iterator
template<class BufferSequence>
class consuming_buffers<BufferSequence>::const_iterator
{
friend class consuming_buffers<BufferSequence, ValueType>;
friend class consuming_buffers<BufferSequence>;
using iter_type =
typename BufferSequence::const_iterator;
@@ -30,8 +30,12 @@ class consuming_buffers<BufferSequence, ValueType>::const_iterator
consuming_buffers const* b_ = nullptr;
public:
using value_type =
typename std::iterator_traits<iter_type>::value_type;
using value_type = typename std::conditional<
std::is_convertible<typename
std::iterator_traits<iter_type>::value_type,
boost::asio::mutable_buffer>::value,
boost::asio::mutable_buffer,
boost::asio::const_buffer>::type;
using pointer = value_type const*;
using reference = value_type;
using difference_type = std::ptrdiff_t;
@@ -59,8 +63,9 @@ public:
reference
operator*() const
{
return it_ == b_->begin_ ?
*it_ + b_->skip_ : *it_;
return it_ == b_->begin_
? value_type{*it_} + b_->skip_
: *it_;
}
pointer
@@ -105,8 +110,8 @@ private:
}
};
template<class BufferSequence, class ValueType>
consuming_buffers<BufferSequence, ValueType>::
template<class BufferSequence>
consuming_buffers<BufferSequence>::
consuming_buffers(consuming_buffers&& other)
: consuming_buffers(std::move(other),
std::distance<iter_type>(
@@ -114,8 +119,8 @@ consuming_buffers(consuming_buffers&& other)
{
}
template<class BufferSequence, class ValueType>
consuming_buffers<BufferSequence, ValueType>::
template<class BufferSequence>
consuming_buffers<BufferSequence>::
consuming_buffers(consuming_buffers const& other)
: consuming_buffers(other,
std::distance<iter_type>(
@@ -123,9 +128,9 @@ consuming_buffers(consuming_buffers const& other)
{
}
template<class BufferSequence, class ValueType>
template<class BufferSequence>
auto
consuming_buffers<BufferSequence, ValueType>::
consuming_buffers<BufferSequence>::
operator=(consuming_buffers&& other) ->
consuming_buffers&
{
@@ -137,9 +142,9 @@ operator=(consuming_buffers&& other) ->
return *this;
}
template<class BufferSequence, class ValueType>
template<class BufferSequence>
auto
consuming_buffers<BufferSequence, ValueType>::
consuming_buffers<BufferSequence>::
operator=(consuming_buffers const& other) ->
consuming_buffers&
{
@@ -151,35 +156,41 @@ operator=(consuming_buffers const& other) ->
return *this;
}
template<class BufferSequence, class ValueType>
consuming_buffers<BufferSequence, ValueType>::
template<class BufferSequence>
consuming_buffers<BufferSequence>::
consuming_buffers(BufferSequence const& bs)
: bs_(bs)
, begin_(bs_.begin())
{
static_assert(is_BufferSequence<BufferSequence, ValueType>::value,
"BufferSequence requirements not met");
static_assert(
is_BufferSequence<BufferSequence, value_type>::value,
"BufferSequence requirements not met");
}
template<class BufferSequence, class ValueType>
template<class BufferSequence>
inline
auto
consuming_buffers<BufferSequence, ValueType>::begin() const ->
consuming_buffers<BufferSequence>::
begin() const ->
const_iterator
{
return const_iterator{*this, begin_};
}
template<class BufferSequence, class ValueType>
template<class BufferSequence>
inline
auto
consuming_buffers<BufferSequence, ValueType>::end() const ->
consuming_buffers<BufferSequence>::
end() const ->
const_iterator
{
return const_iterator{*this, bs_.end()};
}
template<class BufferSequence, class ValueType>
template<class BufferSequence>
void
consuming_buffers<BufferSequence, ValueType>::consume(std::size_t n)
consuming_buffers<BufferSequence>::
consume(std::size_t n)
{
using boost::asio::buffer_size;
for(;n > 0 && begin_ != bs_.end(); ++begin_)
@@ -196,15 +207,6 @@ consuming_buffers<BufferSequence, ValueType>::consume(std::size_t n)
}
}
template<class BufferSequence>
consuming_buffers<BufferSequence, typename BufferSequence::value_type>
consumed_buffers(BufferSequence const& bs, std::size_t n)
{
consuming_buffers<BufferSequence> cb(bs);
cb.consume(n);
return cb;
}
} // beast
#endif