3 Defines macros for commonly used type traits.
5 @copyright Louis Dionne 2013-2016
6 Distributed under the Boost Software License, Version 1.0.
7 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
10 #ifndef BOOST_HANA_DETAIL_INTRINSICS_HPP
11 #define BOOST_HANA_DETAIL_INTRINSICS_HPP
13 #include <boost/hana/config.hpp>
16 // We use intrinsics if they are available because it speeds up the
18 #if defined(BOOST_HANA_CONFIG_CLANG)
19 # if __has_extension(is_empty)
20 # define BOOST_HANA_TT_IS_EMPTY(T) __is_empty(T)
23 # if __has_extension(is_final)
24 # define BOOST_HANA_TT_IS_FINAL(T) __is_final(T)
27 // TODO: Right now, this intrinsic is never used directly because of
28 // https://llvm.org/bugs/show_bug.cgi?id=24173
29 # if __has_extension(is_constructible) && false
30 # define BOOST_HANA_TT_IS_CONSTRUCTIBLE(...) __is_constructible(__VA_ARGS__)
33 # if __has_extension(is_assignable)
34 # define BOOST_HANA_TT_IS_ASSIGNABLE(T, U) __is_assignable(T, U)
37 # if __has_extension(is_convertible)
38 # define BOOST_HANA_TT_IS_CONVERTIBLE(T, U) __is_convertible(T, U)
42 #if !defined(BOOST_HANA_TT_IS_EMPTY)
43 # include <type_traits>
44 # define BOOST_HANA_TT_IS_EMPTY(T) ::std::is_empty<T>::value
47 #if !defined(BOOST_HANA_TT_IS_FINAL)
48 # include <type_traits>
49 # define BOOST_HANA_TT_IS_FINAL(T) ::std::is_final<T>::value
52 #if !defined(BOOST_HANA_TT_IS_CONSTRUCTIBLE)
53 # include <type_traits>
54 # define BOOST_HANA_TT_IS_CONSTRUCTIBLE(...) ::std::is_constructible<__VA_ARGS__>::value
57 #if !defined(BOOST_HANA_TT_IS_ASSIGNABLE)
58 # include <type_traits>
59 # define BOOST_HANA_TT_IS_ASSIGNABLE(T, U) ::std::is_assignable<T, U>::value
62 #if !defined(BOOST_HANA_TT_IS_CONVERTIBLE)
63 # include <type_traits>
64 # define BOOST_HANA_TT_IS_CONVERTIBLE(T, U) ::std::is_convertible<T, U>::value
67 #endif // !BOOST_HANA_DETAIL_INTRINSICS_HPP