From 65827558b85a53e3e5bdf8fa11c2731012afe79f Mon Sep 17 00:00:00 2001 From: Damian Jarek Date: Wed, 21 Nov 2018 16:21:06 +0100 Subject: [PATCH] Simplify some type traits: Several type traits are simplified and optimized to reduce compile time and memory consumption. Signed-off-by: Damian Jarek --- CHANGELOG.md | 1 + .../boost/beast/core/detail/type_traits.hpp | 96 +++++++++++-------- test/beast/core/buffers_cat.cpp | 6 +- 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b96fded..9990c9be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Version 191: * Add bind_front_handler * Use bind_front_handler +* Simplify some type traits -------------------------------------------------------------------------------- diff --git a/include/boost/beast/core/detail/type_traits.hpp b/include/boost/beast/core/detail/type_traits.hpp index c389df5c..0c46efc9 100644 --- a/include/boost/beast/core/detail/type_traits.hpp +++ b/include/boost/beast/core/detail/type_traits.hpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -90,34 +91,6 @@ accept_rv(T){} //------------------------------------------------------------------------------ -template -struct repeat_tuple_impl -{ - using type = typename repeat_tuple_impl< - N - 1, T, T, Tn...>::type; -}; - -template -struct repeat_tuple_impl<0, T, Tn...> -{ - using type = std::tuple; -}; - -template -struct repeat_tuple -{ - using type = - typename repeat_tuple_impl::type; -}; - -template -struct repeat_tuple<0, T> -{ - using type = std::tuple<>; -}; - -//------------------------------------------------------------------------------ - template auto is_invocable_test(C&& c, int, A&& ...a) @@ -307,16 +280,9 @@ struct is_all_const_buffer_sequence { }; -template -struct common_buffers_type -{ - using type = typename std::conditional< - boost::is_convertible, - typename repeat_tuple::type>::value, - boost::asio::mutable_buffer, - boost::asio::const_buffer>::type; -}; +// +// Returns the iterator type of a buffer sequence +// template struct buffer_sequence_iterator @@ -326,6 +292,60 @@ struct buffer_sequence_iterator std::declval())); }; +template<> +struct buffer_sequence_iterator< + boost::asio::const_buffer> +{ + using type = boost::asio::const_buffer const*; +}; + +template<> +struct buffer_sequence_iterator< + boost::asio::mutable_buffer> +{ + using type = boost::asio::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< + boost::asio::const_buffer const*> +{ + using type = boost::asio::const_buffer; +}; + +template<> +struct buffer_sequence_value_type< + boost::asio::mutable_buffer const*> +{ + using type = boost::asio::mutable_buffer; +}; + +// + +template +struct common_buffers_type +{ + using type = typename std::conditional< + mp11::mp_and< + boost::is_convertible< + typename buffer_sequence_value_type::type, + boost::asio::mutable_buffer>...>::value, + boost::asio::mutable_buffer, + boost::asio::const_buffer>::type; +}; + // Types that meet the requirements, // for use with std::declval only. struct StreamHandler diff --git a/test/beast/core/buffers_cat.cpp b/test/beast/core/buffers_cat.cpp index f9feb93d..582a3687 100644 --- a/test/beast/core/buffers_cat.cpp +++ b/test/beast/core/buffers_cat.cpp @@ -224,7 +224,7 @@ public: using boost::beast::buffers_suffix; using boost::asio::buffer; using boost::asio::const_buffer; - + char out[64]; std::array buffers{ {buffer("Hello, "), buffer("world!")}}; @@ -283,8 +283,8 @@ public: mutable_buffer, decltype(buffers_cat( std::declval(), - std::declval(), - std::declval() + std::declval(), + std::declval>() ))::value_type>::value); // Ensure that concatenating mixed buffer