1 #ifndef INCG_PHI_CORE_TYPE_TRAITS_IS_CONSTRUCTIBLE_HPP 2 #define INCG_PHI_CORE_TYPE_TRAITS_IS_CONSTRUCTIBLE_HPP 4 #include "phi/phi_config.hpp" 6 #if PHI_HAS_EXTENSION_PRAGMA_ONCE() 10 #include "phi/compiler_support/constexpr.hpp" 11 #include "phi/compiler_support/inline_variables.hpp" 12 #include "phi/compiler_support/intrinsics/is_constructible.hpp" 13 #include "phi/type_traits/integral_constant.hpp" 15 #if PHI_SUPPORTS_IS_CONSTRUCTIBLE() 17 # include "phi/compiler_support/warning.hpp" 19 # define PHI_HAS_WORKING_IS_CONSTRUCTIBLE() 1 21 DETAIL_PHI_BEGIN_NAMESPACE()
23 PHI_GCC_SUPPRESS_WARNING_PUSH()
24 PHI_GCC_SUPPRESS_WARNING("-Wignored-qualifiers")
26 template <typename TypeT, typename... ArgsT>
30 template <
typename TypeT,
typename... ArgsT>
34 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE() 36 template <
typename TypeT,
typename... ArgsT>
37 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_constructible_v = PHI_IS_CONSTRUCTIBLE(TypeT, ArgsT...);
39 template <
typename TypeT,
typename... ArgsT>
40 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_not_constructible_v =
41 !PHI_IS_CONSTRUCTIBLE(TypeT, ArgsT...);
45 PHI_GCC_SUPPRESS_WARNING_POP()
47 DETAIL_PHI_END_NAMESPACE()
51 # include "phi/core/declval.hpp" 52 # include "phi/type_traits/conditional.hpp" 53 # include "phi/type_traits/is_base_of.hpp" 54 # include "phi/type_traits/is_default_constructible.hpp" 55 # include "phi/type_traits/is_destructible.hpp" 56 # include "phi/type_traits/is_lvalue_reference.hpp" 57 # include "phi/type_traits/is_reference.hpp" 58 # include "phi/type_traits/is_rvalue_reference.hpp" 59 # include "phi/type_traits/is_static_castable_to.hpp" 60 # include "phi/type_traits/is_void.hpp" 61 # include "phi/type_traits/remove_cv.hpp" 62 # include "phi/type_traits/remove_reference.hpp" 64 # if PHI_HAS_WORKING_IS_DEFAULT_CONSTRUCTIBLE() && PHI_HAS_WORKING_IS_BASE_OF() 65 # define PHI_HAS_WORKING_IS_CONSTRUCTIBLE() 1 67 # define PHI_HAS_WORKING_IS_CONSTRUCTIBLE() 0 70 DETAIL_PHI_BEGIN_NAMESPACE()
72 template <typename TypeT, typename... ArgsT>
82 template <
typename ToT,
typename ArgT,
typename = decltype(::new ToT(declval<ArgT>()))>
85 template <
typename,
typename>
89 template <
typename ToT,
typename ArgT>
92 using type = decltype(test<ToT, ArgT>(0));
94 static PHI_CONSTEXPR_AND_CONST
bool value = type::value;
97 template <
typename ToT,
typename ArgT>
100 is_direct_constructible_impl<ToT, ArgT>::value>
103 template <
typename FromT,
typename ToT,
109 template <
typename FromT,
typename ToT>
120 static PHI_CONSTEXPR_AND_CONST
bool value = type::value;
123 template <
typename FromT,
typename ToT>
127 template <
typename FromT,
typename ToT,
133 template <
typename FromT,
typename ToT>
143 static PHI_CONSTEXPR_AND_CONST
bool value = type::value;
146 template <
typename FromT,
typename ToT>
156 template <
typename TypeT,
typename ArgT>
159 !(is_base_to_derived_ref<ArgT, TypeT>::value ||
160 is_lvalue_to_rvalue_ref<ArgT, TypeT>::value)>
163 template <
typename TypeT,
typename ArgT>
166 is_direct_constructible_ref_cast<TypeT, ArgT>,
167 is_direct_constructible_new_safe<TypeT, ArgT>>::type
170 template <
typename TypeT,
typename ArgT>
181 template <
typename TypeT,
typename... ArgsT,
182 typename = decltype(TypeT(declval<ArgsT>()...))>
185 template <
typename,
typename...>
189 template <
typename TypeT,
typename... ArgsT>
192 using type = decltype(test<TypeT, ArgsT...>(0));
195 template <
typename TypeT,
typename... ArgsT>
198 static_assert(
sizeof...(ArgsT) > 1,
"Only useful for > 1 arguments");
201 template <
typename TypeT,
typename... ArgsT>
205 template <
typename TypeT,
typename ArgT>
225 template <
typename TypeT>
230 template <
typename TypeT,
typename... ArgsT>
234 template <
typename TypeT,
typename... ArgsT>
239 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE() 241 template <
typename TypeT,
typename... ArgsT>
242 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_constructible_v =
245 template <
typename TypeT,
typename... ArgsT>
246 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_not_constructible_v =
251 DETAIL_PHI_END_NAMESPACE()
255 #endif // INCG_PHI_CORE_TYPE_TRAITS_IS_CONSTRUCTIBLE_HPP Definition: integral_constant.hpp:19
Definition: conditional.hpp:13
Definition: is_constructible.hpp:129
Definition: is_constructible.hpp:157
Definition: is_default_constructible.hpp:91
Definition: is_constructible.hpp:80
Definition: is_function.hpp:45
Definition: is_base_of.hpp:74
Definition: test_macros.hpp:18
Definition: is_constructible.hpp:235
Definition: remove_cv.hpp:28
Definition: is_constructible.hpp:105
Definition: is_rvalue_reference.hpp:40
Definition: is_constructible.hpp:110
Definition: is_constructible.hpp:73
Definition: is_constructible.hpp:202
Definition: is_constructible.hpp:171
Definition: is_constructible.hpp:190
Definition: is_lvalue_reference.hpp:40
Definition: is_constructible.hpp:164
Definition: is_same.hpp:40
Definition: is_constructible.hpp:179
Definition: is_constructible.hpp:90
Definition: is_void.hpp:17
Definition: is_constructible.hpp:98
Definition: is_constructible.hpp:196