From fa14af2696b3f3e4c5a18bd8686ee16de9030f37 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sat, 15 Dec 2018 12:04:39 -0800 Subject: [PATCH] Use new buffer traits, remove old unused traits --- CHANGELOG.md | 1 + include/boost/beast/core/buffer_traits.hpp | 31 ++++---- include/boost/beast/core/buffers_adaptor.hpp | 8 +- include/boost/beast/core/buffers_cat.hpp | 14 ++-- include/boost/beast/core/buffers_prefix.hpp | 59 +++++++------- include/boost/beast/core/buffers_range.hpp | 2 +- include/boost/beast/core/buffers_suffix.hpp | 20 +++-- .../boost/beast/core/detail/buffers_pair.hpp | 3 +- ...rs_range.hpp => buffers_range_adaptor.hpp} | 30 +++---- .../boost/beast/core/detail/buffers_ref.hpp | 14 ++-- .../boost/beast/core/detail/type_traits.hpp | 78 ------------------- include/boost/beast/core/impl/buffers_cat.hpp | 9 +-- .../boost/beast/core/impl/buffers_prefix.hpp | 29 +++++-- .../boost/beast/core/impl/buffers_suffix.hpp | 29 +++---- test/beast/core/buffer_traits.cpp | 20 +++++ 15 files changed, 148 insertions(+), 199 deletions(-) rename include/boost/beast/core/detail/{buffers_range.hpp => buffers_range_adaptor.hpp} (81%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54faa28f..1f898e2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Version 200 * Refactor buffers_prefix * Add const and mutable buffer sequence traits * Add buffers_iterator_type trait +* Use new buffer traits, remove old unused traits API Changes: diff --git a/include/boost/beast/core/buffer_traits.hpp b/include/boost/beast/core/buffer_traits.hpp index 033ca778..5f69043d 100644 --- a/include/boost/beast/core/buffer_traits.hpp +++ b/include/boost/beast/core/buffer_traits.hpp @@ -22,7 +22,7 @@ namespace beast { /** Determine if a list of types satisfy the ConstBufferSequence requirements. This metafunction is used to determine if all of the specified types - meet the requirements for const buffer sequences. This type alias + 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`. @@ -36,7 +36,8 @@ struct is_const_buffer_sequence : __see_below__ {}; #else template using is_const_buffer_sequence = mp11::mp_all< - net::is_const_buffer_sequence...>; + net::is_const_buffer_sequence< + typename std::decay::type>...>; #endif /** Determine if a list of types satisfy the MutableBufferSequence requirements. @@ -56,7 +57,8 @@ struct is_mutable_buffer_sequence : __see_below__ {}; #else template using is_mutable_buffer_sequence = mp11::mp_all< - net::is_mutable_buffer_sequence...>; + net::is_mutable_buffer_sequence< + typename std::decay::type>...>; #endif /** Type alias for the underlying buffer type of a list of buffer sequence types. @@ -97,16 +99,14 @@ template struct buffers_type : __see_below__ {}; //using buffers_type = __see_below__; #else -using buffers_type = typename - std::conditional< - is_mutable_buffer_sequence::value, - net::mutable_buffer, - net::const_buffer>::type; +using buffers_type = typename std::conditional< + is_mutable_buffer_sequence::value, + net::mutable_buffer, net::const_buffer>::type; #endif -namespace detail { +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) -// VFALCO This is a workaround for MSVC.v140 +namespace detail { template struct buffers_iterator_type_helper { @@ -131,6 +131,8 @@ struct buffers_iterator_type_helper< } // detail +#endif + /** Type alias for the iterator type of a buffer sequence type. This metafunction is used to determine the type of iterator @@ -144,15 +146,14 @@ template #if BOOST_BEAST_DOXYGEN struct buffers_iterator_type : __see_below__ {}; //using buffers_iterator_type = __see_below__; -#else -# if BOOST_WORKAROUND(BOOST_MSVC, < 1910) +#elif BOOST_WORKAROUND(BOOST_MSVC, < 1910) using buffers_iterator_type = typename - detail::buffers_iterator_type_helper::type; -# else + detail::buffers_iterator_type_helper< + typename std::decay::type>::type; +#else using buffers_iterator_type = decltype(net::buffer_sequence_begin( std::declval())); -# endif #endif } // beast diff --git a/include/boost/beast/core/buffers_adaptor.hpp b/include/boost/beast/core/buffers_adaptor.hpp index 78462962..46b30d6e 100644 --- a/include/boost/beast/core/buffers_adaptor.hpp +++ b/include/boost/beast/core/buffers_adaptor.hpp @@ -11,8 +11,7 @@ #define BOOST_BEAST_BUFFERS_ADAPTOR_HPP #include -#include -#include +#include #include #include @@ -40,9 +39,8 @@ class buffers_adaptor MutableBufferSequence>::value, "MutableBufferSequence requirements not met"); - using iter_type = typename - detail::buffer_sequence_iterator< - MutableBufferSequence>::type; + using iter_type = + buffers_iterator_type; template class readable_bytes; diff --git a/include/boost/beast/core/buffers_cat.hpp b/include/boost/beast/core/buffers_cat.hpp index 4576b392..7cb778bd 100644 --- a/include/boost/beast/core/buffers_cat.hpp +++ b/include/boost/beast/core/buffers_cat.hpp @@ -11,6 +11,7 @@ #define BOOST_BEAST_BUFFERS_CAT_HPP #include +#include #include #include @@ -34,10 +35,9 @@ public: Otherwise, `value_type` will be `net::const_buffer`. */ #if BOOST_BEAST_DOXYGEN - using value_type = __implementation_defined__; + using value_type = __see_below__; #else - using value_type = typename - detail::common_buffers_type::type; + using value_type = buffers_type; #endif /// The type of iterator used by the concatenated sequence @@ -53,8 +53,8 @@ public: @param buffers The list of buffer sequences to concatenate. Copies of the arguments will be maintained for the lifetime - of the concatenated sequence; however, the ownership of memory - is not transferred. + of the concatenated sequence; however, the ownership of the + memory buffers themselves is not transferred. */ explicit buffers_cat_view(Buffers const&... buffers); @@ -98,8 +98,8 @@ buffers_cat(B1 const& b1, B2 const& b2, Bn const&... bn) #endif { static_assert( - detail::is_all_const_buffer_sequence::value, - "BufferSequence requirements not met"); + is_const_buffer_sequence::value, + "BufferSequence requirements not met"); return buffers_cat_view{b1, b2, bn...}; } diff --git a/include/boost/beast/core/buffers_prefix.hpp b/include/boost/beast/core/buffers_prefix.hpp index 66017458..76a034e3 100644 --- a/include/boost/beast/core/buffers_prefix.hpp +++ b/include/boost/beast/core/buffers_prefix.hpp @@ -12,12 +12,15 @@ #include #include -#include #include // for in_place_init_t #include #include #include +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) +#include +#endif + namespace boost { namespace beast { @@ -27,16 +30,15 @@ namespace beast { a shorter subset of the original list of buffers starting with the first byte of the original sequence. - @tparam ConstBufferSequence The buffer sequence to adapt. + @tparam BufferSequence The buffer sequence to adapt. */ -template +template class buffers_prefix_view { - using iter_type = typename - detail::buffer_sequence_iterator< - ConstBufferSequence>::type; + using iter_type = + buffers_iterator_type; - ConstBufferSequence bs_; + BufferSequence bs_; std::size_t size_; std::size_t remain_; iter_type end_; @@ -51,16 +53,24 @@ class buffers_prefix_view public: /** The type for each element in the list of buffers. - If the type of the underlying sequence is a mutable buffer - sequence, then `value_type` is `net::mutable_buffer`. Otherwise, - `value_type` is `net::const_buffer`. + If the type `BufferSequence` meets the requirements of + MutableBufferSequence, then `value_type` is + `net::mutable_buffer`. Otherwise, `value_type` is + `net::const_buffer`. @see buffers_type */ #if BOOST_BEAST_DOXYGEN using value_type = __see_below__; +#elif BOOST_WORKAROUND(BOOST_MSVC, < 1910) + using value_type = typename std::conditional< + boost::is_convertible::value_type, + net::mutable_buffer>::value, + net::mutable_buffer, + net::const_buffer>::type; #else - using value_type = buffers_type; + using value_type = buffers_type; #endif #if BOOST_BEAST_DOXYGEN @@ -92,7 +102,7 @@ public: */ buffers_prefix_view( std::size_t size, - ConstBufferSequence const& buffers); + BufferSequence const& buffers); /** Construct a buffer sequence prefix in-place. @@ -152,25 +162,25 @@ buffer_size(buffers_prefix_view< size as the original buffer sequence. @param buffers An object whose type meets the requirements - of ConstBufferSequence. The returned value will + of BufferSequence. The returned value will maintain a copy of the passed buffers for its lifetime; however, ownership of the underlying memory is not transferred. @return A constant buffer sequence that represents the prefix of the original buffer sequence. If the original buffer sequence - also meets the requirements of MutableConstBufferSequence, + also meets the requirements of MutableBufferSequence, then the returned value will also be a mutable buffer sequence. */ -template -buffers_prefix_view +template +buffers_prefix_view buffers_prefix( - std::size_t size, ConstBufferSequence const& buffers) + std::size_t size, BufferSequence const& buffers) { static_assert( - net::is_const_buffer_sequence::value, - "ConstBufferSequence requirements not met"); - return buffers_prefix_view(size, buffers); + net::is_const_buffer_sequence::value, + "BufferSequence requirements not met"); + return buffers_prefix_view(size, buffers); } /** Returns the first buffer in a buffer sequence @@ -183,12 +193,9 @@ buffers_prefix( mutable, the returned buffer sequence will also be mutable. Otherwise, the returned buffer sequence will be constant. */ -template -typename std::conditional< - net::is_mutable_buffer_sequence::value, - net::mutable_buffer, - net::const_buffer>::type -buffers_front(ConstBufferSequence const& buffers) +template +buffers_type +buffers_front(BufferSequence const& buffers) { auto const first = net::buffer_sequence_begin(buffers); diff --git a/include/boost/beast/core/buffers_range.hpp b/include/boost/beast/core/buffers_range.hpp index 1e6bcd69..1d0c882e 100644 --- a/include/boost/beast/core/buffers_range.hpp +++ b/include/boost/beast/core/buffers_range.hpp @@ -11,7 +11,7 @@ #define BOOST_BEAST_BUFFERS_RANGE_HPP #include -#include +#include #include #include diff --git a/include/boost/beast/core/buffers_suffix.hpp b/include/boost/beast/core/buffers_suffix.hpp index 61ea1f77..4a9ecd08 100644 --- a/include/boost/beast/core/buffers_suffix.hpp +++ b/include/boost/beast/core/buffers_suffix.hpp @@ -11,8 +11,7 @@ #define BOOST_BEAST_BUFFERS_SUFFIX_HPP #include -#include -#include +#include #include #include #include @@ -53,11 +52,8 @@ namespace beast { template class buffers_suffix { - using buffers_type = - typename std::decay::type; - - using iter_type = typename - detail::buffer_sequence_iterator::type; + using iter_type = + buffers_iterator_type; BufferSequence bs_; iter_type begin_; @@ -76,20 +72,22 @@ class buffers_suffix public: /** The type for each element in the list of buffers. - If the buffers in the underlying sequence are convertible to - `net::mutable_buffer`, then this type will be - `net::mutable_buffer`, else this type will be + If BufferSequence meets the requirements of + MutableBufferSequence, then this type will be + `net::mutable_buffer`, otherwise this type will be `net::const_buffer`. */ #if BOOST_BEAST_DOXYGEN using value_type = __implementation_defined__; -#else +#elif 0 using value_type = typename std::conditional< std::is_convertible::value_type, net::mutable_buffer>::value, net::mutable_buffer, net::const_buffer>::type; +#else + using value_type = buffers_type; #endif #if BOOST_BEAST_DOXYGEN diff --git a/include/boost/beast/core/detail/buffers_pair.hpp b/include/boost/beast/core/detail/buffers_pair.hpp index 8b557cd8..79033629 100644 --- a/include/boost/beast/core/detail/buffers_pair.hpp +++ b/include/boost/beast/core/detail/buffers_pair.hpp @@ -39,7 +39,8 @@ public: using const_iterator = value_type const*; buffers_pair() = default; -#if defined(BOOST_MSVC) && BOOST_MSVC < 1910 + +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) buffers_pair(buffers_pair const& other) : buffers_pair( *other.begin(), *(other.begin() + 1)) diff --git a/include/boost/beast/core/detail/buffers_range.hpp b/include/boost/beast/core/detail/buffers_range_adaptor.hpp similarity index 81% rename from include/boost/beast/core/detail/buffers_range.hpp rename to include/boost/beast/core/detail/buffers_range_adaptor.hpp index 3ee56fbe..3c9d75f5 100644 --- a/include/boost/beast/core/detail/buffers_range.hpp +++ b/include/boost/beast/core/detail/buffers_range_adaptor.hpp @@ -7,11 +7,10 @@ // Official repository: https://github.com/boostorg/beast // -#ifndef BOOST_BEAST_DETAIL_BUFFERS_RANGE_HPP -#define BOOST_BEAST_DETAIL_BUFFERS_RANGE_HPP +#ifndef BOOST_BEAST_DETAIL_BUFFERS_RANGE_ADAPTOR_HPP +#define BOOST_BEAST_DETAIL_BUFFERS_RANGE_ADAPTOR_HPP -#include -#include +#include #include #include @@ -28,22 +27,15 @@ 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, - net::mutable_buffer>::value, - net::mutable_buffer, - net::const_buffer>::type; + using value_type = buffers_type; #endif class const_iterator { friend class buffers_range_adaptor; - using iter_type = typename - buffer_sequence_iterator::type; + using iter_type = + buffers_iterator_type; iter_type it_; buffers_range_adaptor const* b_ = nullptr; @@ -119,17 +111,17 @@ public: } }; + buffers_range_adaptor( + buffers_range_adaptor const&) = default; + buffers_range_adaptor& operator=( + buffers_range_adaptor const&) = default; + explicit buffers_range_adaptor(BufferSequence const& b) : b_(b) { } - buffers_range_adaptor( - buffers_range_adaptor const&) = default; - buffers_range_adaptor& operator=( - buffers_range_adaptor const&) = default; - const_iterator begin() const noexcept { diff --git a/include/boost/beast/core/detail/buffers_ref.hpp b/include/boost/beast/core/detail/buffers_ref.hpp index c2552e08..a2a61166 100644 --- a/include/boost/beast/core/detail/buffers_ref.hpp +++ b/include/boost/beast/core/detail/buffers_ref.hpp @@ -10,8 +10,9 @@ #ifndef BOOST_BEAST_DETAIL_BUFFERS_REF_HPP #define BOOST_BEAST_DETAIL_BUFFERS_REF_HPP -#include +#include #include +#include namespace boost { namespace beast { @@ -24,11 +25,11 @@ class buffers_ref BufferSequence const* buffers_; public: - using const_iterator = typename - buffer_sequence_iterator::type; + using const_iterator = + buffers_iterator_type; - using value_type = typename std::iterator_traits< - const_iterator>::value_type; + using value_type = typename + std::iterator_traits::value_type; buffers_ref(buffers_ref const&) = default; buffers_ref& operator=(buffers_ref const&) = default; @@ -57,6 +58,9 @@ template buffers_ref make_buffers_ref(BufferSequence const& buffers) { + static_assert( + is_const_buffer_sequence::value, + "BufferSequence requirements not met"); return buffers_ref(buffers); } diff --git a/include/boost/beast/core/detail/type_traits.hpp b/include/boost/beast/core/detail/type_traits.hpp index e0bcb841..dce213d0 100644 --- a/include/boost/beast/core/detail/type_traits.hpp +++ b/include/boost/beast/core/detail/type_traits.hpp @@ -197,85 +197,7 @@ using ConstBufferSequence = using MutableBufferSequence = BufferSequence; -template -struct is_all_const_buffer_sequence - : std::integral_constant::value && - is_all_const_buffer_sequence::value> -{ -}; - -template -struct is_all_const_buffer_sequence - : net::is_const_buffer_sequence -{ -}; - // -// Returns the iterator type of a buffer sequence -// - -template -struct buffer_sequence_iterator -{ - using type = decltype( - net::buffer_sequence_begin( - std::declval())); -}; - -template<> -struct buffer_sequence_iterator< - net::const_buffer> -{ - using type = net::const_buffer const*; -}; - -template<> -struct buffer_sequence_iterator< - net::mutable_buffer> -{ - using type = net::mutable_buffer const*; -}; - -// -// Returns the value type of the iterator of a buffer sequence -// - -template -struct buffer_sequence_value_type -{ - using type = typename std::iterator_traits< - typename buffer_sequence_iterator::type - >::value_type; -}; - -template<> -struct buffer_sequence_value_type< - net::const_buffer const*> -{ - using type = net::const_buffer; -}; - -template<> -struct buffer_sequence_value_type< - net::mutable_buffer const*> -{ - using type = net::mutable_buffer; -}; - -// - -template -struct common_buffers_type -{ - using type = typename std::conditional< - mp11::mp_and< - boost::is_convertible< - typename buffer_sequence_value_type::type, - net::mutable_buffer>...>::value, - net::mutable_buffer, - net::const_buffer>::type; -}; // Types that meet the requirements, // for use with std::declval only. diff --git a/include/boost/beast/core/impl/buffers_cat.hpp b/include/boost/beast/core/impl/buffers_cat.hpp index 9e86d686..0dd04858 100644 --- a/include/boost/beast/core/impl/buffers_cat.hpp +++ b/include/boost/beast/core/impl/buffers_cat.hpp @@ -59,9 +59,8 @@ class buffers_cat_view::const_iterator "A minimum of two sequences are required"); detail::tuple const* bn_ = nullptr; - detail::variant::type..., - past_end> it_; + detail::variant< + buffers_iterator_type..., past_end> it_; friend class buffers_cat_view; @@ -69,8 +68,8 @@ class buffers_cat_view::const_iterator using C = std::integral_constant; public: - using value_type = typename - detail::common_buffers_type::type; + using value_type = + typename buffers_cat_view::value_type; using pointer = value_type const*; using reference = value_type; using difference_type = std::ptrdiff_t; diff --git a/include/boost/beast/core/impl/buffers_prefix.hpp b/include/boost/beast/core/impl/buffers_prefix.hpp index f5b99da3..36f21ab4 100644 --- a/include/boost/beast/core/impl/buffers_prefix.hpp +++ b/include/boost/beast/core/impl/buffers_prefix.hpp @@ -10,6 +10,7 @@ #ifndef BOOST_BEAST_IMPL_BUFFERS_PREFIX_HPP #define BOOST_BEAST_IMPL_BUFFERS_PREFIX_HPP +#include #include #include #include @@ -30,12 +31,21 @@ class buffers_prefix_view::const_iterator iter_type it_; public: +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) using value_type = typename std::conditional< boost::is_convertible::value_type, net::mutable_buffer>::value, net::mutable_buffer, net::const_buffer>::type; +#else + using value_type = buffers_type; +#endif + + BOOST_STATIC_ASSERT(std::is_same< + typename const_iterator::value_type, + typename buffers_prefix_view::value_type>::value); + using pointer = value_type const*; using reference = value_type; using difference_type = std::ptrdiff_t; @@ -61,7 +71,9 @@ public: reference operator*() const { - return beast::buffers_prefix(remain_, *it_); + value_type v(*it_); + return { v.data(), + remain_ < v.size() ? remain_ : v.size()}; } pointer @@ -70,7 +82,8 @@ public: const_iterator& operator++() { - remain_ -= net::buffer_size(*it_++); + value_type const v = *it_++; + remain_ -= v.size(); return *this; } @@ -78,14 +91,16 @@ public: operator++(int) { auto temp = *this; - remain_ -= net::buffer_size(*it_++); + value_type const v = *it_++; + remain_ -= v.size(); return temp; } const_iterator& operator--() { - remain_ += net::buffer_size(*--it_); + value_type const v = *--it_; + remain_ += v.size(); return *this; } @@ -93,7 +108,8 @@ public: operator--(int) { auto temp = *this; - remain_ += net::buffer_size(*--it_); + value_type const v = *--it_; + remain_ += v.size(); return temp; } @@ -130,8 +146,7 @@ setup(std::size_t size) auto const last = bs_.end(); while(end_ != last) { - auto const len = - net::const_buffer(*end_++).size(); + auto const len = net::buffer_size(*end_++); if(len >= size) { size_ += size; diff --git a/include/boost/beast/core/impl/buffers_suffix.hpp b/include/boost/beast/core/impl/buffers_suffix.hpp index 06957b11..fb056e4c 100644 --- a/include/boost/beast/core/impl/buffers_suffix.hpp +++ b/include/boost/beast/core/impl/buffers_suffix.hpp @@ -10,7 +10,7 @@ #ifndef BOOST_BEAST_IMPL_BUFFERS_SUFFIX_HPP #define BOOST_BEAST_IMPL_BUFFERS_SUFFIX_HPP -#include +#include #include #include #include @@ -26,19 +26,22 @@ class buffers_suffix::const_iterator { friend class buffers_suffix; - using iter_type = typename - detail::buffer_sequence_iterator::type; + using iter_type = buffers_iterator_type; iter_type it_; buffers_suffix const* b_ = nullptr; public: +#if BOOST_WORKAROUND(BOOST_MSVC, < 1910) using value_type = typename std::conditional< boost::is_convertible::value_type, net::mutable_buffer>::value, net::mutable_buffer, net::const_buffer>::type; +#else + using value_type = buffers_type; +#endif using pointer = value_type const*; using reference = value_type; using difference_type = std::ptrdiff_t; @@ -54,20 +57,7 @@ public: bool operator==(const_iterator const& other) const { - return - (b_ == nullptr) ? - ( - other.b_ == nullptr || - other.it_ == net::buffer_sequence_end(other.b_->bs_) - ):( - (other.b_ == nullptr) ? - ( - it_ == net::buffer_sequence_end(b_->bs_) - ): ( - b_ == other.b_ && - it_ == other.it_ - ) - ); + return b_ == other.b_ && it_ == other.it_; } bool @@ -118,8 +108,9 @@ public: } private: - const_iterator(buffers_suffix const& b, - iter_type it) + const_iterator( + buffers_suffix const& b, + iter_type it) : it_(it) , b_(&b) { diff --git a/test/beast/core/buffer_traits.cpp b/test/beast/core/buffer_traits.cpp index 5c4785d8..20a5c143 100644 --- a/test/beast/core/buffer_traits.cpp +++ b/test/beast/core/buffer_traits.cpp @@ -40,6 +40,18 @@ public: net::mutable_buffer, net::mutable_buffer >::value); + BOOST_STATIC_ASSERT(is_const_buffer_sequence< + net::const_buffer const& + >::value); + + BOOST_STATIC_ASSERT(is_const_buffer_sequence< + net::const_buffer const&, net::const_buffer const& + >::value); + + BOOST_STATIC_ASSERT(is_const_buffer_sequence< + net::const_buffer const&, net::mutable_buffer const& + >::value); + // is_mutable_buffer_sequence BOOST_STATIC_ASSERT(is_mutable_buffer_sequence< @@ -61,6 +73,14 @@ public: net::const_buffer, net::mutable_buffer >::value); + BOOST_STATIC_ASSERT(is_mutable_buffer_sequence< + net::mutable_buffer const& + >::value); + + BOOST_STATIC_ASSERT(is_mutable_buffer_sequence< + net::mutable_buffer const&, net::mutable_buffer const& + >::value); + // buffers_type BOOST_STATIC_ASSERT(