summaryrefslogtreecommitdiff
path: root/boost/beast/core/buffers_cat.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/buffers_cat.hpp')
-rw-r--r--boost/beast/core/buffers_cat.hpp119
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