File indexing completed on 2025-01-18 09:38:14
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_HOF_GUARD_INTRINSICS_HPP
0009 #define BOOST_HOF_GUARD_INTRINSICS_HPP
0010
0011 #include <type_traits>
0012 #include <boost/hof/detail/holder.hpp>
0013 #include <boost/hof/config.hpp>
0014
0015
0016 #if defined(__clang__)
0017
0018
0019
0020 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__)
0021 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) __is_nothrow_constructible(__VA_ARGS__)
0022 #define BOOST_HOF_IS_CONVERTIBLE(...) __is_convertible_to(__VA_ARGS__)
0023 #define BOOST_HOF_IS_BASE_OF(...) __is_base_of(__VA_ARGS__)
0024 #define BOOST_HOF_IS_CLASS(...) __is_class(__VA_ARGS__)
0025 #define BOOST_HOF_IS_EMPTY(...) __is_empty(__VA_ARGS__)
0026 #define BOOST_HOF_IS_LITERAL(...) __is_literal(__VA_ARGS__)
0027 #define BOOST_HOF_IS_POLYMORPHIC(...) __is_polymorphic(__VA_ARGS__)
0028 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__)
0029 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__)
0030
0031 #elif defined(__GNUC__)
0032 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value
0033 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value
0034 #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value
0035 #define BOOST_HOF_IS_BASE_OF(...) __is_base_of(__VA_ARGS__)
0036 #define BOOST_HOF_IS_CLASS(...) __is_class(__VA_ARGS__)
0037 #define BOOST_HOF_IS_EMPTY(...) __is_empty(__VA_ARGS__)
0038 #define BOOST_HOF_IS_LITERAL(...) __is_literal_type(__VA_ARGS__)
0039 #define BOOST_HOF_IS_POLYMORPHIC(...) __is_polymorphic(__VA_ARGS__)
0040 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__)
0041 #if __GNUC__ == 4 && __GNUC_MINOR__ < 7
0042 #define BOOST_HOF_IS_FINAL(...) (false)
0043 #else
0044 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__)
0045 #endif
0046 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__)
0047
0048 #else
0049 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value
0050 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value
0051 #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value
0052 #define BOOST_HOF_IS_BASE_OF(...) std::is_base_of<__VA_ARGS__>::value
0053 #define BOOST_HOF_IS_CLASS(...) std::is_class<__VA_ARGS__>::value
0054 #define BOOST_HOF_IS_EMPTY(...) std::is_empty<__VA_ARGS__>::value
0055 #ifdef _MSC_VER
0056 #define BOOST_HOF_IS_LITERAL(...) __is_literal_type(__VA_ARGS__)
0057 #else
0058 #define BOOST_HOF_IS_LITERAL(...) std::is_literal_type<__VA_ARGS__>::value
0059 #endif
0060 #define BOOST_HOF_IS_POLYMORPHIC(...) std::is_polymorphic<__VA_ARGS__>::value
0061 #if defined(_MSC_VER)
0062 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) (std::is_nothrow_copy_constructible<__VA_ARGS__>::value || std::is_reference<__VA_ARGS__>::value)
0063 #else
0064 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) std::is_nothrow_copy_constructible<__VA_ARGS__>::value
0065 #endif
0066 #if defined(_MSC_VER)
0067 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__)
0068 #else
0069 #define BOOST_HOF_IS_FINAL(...) (false)
0070 #endif
0071 #endif
0072
0073 #if BOOST_HOF_NO_STD_DEFAULT_CONSTRUCTIBLE
0074 #define BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE(...) boost::hof::detail::is_default_constructible_helper<__VA_ARGS__>::value
0075 #else
0076 #define BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE BOOST_HOF_IS_CONSTRUCTIBLE
0077 #endif
0078
0079 #define BOOST_HOF_IS_NOTHROW_MOVE_CONSTRUCTIBLE(...) BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(__VA_ARGS__, __VA_ARGS__ &&)
0080
0081 namespace boost { namespace hof { namespace detail {
0082
0083 template<class T, class=void>
0084 struct is_default_constructible_check
0085 : std::false_type
0086 {};
0087
0088 template<class T>
0089 struct is_default_constructible_check<T, typename holder<
0090 decltype(T())
0091 >::type>
0092 : std::true_type
0093 {};
0094
0095 template<class T>
0096 struct is_default_constructible_helper
0097 : std::conditional<(std::is_reference<T>::value),
0098 std::false_type,
0099 is_default_constructible_check<T>
0100 >::type
0101 {};
0102
0103 template<class T, class... Xs>
0104 struct is_constructible
0105 : std::is_constructible<T, Xs...>
0106 {};
0107
0108 template<class T>
0109 struct is_constructible<T>
0110 : is_default_constructible_helper<T>
0111 {};
0112
0113 }
0114
0115 }}
0116
0117 #endif