summaryrefslogtreecommitdiff
path: root/boost/beast/core/buffer_traits.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/buffer_traits.hpp')
-rw-r--r--boost/beast/core/buffer_traits.hpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/boost/beast/core/buffer_traits.hpp b/boost/beast/core/buffer_traits.hpp
new file mode 100644
index 0000000000..f7b9adae7a
--- /dev/null
+++ b/boost/beast/core/buffer_traits.hpp
@@ -0,0 +1,164 @@
+//
+// Copyright (c) 2016-2019 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_BUFFER_TRAITS_HPP
+#define BOOST_BEAST_BUFFER_TRAITS_HPP
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/core/detail/buffer_traits.hpp>
+#include <boost/beast/core/detail/static_const.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/config/workaround.hpp>
+#include <boost/mp11/function.hpp>
+#include <type_traits>
+
+namespace boost {
+namespace beast {
+
+/** Determine if a list of types satisfy the <em>ConstBufferSequence</em> requirements.
+
+ This metafunction is used to determine if all of the specified types
+ meet the requirements for constant buffer sequences. This type alias
+ will be `std::true_type` if each specified type meets the requirements,
+ otherwise, this type alias will be `std::false_type`.
+
+ @tparam BufferSequence A list of zero or more types to check. If this
+ list is empty, the resulting type alias will be `std::true_type`.
+*/
+template<class... BufferSequence>
+#if BOOST_BEAST_DOXYGEN
+using is_const_buffer_sequence = __see_below__;
+#else
+using is_const_buffer_sequence = mp11::mp_all<
+ net::is_const_buffer_sequence<
+ typename std::decay<BufferSequence>::type>...>;
+#endif
+
+/** Determine if a list of types satisfy the <em>MutableBufferSequence</em> requirements.
+
+ This metafunction is used to determine if all of the specified types
+ meet the requirements for mutable buffer sequences. This type alias
+ will be `std::true_type` if each specified type meets the requirements,
+ otherwise, this type alias will be `std::false_type`.
+
+ @tparam BufferSequence A list of zero or more types to check. If this
+ list is empty, the resulting type alias will be `std::true_type`.
+*/
+template<class... BufferSequence>
+#if BOOST_BEAST_DOXYGEN
+using is_mutable_buffer_sequence = __see_below__;
+#else
+using is_mutable_buffer_sequence = mp11::mp_all<
+ net::is_mutable_buffer_sequence<
+ typename std::decay<BufferSequence>::type>...>;
+#endif
+
+/** Type alias for the underlying buffer type of a list of buffer sequence types.
+
+ This metafunction is used to determine the underlying buffer type for
+ a list of buffer sequence. The equivalent type of the alias will vary
+ depending on the template type argument:
+
+ @li If every type in the list is a <em>MutableBufferSequence</em>,
+ the resulting type alias will be `net::mutable_buffer`, otherwise
+
+ @li The resulting type alias will be `net::const_buffer`.
+
+ @par Example
+ The following code returns the first buffer in a buffer sequence,
+ or generates a compilation error if the argument is not a buffer
+ sequence:
+ @code
+ template <class BufferSequence>
+ buffers_type <BufferSequence>
+ buffers_front (BufferSequence const& buffers)
+ {
+ static_assert(
+ net::is_const_buffer_sequence<BufferSequence>::value,
+ "BufferSequence type requirements not met");
+ auto const first = net::buffer_sequence_begin (buffers);
+ if (first == net::buffer_sequence_end (buffers))
+ return {};
+ return *first;
+ }
+ @endcode
+
+ @tparam BufferSequence A list of zero or more types to check. If this
+ list is empty, the resulting type alias will be `net::mutable_buffer`.
+*/
+template<class... BufferSequence>
+#if BOOST_BEAST_DOXYGEN
+using buffers_type = __see_below__;
+#else
+using buffers_type = typename std::conditional<
+ is_mutable_buffer_sequence<BufferSequence...>::value,
+ net::mutable_buffer, net::const_buffer>::type;
+#endif
+
+/** Type alias for the iterator type of a buffer sequence type.
+
+ This metafunction is used to determine the type of iterator
+ used by a particular buffer sequence.
+
+ @tparam T The buffer sequence type to use. The resulting
+ type alias will be equal to the iterator type used by
+ the buffer sequence.
+*/
+template <class BufferSequence>
+#if BOOST_BEAST_DOXYGEN
+using buffers_iterator_type = __see_below__;
+#elif BOOST_WORKAROUND(BOOST_MSVC, < 1910)
+using buffers_iterator_type = typename
+ detail::buffers_iterator_type_helper<
+ typename std::decay<BufferSequence>::type>::type;
+#else
+using buffers_iterator_type =
+ decltype(net::buffer_sequence_begin(
+ std::declval<BufferSequence const&>()));
+#endif
+
+/** Return the total number of bytes in a buffer or buffer sequence
+
+ This function returns the total number of bytes in a buffer,
+ buffer sequence, or object convertible to a buffer. Specifically
+ it may be passed:
+
+ @li A <em>ConstBufferSequence</em> or <em>MutableBufferSequence</em>
+
+ @li A `net::const_buffer` or `net::mutable_buffer`
+
+ @li An object convertible to `net::const_buffer`
+
+ This function is designed as an easier-to-use replacement for
+ `net::buffer_size`. It recognizes customization points found through
+ argument-dependent lookup. The call `beast::buffer_bytes(b)` is
+ equivalent to performing:
+ @code
+ using namespace net;
+ buffer_bytes(b);
+ @endcode
+ In addition this handles types which are convertible to
+ `net::const_buffer`; these are not handled by `net::buffer_size`.
+
+ @param buffers The buffer or buffer sequence to calculate the size of.
+
+ @return The total number of bytes in the buffer or sequence.
+*/
+#if BOOST_BEAST_DOXYGEN
+template<class BufferSequence>
+std::size_t
+buffer_bytes(BufferSequence const& buffers);
+#else
+BOOST_BEAST_INLINE_VARIABLE(buffer_bytes, detail::buffer_bytes_impl)
+#endif
+
+} // beast
+} // boost
+
+#endif