Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:38:14

0001 /*=============================================================================
0002     Copyright (c) 2016 Paul Fultz II
0003     intrinsics.hpp
0004     Distributed under the Boost Software License, Version 1.0. (See accompanying
0005     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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 // *** clang ***
0016 #if defined(__clang__)
0017 // #define BOOST_HOF_IS_CONSTRUCTIBLE(...) std::is_constructible<__VA_ARGS__>::value
0018 // #define BOOST_HOF_IS_NOTHROW_CONSTRUCTIBLE(...) std::is_nothrow_constructible<__VA_ARGS__>::value
0019 // #define BOOST_HOF_IS_CONVERTIBLE(...) std::is_convertible<__VA_ARGS__>::value
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 // *** gcc ***
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 // *** other ***
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 }} // namespace boost::hof
0116 
0117 #endif