buffers_adapter improvements:

* Add value()
* Add value_type
* Add in-place constructor
This commit is contained in:
Vinnie Falco
2018-06-09 13:00:37 -07:00
parent 2c5ed4595a
commit 39b014263a
4 changed files with 62 additions and 17 deletions

View File

@ -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
--------------------------------------------------------------------------------

View File

@ -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

View File

@ -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_)

View File

@ -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);