1 // 2 // traits/execute_member.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_EXECUTE_MEMBER_HPP 12 #define BOOST_ASIO_TRAITS_EXECUTE_MEMBER_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_EXECUTE_MEMBER_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 = void> 36 struct execute_member_default; 37 38 template <typename T, typename F, typename = void> 39 struct execute_member; 40 41 } // namespace traits 42 namespace detail { 43 44 struct no_execute_member 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_EXECUTE_MEMBER_TRAIT) 51 52 template <typename T, typename F, typename = void> 53 struct execute_member_trait : no_execute_member 54 { 55 }; 56 57 template <typename T, typename F> 58 struct execute_member_trait<T, F, 59 typename void_type< 60 decltype(declval<T>().execute(declval<F>())) 61 >::type> 62 { 63 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true); 64 65 using result_type = decltype( 66 declval<T>().execute(declval<F>())); 67 68 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( 69 declval<T>().execute(declval<F>()))); 70 }; 71 72 #else // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) 73 74 template <typename T, typename F, typename = void> 75 struct execute_member_trait : 76 conditional< 77 is_same<T, typename decay<T>::type>::value 78 && is_same<F, typename decay<F>::type>::value, 79 no_execute_member, 80 traits::execute_member< 81 typename decay<T>::type, 82 typename decay<F>::type> 83 >::type 84 { 85 }; 86 87 #endif // defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) 88 89 } // namespace detail 90 namespace traits { 91 92 template <typename T, typename F, typename> 93 struct execute_member_default : 94 detail::execute_member_trait<T, F> 95 { 96 }; 97 98 template <typename T, typename F, typename> 99 struct execute_member : 100 execute_member_default<T, F> 101 { 102 }; 103 104 } // namespace traits 105 } // namespace asio 106 } // namespace boost 107 108 #include <boost/asio/detail/pop_options.hpp> 109 110 #endif // BOOST_ASIO_TRAITS_EXECUTE_MEMBER_HPP 111