mirror of
https://github.com/boostorg/beast.git
synced 2025-07-29 20:37:31 +02:00
buffers_adapter improvements:
* Add value() * Add value_type * Add in-place constructor
This commit is contained in:
@ -4,6 +4,7 @@ Version 173:
|
||||
* Fix buffers_adapter iterator value type
|
||||
* Fix buffers_adapter max_size
|
||||
* Fix buffers_prefix iterator decrement
|
||||
* buffers_adapter improvements
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <boost/beast/core/detail/config.hpp>
|
||||
#include <boost/beast/core/type_traits.hpp>
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <boost/optional.hpp>
|
||||
#include <type_traits>
|
||||
|
||||
namespace boost {
|
||||
@ -69,6 +70,9 @@ class buffers_adapter
|
||||
}
|
||||
|
||||
public:
|
||||
/// The type of the underlying mutable buffer sequence
|
||||
using value_type = MutableBufferSequence;
|
||||
|
||||
#if BOOST_BEAST_DOXYGEN
|
||||
/// The type used to represent the input sequence as a list of buffers.
|
||||
using const_buffers_type = implementation_defined;
|
||||
@ -104,6 +108,17 @@ public:
|
||||
explicit
|
||||
buffers_adapter(MutableBufferSequence const& buffers);
|
||||
|
||||
/** Constructor
|
||||
|
||||
This constructs the buffer adapter in-place from
|
||||
a list of arguments.
|
||||
|
||||
@param args Arguments forwarded to the buffers constructor.
|
||||
*/
|
||||
template<class... Args>
|
||||
explicit
|
||||
buffers_adapter(boost::in_place_init_t, Args&&... args);
|
||||
|
||||
/// Returns the largest size output sequence possible.
|
||||
std::size_t
|
||||
max_size() const
|
||||
@ -125,6 +140,13 @@ public:
|
||||
return max_size_;
|
||||
}
|
||||
|
||||
/// Returns the original mutable buffer sequence
|
||||
value_type const&
|
||||
value() const
|
||||
{
|
||||
return bs_;
|
||||
}
|
||||
|
||||
/** Get a list of buffers that represents the output sequence, with the given size.
|
||||
|
||||
@throws std::length_error if the size would exceed the limit
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
|
||||
namespace boost {
|
||||
namespace beast {
|
||||
@ -144,7 +145,8 @@ private:
|
||||
template<class MutableBufferSequence>
|
||||
inline
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::const_buffers_type::begin() const ->
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
const_buffers_type::begin() const ->
|
||||
const_iterator
|
||||
{
|
||||
return const_iterator{*ba_, ba_->begin_};
|
||||
@ -153,7 +155,8 @@ buffers_adapter<MutableBufferSequence>::const_buffers_type::begin() const ->
|
||||
template<class MutableBufferSequence>
|
||||
inline
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::const_buffers_type::end() const ->
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
const_buffers_type::end() const ->
|
||||
const_iterator
|
||||
{
|
||||
return const_iterator{*ba_, ba_->out_ ==
|
||||
@ -308,8 +311,8 @@ end() const ->
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
buffers_adapter&& other)
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
buffers_adapter(buffers_adapter&& other)
|
||||
: buffers_adapter(std::move(other),
|
||||
std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.begin_),
|
||||
std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.out_),
|
||||
@ -318,8 +321,8 @@ buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
buffers_adapter const& other)
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
buffers_adapter(buffers_adapter const& other)
|
||||
: buffers_adapter(other,
|
||||
std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.begin_),
|
||||
std::distance<iter_type>(boost::asio::buffer_sequence_begin(other.bs_), other.out_),
|
||||
@ -329,8 +332,9 @@ buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::operator=(
|
||||
buffers_adapter&& other) -> buffers_adapter&
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
operator=(buffers_adapter&& other) ->
|
||||
buffers_adapter&
|
||||
{
|
||||
auto const nbegin = std::distance<iter_type>(
|
||||
boost::asio::buffer_sequence_begin(other.bs_),
|
||||
@ -355,8 +359,9 @@ buffers_adapter<MutableBufferSequence>::operator=(
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::operator=(
|
||||
buffers_adapter const& other) -> buffers_adapter&
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
operator=(buffers_adapter const& other) ->
|
||||
buffers_adapter&
|
||||
{
|
||||
auto const nbegin = std::distance<iter_type>(
|
||||
boost::asio::buffer_sequence_begin(other.bs_),
|
||||
@ -380,8 +385,8 @@ buffers_adapter<MutableBufferSequence>::operator=(
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
MutableBufferSequence const& bs)
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
buffers_adapter(MutableBufferSequence const& bs)
|
||||
: bs_(bs)
|
||||
, begin_(boost::asio::buffer_sequence_begin(bs_))
|
||||
, out_ (boost::asio::buffer_sequence_begin(bs_))
|
||||
@ -390,9 +395,22 @@ buffers_adapter<MutableBufferSequence>::buffers_adapter(
|
||||
{
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
template<class... Args>
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
buffers_adapter(boost::in_place_init_t, Args&&... args)
|
||||
: bs_{std::forward<Args>(args)...}
|
||||
, begin_(boost::asio::buffer_sequence_begin(bs_))
|
||||
, out_ (boost::asio::buffer_sequence_begin(bs_))
|
||||
, end_ (boost::asio::buffer_sequence_begin(bs_))
|
||||
, max_size_(boost::asio::buffer_size(bs_))
|
||||
{
|
||||
}
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::prepare(std::size_t n) ->
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
prepare(std::size_t n) ->
|
||||
mutable_buffers_type
|
||||
{
|
||||
using boost::asio::buffer_size;
|
||||
@ -433,7 +451,8 @@ buffers_adapter<MutableBufferSequence>::prepare(std::size_t n) ->
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
void
|
||||
buffers_adapter<MutableBufferSequence>::commit(std::size_t n)
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
commit(std::size_t n)
|
||||
{
|
||||
using boost::asio::buffer_size;
|
||||
if(out_ == end_)
|
||||
@ -469,7 +488,8 @@ buffers_adapter<MutableBufferSequence>::commit(std::size_t n)
|
||||
template<class MutableBufferSequence>
|
||||
inline
|
||||
auto
|
||||
buffers_adapter<MutableBufferSequence>::data() const ->
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
data() const ->
|
||||
const_buffers_type
|
||||
{
|
||||
return const_buffers_type{*this};
|
||||
@ -477,7 +497,8 @@ buffers_adapter<MutableBufferSequence>::data() const ->
|
||||
|
||||
template<class MutableBufferSequence>
|
||||
void
|
||||
buffers_adapter<MutableBufferSequence>::consume(std::size_t n)
|
||||
buffers_adapter<MutableBufferSequence>::
|
||||
consume(std::size_t n)
|
||||
{
|
||||
using boost::asio::buffer_size;
|
||||
while(begin_ != out_)
|
||||
|
@ -104,7 +104,8 @@ public:
|
||||
BEAST_EXPECT(buffer_size(d) == 0);
|
||||
}
|
||||
{
|
||||
auto d = ba.prepare(z); BEAST_EXPECT(buffer_size(d) == z);
|
||||
auto d = ba.prepare(z);
|
||||
BEAST_EXPECT(buffer_size(d) == z);
|
||||
ba.commit(buffer_copy(d, buffer(s.data()+x+y, z)));
|
||||
}
|
||||
ba.commit(2);
|
||||
|
Reference in New Issue
Block a user