mirror of
https://github.com/boostorg/beast.git
synced 2025-07-30 21:07:26 +02:00
Add buffers_range
This commit is contained in:
@ -2,6 +2,7 @@ Version 190:
|
|||||||
|
|
||||||
* Add missing includes to convenience headers
|
* Add missing includes to convenience headers
|
||||||
* Unit test framework is experimental
|
* Unit test framework is experimental
|
||||||
|
* Add buffers_range
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -55,6 +55,16 @@ transferred.
|
|||||||
an existing buffer sequence. This is the type of buffer returned by
|
an existing buffer sequence. This is the type of buffer returned by
|
||||||
[link beast.ref.boost__beast__buffers_prefix.overload3 `buffers_prefix`].
|
[link beast.ref.boost__beast__buffers_prefix.overload3 `buffers_prefix`].
|
||||||
]]
|
]]
|
||||||
|
[[
|
||||||
|
[link beast.ref.boost__beast__buffers_range `buffers_range`]
|
||||||
|
][
|
||||||
|
This function returns an iterable range representing the passed
|
||||||
|
buffer sequence. The values obtained when iterating the range
|
||||||
|
will always be a constant buffer, unless the underlying buffer
|
||||||
|
sequence is mutable, in which case the value obtained when iterating
|
||||||
|
will be a mutable buffer. It is intended as a notational convenience
|
||||||
|
when writing a ['range-for] statement over a buffer sequence.
|
||||||
|
]]
|
||||||
[[
|
[[
|
||||||
[link beast.ref.boost__beast__buffers_suffix `buffers_suffix`]
|
[link beast.ref.boost__beast__buffers_suffix `buffers_suffix`]
|
||||||
][
|
][
|
||||||
|
@ -217,6 +217,7 @@
|
|||||||
<member><link linkend="beast.ref.boost__beast__buffers_cat">buffers_cat</link></member>
|
<member><link linkend="beast.ref.boost__beast__buffers_cat">buffers_cat</link></member>
|
||||||
<member><link linkend="beast.ref.boost__beast__buffers_front">buffers_front</link></member>
|
<member><link linkend="beast.ref.boost__beast__buffers_front">buffers_front</link></member>
|
||||||
<member><link linkend="beast.ref.boost__beast__buffers_prefix">buffers_prefix</link></member>
|
<member><link linkend="beast.ref.boost__beast__buffers_prefix">buffers_prefix</link></member>
|
||||||
|
<member><link linkend="beast.ref.boost__beast__buffers_range">buffers_range</link></member>
|
||||||
<member><link linkend="beast.ref.boost__beast__buffers_to_string">buffers_to_string</link></member>
|
<member><link linkend="beast.ref.boost__beast__buffers_to_string">buffers_to_string</link></member>
|
||||||
<member><link linkend="beast.ref.boost__beast__generic_category">generic_category</link></member>
|
<member><link linkend="beast.ref.boost__beast__generic_category">generic_category</link></member>
|
||||||
<member><link linkend="beast.ref.boost__beast__iequals">iequals</link></member>
|
<member><link linkend="beast.ref.boost__beast__iequals">iequals</link></member>
|
||||||
|
@ -38,7 +38,7 @@ BUILTIN_STL_SUPPORT = NO
|
|||||||
CPP_CLI_SUPPORT = NO
|
CPP_CLI_SUPPORT = NO
|
||||||
SIP_SUPPORT = NO
|
SIP_SUPPORT = NO
|
||||||
IDL_PROPERTY_SUPPORT = YES
|
IDL_PROPERTY_SUPPORT = YES
|
||||||
DISTRIBUTE_GROUP_DOC = NO
|
DISTRIBUTE_GROUP_DOC = YES
|
||||||
GROUP_NESTED_COMPOUNDS = NO
|
GROUP_NESTED_COMPOUNDS = NO
|
||||||
SUBGROUPING = YES
|
SUBGROUPING = YES
|
||||||
INLINE_GROUPED_CLASSES = NO
|
INLINE_GROUPED_CLASSES = NO
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include <boost/beast/core/buffers_adapter.hpp>
|
#include <boost/beast/core/buffers_adapter.hpp>
|
||||||
#include <boost/beast/core/buffers_cat.hpp>
|
#include <boost/beast/core/buffers_cat.hpp>
|
||||||
#include <boost/beast/core/buffers_prefix.hpp>
|
#include <boost/beast/core/buffers_prefix.hpp>
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/buffers_suffix.hpp>
|
#include <boost/beast/core/buffers_suffix.hpp>
|
||||||
#include <boost/beast/core/buffers_to_string.hpp>
|
#include <boost/beast/core/buffers_to_string.hpp>
|
||||||
#include <boost/beast/core/error.hpp>
|
#include <boost/beast/core/error.hpp>
|
||||||
|
90
include/boost/beast/core/buffers_range.hpp
Normal file
90
include/boost/beast/core/buffers_range.hpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/beast
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOOST_BEAST_BUFFERS_RANGE_HPP
|
||||||
|
#define BOOST_BEAST_BUFFERS_RANGE_HPP
|
||||||
|
|
||||||
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
|
#include <boost/beast/core/detail/buffers_range.hpp>
|
||||||
|
#include <boost/asio/buffer.hpp>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace beast {
|
||||||
|
|
||||||
|
/** Return a range representing a const or mutable buffer sequence.
|
||||||
|
|
||||||
|
This function returns an iterable range representing the
|
||||||
|
passed buffer sequence. The values obtained when iterating
|
||||||
|
the range will always be `const_buffer`, unless the underlying
|
||||||
|
buffer sequence is a @em MutableBufferSequence, in which case
|
||||||
|
the value obtained when iterating will be a `mutable_buffer`.
|
||||||
|
|
||||||
|
@par Example
|
||||||
|
|
||||||
|
The following function returns the total number of bytes in
|
||||||
|
the specified buffer sequence:
|
||||||
|
|
||||||
|
@code
|
||||||
|
template<class ConstBufferSequence>
|
||||||
|
std::size_t buffer_sequence_size(ConstBufferSequence const& buffers)
|
||||||
|
{
|
||||||
|
std::size_t size = 0;
|
||||||
|
for(auto const buffer : buffers_range(std::ref(buffers)))
|
||||||
|
size += buffer.size();
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
@param buffers The buffer sequence to adapt into a range. The
|
||||||
|
range returned from this function will contain a copy of the
|
||||||
|
passed buffer sequence. If `buffers` is a `std::reference_wrapper`,
|
||||||
|
the range returned from this function will contain a reference to the
|
||||||
|
passed buffer sequence. In this case, the caller is responsible
|
||||||
|
for ensuring that the lifetime of the buffer sequence is valid for
|
||||||
|
the lifetime of the returned range.
|
||||||
|
|
||||||
|
@return An object of unspecified type, meeting the requirements of
|
||||||
|
@em ConstBufferSequence, or @em MutableBufferSequence if `buffers`
|
||||||
|
is a mutable buffer sequence.
|
||||||
|
*/
|
||||||
|
/** @{ */
|
||||||
|
template<class ConstBufferSequence>
|
||||||
|
#if BOOST_BEAST_DOXYGEN
|
||||||
|
__implementation_defined__
|
||||||
|
#else
|
||||||
|
detail::buffers_range_adaptor<ConstBufferSequence>
|
||||||
|
#endif
|
||||||
|
buffers_range(ConstBufferSequence const& buffers)
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||||
|
"ConstBufferSequence requirements not met");
|
||||||
|
return detail::buffers_range_adaptor<ConstBufferSequence>(buffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class ConstBufferSequence>
|
||||||
|
#if BOOST_BEAST_DOXYGEN
|
||||||
|
__implementation_defined__
|
||||||
|
#else
|
||||||
|
detail::buffers_range_adaptor<ConstBufferSequence const&>
|
||||||
|
#endif
|
||||||
|
buffers_range(std::reference_wrapper<ConstBufferSequence> buffers)
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||||
|
"ConstBufferSequence requirements not met");
|
||||||
|
return detail::buffers_range_adaptor<ConstBufferSequence const&>(buffers.get());
|
||||||
|
}
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
} // beast
|
||||||
|
} // boost
|
||||||
|
|
||||||
|
#endif
|
@ -11,7 +11,7 @@
|
|||||||
#define BOOST_BEAST_BUFFERS_TO_STRING_HPP
|
#define BOOST_BEAST_BUFFERS_TO_STRING_HPP
|
||||||
|
|
||||||
#include <boost/beast/core/detail/config.hpp>
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
#include <boost/beast/core/detail/type_traits.hpp>
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -41,16 +41,17 @@ namespace beast {
|
|||||||
@endcode
|
@endcode
|
||||||
*/
|
*/
|
||||||
template<class ConstBufferSequence>
|
template<class ConstBufferSequence>
|
||||||
inline
|
|
||||||
std::string
|
std::string
|
||||||
buffers_to_string(ConstBufferSequence const& buffers)
|
buffers_to_string(ConstBufferSequence const& buffers)
|
||||||
{
|
{
|
||||||
|
static_assert(
|
||||||
|
boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||||
|
"ConstBufferSequence requirements not met");
|
||||||
std::string result;
|
std::string result;
|
||||||
result.reserve(boost::asio::buffer_size(buffers));
|
result.reserve(boost::asio::buffer_size(buffers));
|
||||||
for(boost::asio::const_buffer buffer :
|
for(auto const buffer : buffers_range(std::ref(buffers)))
|
||||||
detail::buffers_range(buffers))
|
result.append(static_cast<char const*>(
|
||||||
result.append(static_cast<
|
buffer.data()), buffer.size());
|
||||||
char const*>(buffer.data()), buffer.size());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
141
include/boost/beast/core/detail/buffers_range.hpp
Normal file
141
include/boost/beast/core/detail/buffers_range.hpp
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/beast
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOOST_BEAST_DETAIL_BUFFERS_RANGE_HPP
|
||||||
|
#define BOOST_BEAST_DETAIL_BUFFERS_RANGE_HPP
|
||||||
|
|
||||||
|
#include <boost/beast/core/detail/type_traits.hpp>
|
||||||
|
#include <boost/asio/buffer.hpp>
|
||||||
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace beast {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template<class BufferSequence>
|
||||||
|
class buffers_range_adaptor
|
||||||
|
{
|
||||||
|
BufferSequence b_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
#if BOOST_BEAST_DOXYGEN
|
||||||
|
using value_type = __see_below__;
|
||||||
|
#else
|
||||||
|
using value_type = typename std::conditional<
|
||||||
|
boost::is_convertible<
|
||||||
|
typename std::iterator_traits<
|
||||||
|
typename detail::buffer_sequence_iterator<
|
||||||
|
BufferSequence>::type>::value_type,
|
||||||
|
boost::asio::mutable_buffer>::value,
|
||||||
|
boost::asio::mutable_buffer,
|
||||||
|
boost::asio::const_buffer>::type;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class const_iterator
|
||||||
|
{
|
||||||
|
friend class buffers_range_adaptor;
|
||||||
|
|
||||||
|
using iter_type = typename
|
||||||
|
buffer_sequence_iterator<BufferSequence>::type;
|
||||||
|
|
||||||
|
iter_type it_;
|
||||||
|
|
||||||
|
const_iterator(iter_type const& it)
|
||||||
|
: it_(it)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
using value_type = typename
|
||||||
|
buffers_range_adaptor::value_type;
|
||||||
|
using pointer = value_type const*;
|
||||||
|
using reference = value_type;
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
using iterator_category =
|
||||||
|
std::bidirectional_iterator_tag;
|
||||||
|
|
||||||
|
bool
|
||||||
|
operator==(const_iterator const& other) const
|
||||||
|
{
|
||||||
|
return it_ == other.it_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
operator!=(const_iterator const& other) const
|
||||||
|
{
|
||||||
|
return ! (*this == other);
|
||||||
|
}
|
||||||
|
|
||||||
|
reference
|
||||||
|
operator*() const
|
||||||
|
{
|
||||||
|
return *it_;
|
||||||
|
}
|
||||||
|
|
||||||
|
pointer
|
||||||
|
operator->() const = delete;
|
||||||
|
|
||||||
|
const_iterator&
|
||||||
|
operator++()
|
||||||
|
{
|
||||||
|
++it_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator
|
||||||
|
operator++(int)
|
||||||
|
{
|
||||||
|
auto temp = *this;
|
||||||
|
++(*this);
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
const_iterator&
|
||||||
|
operator--()
|
||||||
|
{
|
||||||
|
--it_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
const_iterator
|
||||||
|
operator--(int)
|
||||||
|
{
|
||||||
|
auto temp = *this;
|
||||||
|
--(*this);
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit
|
||||||
|
buffers_range_adaptor(BufferSequence const& b)
|
||||||
|
: b_(b)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator
|
||||||
|
begin() const noexcept
|
||||||
|
{
|
||||||
|
return boost::asio::buffer_sequence_begin(b_);
|
||||||
|
}
|
||||||
|
|
||||||
|
const_iterator
|
||||||
|
end() const noexcept
|
||||||
|
{
|
||||||
|
return boost::asio::buffer_sequence_end(b_);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // detail
|
||||||
|
} // beast
|
||||||
|
} // boost
|
||||||
|
|
||||||
|
#endif
|
@ -48,7 +48,7 @@ std::ostream&
|
|||||||
operator<<(std::ostream& os,
|
operator<<(std::ostream& os,
|
||||||
buffers_helper<Buffers> const& v)
|
buffers_helper<Buffers> const& v)
|
||||||
{
|
{
|
||||||
for(auto b : buffers_range(v.b_))
|
for(auto b : buffers_range(std::ref(v.b_)))
|
||||||
os.write(static_cast<char const*>(b.data()), b.size());
|
os.write(static_cast<char const*>(b.data()), b.size());
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
@ -336,124 +336,6 @@ struct StreamHandler
|
|||||||
using ReadHandler = StreamHandler;
|
using ReadHandler = StreamHandler;
|
||||||
using WriteHandler = StreamHandler;
|
using WriteHandler = StreamHandler;
|
||||||
|
|
||||||
template<class Buffers>
|
|
||||||
class buffers_range_adaptor
|
|
||||||
{
|
|
||||||
Buffers const& b_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
using value_type = typename std::conditional<
|
|
||||||
boost::is_convertible<
|
|
||||||
typename std::iterator_traits<
|
|
||||||
typename buffer_sequence_iterator<
|
|
||||||
Buffers>::type>::value_type,
|
|
||||||
boost::asio::mutable_buffer>::value,
|
|
||||||
boost::asio::mutable_buffer,
|
|
||||||
boost::asio::const_buffer>::type;
|
|
||||||
|
|
||||||
class const_iterator
|
|
||||||
{
|
|
||||||
friend class buffers_range_adaptor;
|
|
||||||
|
|
||||||
using iter_type = typename
|
|
||||||
buffer_sequence_iterator<Buffers>::type;
|
|
||||||
|
|
||||||
iter_type it_;
|
|
||||||
|
|
||||||
const_iterator(iter_type const& it)
|
|
||||||
: it_(it)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
using value_type = typename
|
|
||||||
buffers_range_adaptor::value_type;
|
|
||||||
using pointer = value_type const*;
|
|
||||||
using reference = value_type;
|
|
||||||
using difference_type = std::ptrdiff_t;
|
|
||||||
using iterator_category =
|
|
||||||
std::bidirectional_iterator_tag;
|
|
||||||
|
|
||||||
bool
|
|
||||||
operator==(const_iterator const& other) const
|
|
||||||
{
|
|
||||||
return it_ == other.it_;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
operator!=(const_iterator const& other) const
|
|
||||||
{
|
|
||||||
return ! (*this == other);
|
|
||||||
}
|
|
||||||
|
|
||||||
reference
|
|
||||||
operator*() const
|
|
||||||
{
|
|
||||||
return *it_;
|
|
||||||
}
|
|
||||||
|
|
||||||
pointer
|
|
||||||
operator->() const = delete;
|
|
||||||
|
|
||||||
const_iterator&
|
|
||||||
operator++()
|
|
||||||
{
|
|
||||||
++it_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator
|
|
||||||
operator++(int)
|
|
||||||
{
|
|
||||||
auto temp = *this;
|
|
||||||
++(*this);
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// deprecated
|
|
||||||
const_iterator&
|
|
||||||
operator--()
|
|
||||||
{
|
|
||||||
--it_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// deprecated
|
|
||||||
const_iterator
|
|
||||||
operator--(int)
|
|
||||||
{
|
|
||||||
auto temp = *this;
|
|
||||||
--(*this);
|
|
||||||
return temp;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit
|
|
||||||
buffers_range_adaptor(Buffers const& b)
|
|
||||||
: b_(b)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator
|
|
||||||
begin() const noexcept
|
|
||||||
{
|
|
||||||
return boost::asio::buffer_sequence_begin(b_);
|
|
||||||
}
|
|
||||||
|
|
||||||
const_iterator
|
|
||||||
end() const noexcept
|
|
||||||
{
|
|
||||||
return boost::asio::buffer_sequence_end(b_);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class Buffers>
|
|
||||||
buffers_range_adaptor<Buffers>
|
|
||||||
buffers_range(Buffers const& buffers)
|
|
||||||
{
|
|
||||||
return buffers_range_adaptor<Buffers>{buffers};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If this static assert goes off, it means that the completion
|
/* If this static assert goes off, it means that the completion
|
||||||
handler you provided to an asynchronous initiating function did
|
handler you provided to an asynchronous initiating function did
|
||||||
not have the right signature. Check the parameter types for your
|
not have the right signature. Check the parameter types for your
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#if BOOST_BEAST_USE_WIN32_FILE
|
#if BOOST_BEAST_USE_WIN32_FILE
|
||||||
|
|
||||||
#include <boost/beast/core/bind_handler.hpp>
|
#include <boost/beast/core/bind_handler.hpp>
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/type_traits.hpp>
|
#include <boost/beast/core/type_traits.hpp>
|
||||||
#include <boost/beast/core/detail/clamp.hpp>
|
#include <boost/beast/core/detail/clamp.hpp>
|
||||||
#include <boost/beast/http/serializer.hpp>
|
#include <boost/beast/http/serializer.hpp>
|
||||||
@ -191,7 +192,7 @@ struct basic_file_body<file_win32>
|
|||||||
error_code& ec)
|
error_code& ec)
|
||||||
{
|
{
|
||||||
std::size_t nwritten = 0;
|
std::size_t nwritten = 0;
|
||||||
for(auto buffer : beast::detail::buffers_range(buffers))
|
for(auto buffer : beast::buffers_range(std::ref(buffers)))
|
||||||
{
|
{
|
||||||
nwritten += body_.file_.write(
|
nwritten += body_.file_.write(
|
||||||
buffer.data(), buffer.size(), ec);
|
buffer.data(), buffer.size(), ec);
|
||||||
|
@ -12,8 +12,9 @@
|
|||||||
|
|
||||||
#include <boost/beast/http/type_traits.hpp>
|
#include <boost/beast/http/type_traits.hpp>
|
||||||
#include <boost/beast/core/bind_handler.hpp>
|
#include <boost/beast/core/bind_handler.hpp>
|
||||||
#include <boost/beast/core/ostream.hpp>
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/handler_ptr.hpp>
|
#include <boost/beast/core/handler_ptr.hpp>
|
||||||
|
#include <boost/beast/core/ostream.hpp>
|
||||||
#include <boost/beast/core/type_traits.hpp>
|
#include <boost/beast/core/type_traits.hpp>
|
||||||
#include <boost/beast/core/detail/config.hpp>
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
#include <boost/asio/associated_allocator.hpp>
|
#include <boost/asio/associated_allocator.hpp>
|
||||||
@ -935,7 +936,7 @@ public:
|
|||||||
if(os_.fail())
|
if(os_.fail())
|
||||||
return;
|
return;
|
||||||
std::size_t bytes_transferred = 0;
|
std::size_t bytes_transferred = 0;
|
||||||
for(auto b : buffers_range(buffers))
|
for(auto b : beast::buffers_range(std::ref(buffers)))
|
||||||
{
|
{
|
||||||
os_.write(static_cast<char const*>(
|
os_.write(static_cast<char const*>(
|
||||||
b.data()), b.size());
|
b.data()), b.size());
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <boost/beast/core/detail/config.hpp>
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
#include <boost/beast/http/error.hpp>
|
#include <boost/beast/http/error.hpp>
|
||||||
#include <boost/beast/http/message.hpp>
|
#include <boost/beast/http/message.hpp>
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/detail/type_traits.hpp>
|
#include <boost/beast/core/detail/type_traits.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
@ -131,7 +132,7 @@ public:
|
|||||||
}
|
}
|
||||||
ec.assign(0, ec.category());
|
ec.assign(0, ec.category());
|
||||||
CharT* dest = &body_[size];
|
CharT* dest = &body_[size];
|
||||||
for(auto b : beast::detail::buffers_range(buffers))
|
for(auto b : beast::buffers_range(std::ref(buffers)))
|
||||||
{
|
{
|
||||||
Traits::copy(dest, static_cast<
|
Traits::copy(dest, static_cast<
|
||||||
CharT const*>(b.data()), b.size());
|
CharT const*>(b.data()), b.size());
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#define BOOST_BEAST_WEBSOCKET_DETAIL_MASK_HPP
|
#define BOOST_BEAST_WEBSOCKET_DETAIL_MASK_HPP
|
||||||
|
|
||||||
#include <boost/beast/core/detail/config.hpp>
|
#include <boost/beast/core/detail/config.hpp>
|
||||||
#include <boost/beast/core/detail/type_traits.hpp>
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
@ -76,7 +76,7 @@ void
|
|||||||
mask_inplace(MutableBuffers const& bs, KeyType& key)
|
mask_inplace(MutableBuffers const& bs, KeyType& key)
|
||||||
{
|
{
|
||||||
for(boost::asio::mutable_buffer b :
|
for(boost::asio::mutable_buffer b :
|
||||||
beast::detail::buffers_range(bs))
|
beast::buffers_range(std::ref(bs)))
|
||||||
mask_inplace(b, key);
|
mask_inplace(b, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#ifndef BOOST_BEAST_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP
|
#ifndef BOOST_BEAST_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP
|
||||||
#define BOOST_BEAST_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP
|
#define BOOST_BEAST_WEBSOCKET_DETAIL_UTF8_CHECKER_HPP
|
||||||
|
|
||||||
#include <boost/beast/core/type_traits.hpp>
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -88,7 +88,7 @@ write(ConstBufferSequence const& bs)
|
|||||||
{
|
{
|
||||||
static_assert(boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value,
|
static_assert(boost::asio::is_const_buffer_sequence<ConstBufferSequence>::value,
|
||||||
"ConstBufferSequence requirements not met");
|
"ConstBufferSequence requirements not met");
|
||||||
for(auto b : beast::detail::buffers_range(bs))
|
for(auto b : beast::buffers_range(std::ref(bs)))
|
||||||
if(! write(static_cast<
|
if(! write(static_cast<
|
||||||
std::uint8_t const*>(b.data()),
|
std::uint8_t const*>(b.data()),
|
||||||
b.size()))
|
b.size()))
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <boost/beast/core/bind_handler.hpp>
|
#include <boost/beast/core/bind_handler.hpp>
|
||||||
#include <boost/beast/core/buffers_cat.hpp>
|
#include <boost/beast/core/buffers_cat.hpp>
|
||||||
#include <boost/beast/core/buffers_prefix.hpp>
|
#include <boost/beast/core/buffers_prefix.hpp>
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/buffers_suffix.hpp>
|
#include <boost/beast/core/buffers_suffix.hpp>
|
||||||
#include <boost/beast/core/flat_static_buffer.hpp>
|
#include <boost/beast/core/flat_static_buffer.hpp>
|
||||||
#include <boost/beast/core/type_traits.hpp>
|
#include <boost/beast/core/type_traits.hpp>
|
||||||
@ -59,7 +60,7 @@ deflate(
|
|||||||
zs.next_in = nullptr;
|
zs.next_in = nullptr;
|
||||||
zs.avail_out = out.size();
|
zs.avail_out = out.size();
|
||||||
zs.next_out = out.data();
|
zs.next_out = out.data();
|
||||||
for(auto in : beast::detail::buffers_range(cb))
|
for(auto in : beast::buffers_range(std::ref(cb)))
|
||||||
{
|
{
|
||||||
zs.avail_in = in.size();
|
zs.avail_in = in.size();
|
||||||
if(zs.avail_in == 0)
|
if(zs.avail_in == 0)
|
||||||
|
@ -24,6 +24,7 @@ add_executable (tests-beast-core
|
|||||||
buffers_adapter.cpp
|
buffers_adapter.cpp
|
||||||
buffers_cat.cpp
|
buffers_cat.cpp
|
||||||
buffers_prefix.cpp
|
buffers_prefix.cpp
|
||||||
|
buffers_range.cpp
|
||||||
buffers_suffix.cpp
|
buffers_suffix.cpp
|
||||||
buffers_to_string.cpp
|
buffers_to_string.cpp
|
||||||
error.cpp
|
error.cpp
|
||||||
|
@ -14,6 +14,7 @@ local SOURCES =
|
|||||||
buffers_adapter.cpp
|
buffers_adapter.cpp
|
||||||
buffers_cat.cpp
|
buffers_cat.cpp
|
||||||
buffers_prefix.cpp
|
buffers_prefix.cpp
|
||||||
|
buffers_range.cpp
|
||||||
buffers_suffix.cpp
|
buffers_suffix.cpp
|
||||||
buffers_to_string.cpp
|
buffers_to_string.cpp
|
||||||
error.cpp
|
error.cpp
|
||||||
|
11
test/beast/core/buffers_range.cpp
Normal file
11
test/beast/core/buffers_range.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Official repository: https://github.com/boostorg/beast
|
||||||
|
//
|
||||||
|
|
||||||
|
// Test that header file is self-contained.
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
@ -7,6 +7,7 @@
|
|||||||
// Official repository: https://github.com/boostorg/beast
|
// Official repository: https://github.com/boostorg/beast
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/flat_buffer.hpp>
|
#include <boost/beast/core/flat_buffer.hpp>
|
||||||
#include <boost/beast/core/multi_buffer.hpp>
|
#include <boost/beast/core/multi_buffer.hpp>
|
||||||
#include <boost/beast/core/read_size.hpp>
|
#include <boost/beast/core/read_size.hpp>
|
||||||
@ -67,7 +68,7 @@ public:
|
|||||||
fill(MutableBufferSequence const& buffers)
|
fill(MutableBufferSequence const& buffers)
|
||||||
{
|
{
|
||||||
std::size_t n = 0;
|
std::size_t n = 0;
|
||||||
for(auto b : beast::detail::buffers_range(buffers))
|
for(auto b : beast::buffers_range(std::ref(buffers)))
|
||||||
{
|
{
|
||||||
std::fill(
|
std::fill(
|
||||||
static_cast<char*>(b.data()),
|
static_cast<char*>(b.data()),
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include <boost/beast/http/message.hpp>
|
#include <boost/beast/http/message.hpp>
|
||||||
#include <boost/beast/http/rfc7230.hpp>
|
#include <boost/beast/http/rfc7230.hpp>
|
||||||
|
#include <boost/beast/core/buffers_range.hpp>
|
||||||
#include <boost/beast/core/error.hpp>
|
#include <boost/beast/core/error.hpp>
|
||||||
#include <boost/beast/core/type_traits.hpp>
|
#include <boost/beast/core/type_traits.hpp>
|
||||||
#include <boost/asio/buffer.hpp>
|
#include <boost/asio/buffer.hpp>
|
||||||
@ -268,7 +269,7 @@ nodejs_basic_parser<Derived>::write(
|
|||||||
ConstBufferSequence>::value,
|
ConstBufferSequence>::value,
|
||||||
"ConstBufferSequence requirements not met");
|
"ConstBufferSequence requirements not met");
|
||||||
std::size_t bytes_used = 0;
|
std::size_t bytes_used = 0;
|
||||||
for(auto buffer : beast::detail::buffers_range(buffers))
|
for(auto buffer : beast::buffers_range(std::ref(buffers)))
|
||||||
{
|
{
|
||||||
auto const n = write(
|
auto const n = write(
|
||||||
static_cast<void const*>(buffer.data()),
|
static_cast<void const*>(buffer.data()),
|
||||||
|
Reference in New Issue
Block a user