1 // 2 // traits/require_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 ASIO_TRAITS_REQUIRE_MEMBER_HPP 12 #define ASIO_TRAITS_REQUIRE_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 "asio/detail/config.hpp" 19 #include "asio/detail/type_traits.hpp" 20 21 #if defined(ASIO_HAS_DECLTYPE) \ 22 && defined(ASIO_HAS_NOEXCEPT) \ 23 && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE) 24 # define ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT 1 25 #endif // defined(ASIO_HAS_DECLTYPE) 26 // && defined(ASIO_HAS_NOEXCEPT) 27 // && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE) 28 29 #include "asio/detail/push_options.hpp" 30 31 namespace asio { 32 namespace traits { 33 34 template <typename T, typename Property, typename = void> 35 struct require_member_default; 36 37 template <typename T, typename Property, typename = void> 38 struct require_member; 39 40 } // namespace traits 41 namespace detail { 42 43 struct no_require_member 44 { 45 ASIO_STATIC_CONSTEXPR(bool, is_valid = false); 46 ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false); 47 }; 48 49 #if defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) 50 51 template <typename T, typename Property, typename = void> 52 struct require_member_trait : no_require_member 53 { 54 }; 55 56 template <typename T, typename Property> 57 struct require_member_trait<T, Property, 58 typename void_type< 59 decltype(declval<T>().require(declval<Property>())) 60 >::type> 61 { 62 ASIO_STATIC_CONSTEXPR(bool, is_valid = true); 63 64 using result_type = decltype( 65 declval<T>().require(declval<Property>())); 66 67 ASIO_STATIC_CONSTEXPR(bool, is_noexcept = noexcept( 68 declval<T>().require(declval<Property>()))); 69 }; 70 71 #else // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) 72 73 template <typename T, typename Property, typename = void> 74 struct require_member_trait : 75 conditional< 76 is_same<T, typename decay<T>::type>::value 77 && is_same<Property, typename decay<Property>::type>::value, 78 no_require_member, 79 traits::require_member< 80 typename decay<T>::type, 81 typename decay<Property>::type> 82 >::type 83 { 84 }; 85 86 #endif // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) 87 88 } // namespace detail 89 namespace traits { 90 91 template <typename T, typename Property, typename> 92 struct require_member_default : 93 detail::require_member_trait<T, Property> 94 { 95 }; 96 97 template <typename T, typename Property, typename> 98 struct require_member : 99 require_member_default<T, Property> 100 { 101 }; 102 103 } // namespace traits 104 } // namespace asio 105 106 #include "asio/detail/pop_options.hpp" 107 108 #endif // ASIO_TRAITS_REQUIRE_MEMBER_HPP 109