1 /*============================================================================= 2 Copyright (c) 2016 Paul Fultz II 3 intrinsics.hpp 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 8 #ifndef BOOST_HOF_GUARD_INTRINSICS_HPP 9 #define BOOST_HOF_GUARD_INTRINSICS_HPP 10 11 #include <type_traits> 12 #include <boost/hof/detail/holder.hpp> 13 #include <boost/hof/config.hpp> 14 15 // *** clang *** 16 #if defined(__clang__) 17 // #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value 18 // #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value 19 // #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value 20 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__) 21 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) __is_nothrow_constructible(__VA_ARGS__) 22 #define BOOST_HOF_IS_CONVERTIBLE(...) __is_convertible_to(__VA_ARGS__) 23 #define BOOST_HOF_IS_BASE_OF(...) __is_base_of(__VA_ARGS__) 24 #define BOOST_HOF_IS_CLASS(...) __is_class(__VA_ARGS__) 25 #define BOOST_HOF_IS_EMPTY(...) __is_empty(__VA_ARGS__) 26 #define BOOST_HOF_IS_LITERAL(...) __is_literal(__VA_ARGS__) 27 #define BOOST_HOF_IS_POLYMORPHIC(...) __is_polymorphic(__VA_ARGS__) 28 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__) 29 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__) 30 // *** gcc *** 31 #elif defined(__GNUC__) 32 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value 33 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value 34 #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value 35 #define BOOST_HOF_IS_BASE_OF(...) __is_base_of(__VA_ARGS__) 36 #define BOOST_HOF_IS_CLASS(...) __is_class(__VA_ARGS__) 37 #define BOOST_HOF_IS_EMPTY(...) __is_empty(__VA_ARGS__) 38 #define BOOST_HOF_IS_LITERAL(...) __is_literal_type(__VA_ARGS__) 39 #define BOOST_HOF_IS_POLYMORPHIC(...) __is_polymorphic(__VA_ARGS__) 40 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__) 41 #if __GNUC__ == 4 && __GNUC_MINOR__ < 7 42 #define BOOST_HOF_IS_FINAL(...) (false) 43 #else 44 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__) 45 #endif 46 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) __has_nothrow_copy(__VA_ARGS__) 47 // *** other *** 48 #else 49 #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value 50 #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value 51 #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value 52 #define BOOST_HOF_IS_BASE_OF(...) std::is_base_of<__VA_ARGS__>::value 53 #define BOOST_HOF_IS_CLASS(...) std::is_class<__VA_ARGS__>::value 54 #define BOOST_HOF_IS_EMPTY(...) std::is_empty<__VA_ARGS__>::value 55 #define BOOST_HOF_IS_LITERAL(...) std::is_literal_type<__VA_ARGS__>::value 56 #define BOOST_HOF_IS_POLYMORPHIC(...) std::is_polymorphic<__VA_ARGS__>::value 57 #if defined(_MSC_VER) 58 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) (std::is_nothrow_copy_constructible<__VA_ARGS__>::value || std::is_reference<__VA_ARGS__>::value) 59 #else 60 #define BOOST_HOF_IS_NOTHROW_COPY_CONSTRUCTIBLE(...) std::is_nothrow_copy_constructible<__VA_ARGS__>::value 61 #endif 62 #if defined(_MSC_VER) 63 #define BOOST_HOF_IS_FINAL(...) __is_final(__VA_ARGS__) 64 #else 65 #define BOOST_HOF_IS_FINAL(...) (false) 66 #endif 67 #endif 68 69 #if BOOST_HOF_NO_STD_DEFAULT_CONSTRUCTIBLE 70 #define BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE(...) boost::hof::detail::is_default_constructible_helper<__VA_ARGS__>::value 71 #else 72 #define BOOST_HOF_IS_DEFAULT_CONSTRUCTIBLE BOOST_HOF_IS_CONSTRUCTIBLE 73 #endif 74 75 #define BOOST_HOF_IS_NOTHROW_MOVE_CONSTRUCTIBLE(...) BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(__VA_ARGS__, __VA_ARGS__ &&) 76 77 namespace boost { namespace hof { namespace detail { 78 79 template<class T, class=void> 80 struct is_default_constructible_check 81 : std::false_type 82 {}; 83 84 template<class T> 85 struct is_default_constructible_check<T, typename holder< 86 decltype(T()) 87 >::type> 88 : std::true_type 89 {}; 90 91 template<class T> 92 struct is_default_constructible_helper 93 : std::conditional<(std::is_reference<T>::value), 94 std::false_type, 95 is_default_constructible_check<T> 96 >::type 97 {}; 98 99 template<class T, class... Xs> 100 struct is_constructible 101 : std::is_constructible<T, Xs...> 102 {}; 103 104 template<class T> 105 struct is_constructible<T> 106 : is_default_constructible_helper<T> 107 {}; 108 109 } 110 111 }} // namespace boost::hof 112 113 #endif 114