123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- //
- // 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 net::buffer_size;
- return buffer_size(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
|