• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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