diff options
Diffstat (limited to 'boost/beast/core/buffers_cat.hpp')
-rw-r--r-- | boost/beast/core/buffers_cat.hpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/boost/beast/core/buffers_cat.hpp b/boost/beast/core/buffers_cat.hpp new file mode 100644 index 0000000000..1d711b3b30 --- /dev/null +++ b/boost/beast/core/buffers_cat.hpp @@ -0,0 +1,119 @@ +// +// 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_CAT_HPP +#define BOOST_BEAST_BUFFERS_CAT_HPP + +#include <boost/beast/core/detail/config.hpp> +#include <boost/beast/core/detail/type_traits.hpp> +#include <tuple> + +namespace boost { +namespace beast { + +/** A buffer sequence representing a concatenation of buffer sequences. + + @see @ref buffers_cat +*/ +template<class... Buffers> +class buffers_cat_view +{ + std::tuple<Buffers...> bn_; + +public: + /** The type of buffer returned when dereferencing an iterator. + + If every buffer sequence in the view is a @b MutableBufferSequence, + then `value_type` will be `boost::asio::mutable_buffer`. + Otherwise, `value_type` will be `boost::asio::const_buffer`. + */ +#if BOOST_BEAST_DOXYGEN + using value_type = implementation_defined; +#else + using value_type = typename + detail::common_buffers_type<Buffers...>::type; +#endif + + /// The type of iterator used by the concatenated sequence + class const_iterator; + + /// Constructor + buffers_cat_view(buffers_cat_view&&) = default; + + /// Assignment + buffers_cat_view& operator=(buffers_cat_view&&) = default; + + /// Assignment + buffers_cat_view& operator=(buffers_cat_view const&) = default; + + /** Constructor + + @param buffers The list of buffer sequences to concatenate. + Copies of the arguments will be made; however, the ownership + of memory is not transferred. + */ + explicit + buffers_cat_view(Buffers const&... buffers); + + //----- + + /// Required for @b BufferSequence + buffers_cat_view(buffers_cat_view const&) = default; + + /// Required for @b BufferSequence + const_iterator + begin() const; + + /// Required for @b BufferSequence + const_iterator + end() const; +}; + +/** Concatenate 2 or more buffer sequences. + + This function returns a constant or mutable buffer sequence which, + when iterated, efficiently concatenates the input buffer sequences. + Copies of the arguments passed will be made; however, the returned + object does not take ownership of the underlying memory. The + application is still responsible for managing the lifetime of the + referenced memory. + + @param buffers The list of buffer sequences to concatenate. + + @return A new buffer sequence that represents the concatenation of + the input buffer sequences. This buffer sequence will be a + @b MutableBufferSequence if each of the passed buffer sequences is + also a @b MutableBufferSequence; otherwise the returned buffer + sequence will be a @b ConstBufferSequence. + + @see @ref buffers_cat_view +*/ +#if BOOST_BEAST_DOXYGEN +template<class... BufferSequence> +buffers_cat_view<BufferSequence...> +buffers_cat(BufferSequence const&... buffers) +#else +template<class B1, class B2, class... Bn> +inline +buffers_cat_view<B1, B2, Bn...> +buffers_cat(B1 const& b1, B2 const& b2, Bn const&... bn) +#endif +{ + static_assert( + detail::is_all_const_buffer_sequence<B1, B2, Bn...>::value, + "BufferSequence requirements not met"); + return buffers_cat_view<B1, B2, Bn...>{b1, b2, bn...}; +} + +} // beast +} // boost + +#include <boost/beast/core/impl/buffers_cat.ipp> + +#endif |