1 // 2 // traits/bulk_execute_free.hpp 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef BOOST_ASIO_TRAITS_BULK_EXECUTE_FREE_HPP 12 #define BOOST_ASIO_TRAITS_BULK_EXECUTE_FREE_HPP 13 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 15 # pragma once 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 18 #include <boost/asio/detail/config.hpp> 19 #include <boost/asio/detail/type_traits.hpp> 20 21 #if defined(BOOST_ASIO_HAS_DECLTYPE) \ 22 && defined(BOOST_ASIO_HAS_NOEXCEPT) \ 23 && defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE) 24 # define BOOST_ASIO_HAS_DEDUCED_BULK_EXECUTE_FREE_TRAIT 1 25 #endif // defined(BOOST_ASIO_HAS_DECLTYPE) 26 // && defined(BOOST_ASIO_HAS_NOEXCEPT) 27 // && defined(BOOST_ASIO_HAS_WORKING_EXPRESSION_SFINAE) 28 29 #include <boost/asio/detail/push_options.hpp> 30 31 namespace boost { 32 namespace asio { 33 namespace traits { 34 35 template <typename T, typename F, typename N, typename = void> 36 struct bulk_execute_free_default; 37 38 template <typename T, typename F, typename N, typename = void> 39 struct bulk_execute_free; 40 41 } // namespace traits 42 namespace detail { 43 44 struct no_bulk_execute_free 45 { 46 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = false); 47 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false); 48 }; 49 50 #if defined(BOOST_ASIO_HAS_DEDUCED_BULK_EXECUTE_FREE_TRAIT) 51 52 template <typename T, typename F, typename N, typename = void> 53 struct bulk_execute_free_trait : no_bulk_execute_free 54 { 55 }; 56 57 template <typename T, typename F, typename N> 58 struct bulk_execute_free_trait<T, F, N, 59 typename void_type< 60 decltype(bulk_execute(declval<T>(), declval<F>(), declval<N>())) 61 >::type> 62 { 63 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true); 64 65 using result_type = decltype( 66 bulk_execute(declval<T>(), declval<F>(), declval<N>())); 67 68 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( 69 bulk_execute(declval<T>(), declval<F>(), declval<N>()))); 70 }; 71 72 #else // defined(BOOST_ASIO_HAS_DEDUCED_BULK_EXECUTE_FREE_TRAIT) 73 74 template <typename T, typename F, typename N, typename = void> 75 struct bulk_execute_free_trait : 76 conditional< 77 is_same<T, typename remove_reference<T>::type>::value 78 && is_same<F, typename decay<F>::type>::value 79 && is_same<N, typename decay<N>::type>::value, 80 typename conditional< 81 is_same<T, typename add_const<T>::type>::value, 82 no_bulk_execute_free, 83 traits::bulk_execute_free<typename add_const<T>::type, F, N> 84 >::type, 85 traits::bulk_execute_free< 86 typename remove_reference<T>::type, 87 typename decay<F>::type, 88 typename decay<N>::type> 89 >::type 90 { 91 }; 92 93 #endif // defined(BOOST_ASIO_HAS_DEDUCED_BULK_EXECUTE_FREE_TRAIT) 94 95 } // namespace detail 96 namespace traits { 97 98 template <typename T, typename F, typename N, typename> 99 struct bulk_execute_free_default : 100 detail::bulk_execute_free_trait<T, F, N> 101 { 102 }; 103 104 template <typename T, typename F, typename N, typename> 105 struct bulk_execute_free : 106 bulk_execute_free_default<T, F, N> 107 { 108 }; 109 110 } // namespace traits 111 } // namespace asio 112 } // namespace boost 113 114 #include <boost/asio/detail/pop_options.hpp> 115 116 #endif // BOOST_ASIO_TRAITS_BULK_EXECUTE_FREE_HPP 117