forked from boostorg/beast
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user