1 #ifndef INCG_PHI_CORE_TYPE_TRAITS_IS_CONVERTIBLE_HPP 2 #define INCG_PHI_CORE_TYPE_TRAITS_IS_CONVERTIBLE_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_convertible.hpp" 13 #include "phi/type_traits/integral_constant.hpp" 15 #if PHI_SUPPORTS_IS_CONVERTIBLE() 17 DETAIL_PHI_BEGIN_NAMESPACE()
19 template <typename FromT, typename ToT>
23 template <
typename FromT,
typename ToT>
27 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE() 29 template <
typename FromT,
typename ToT>
30 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_convertible_v = PHI_IS_CONVERTIBLE(FromT, ToT);
32 template <
typename FromT,
typename ToT>
33 PHI_INLINE_VARIABLE PHI_CONSTEXPR
bool is_not_convertible_v = !PHI_IS_CONVERTIBLE(FromT, ToT);
37 #elif PHI_COMPILER_IS_NOT(MSVC) 39 # include "phi/compiler_support/compiler.hpp" 40 # include "phi/compiler_support/warning.hpp" 41 # include "phi/core/declval.hpp" 42 # include "phi/type_traits/is_void.hpp" 44 PHI_CLANG_SUPPRESS_WARNING_PUSH()
45 # if PHI_COMPILER_IS_ATLEAST(CLANG, 10, 0, 0) || PHI_COMPILER_IS_ATLEAST(APPLECLANG, 12, 0, 0) 46 PHI_CLANG_SUPPRESS_WARNING(
"-Wdeprecated-volatile")
49 DETAIL_PHI_BEGIN_NAMESPACE()
53 template <
typename TypeT>
54 auto test_returnable(
int)
55 -> decltype(static_cast<void>(
static_cast<TypeT (*)()
>(
nullptr)),
true_type{});
60 template <
typename FromT,
typename ToT>
61 auto test_implicitly_convertible(
int)
62 -> decltype(static_cast<void>(declval<
void (&)(ToT)>()(declval<FromT>())),
true_type{});
64 template <
typename,
typename>
65 auto test_implicitly_convertible(...) ->
false_type;
69 template <
typename FromT,
typename ToT>
71 :
public integral_constant<bool, (decltype(detail::test_returnable<ToT>(0))::value &&
72 decltype(detail::test_implicitly_convertible<FromT, ToT>(
74 (is_void<FromT>::value && is_void<ToT>::value)>
77 template <
typename FromT,
typename ToT>
81 PHI_CLANG_SUPPRESS_WARNING_POP()
83 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE() 85 template <
typename FromT,
typename ToT>
88 template <
typename FromT,
typename ToT>
97 # include "phi/core/declval.hpp" 98 # include "phi/type_traits/is_array.hpp" 99 # include "phi/type_traits/is_function.hpp" 100 # include "phi/type_traits/is_void.hpp" 101 # include "phi/type_traits/remove_reference.hpp" 103 DETAIL_PHI_BEGIN_NAMESPACE()
107 template <
typename TypeT>
108 void test_convert(TypeT);
110 template <
typename FromT,
typename ToT,
typename =
void>
114 template <
typename FromT,
typename ToT>
116 decltype(detail::test_convert<ToT>(declval<FromT>()))>
120 template <typename TypeT, bool IsArray = is_array<TypeT>::value,
130 template <
typename TypeT>
139 template <
typename TypeT>
148 template <
typename TypeT>
157 typename remove_reference<TypeT>::type>::value>
160 static const size_t value = 0;
163 template <
typename TypeT>
166 static const size_t value =
sizeof(TypeT);
169 template <
typename FromT,
typename ToT,
173 :
public integral_constant<bool, detail::is_convertible_impl_test<FromT, ToT>::value>
176 template <
typename FromT,
typename ToT>
179 template <
typename FromT,
typename ToT>
182 template <
typename FromT,
typename ToT>
185 template <
typename FromT,
typename ToT>
189 template <
typename FromT,
typename ToT>
192 template <
typename FromT,
typename ToT>
195 template <
typename FromT,
typename ToT>
198 template <
typename FromT,
typename ToT>
202 template <
typename FromT,
typename ToT>
205 template <
typename FromT,
typename ToT>
208 template <
typename FromT,
typename ToT>
211 template <
typename FromT,
typename ToT>
216 template <
typename FromT,
typename ToT>
220 static PHI_CONSTEXPR_AND_CONST
size_t complete_check_from_t =
222 static PHI_CONSTEXPR_AND_CONST
size_t complete_check_to_t =
226 template <
typename FromT,
typename ToT>
230 PHI_CLANG_SUPPRESS_WARNING_POP()
232 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE() 234 template <
typename FromT,
typename ToT>
237 template <
typename FromT,
typename ToT>
244 DETAIL_PHI_END_NAMESPACE()
246 #endif // INCG_PHI_CORE_TYPE_TRAITS_IS_CONVERTIBLE_HPP Definition: integral_constant.hpp:19
Definition: is_convertible.hpp:122
Definition: is_convertible.hpp:158
Definition: is_convertible.hpp:111
Definition: is_function.hpp:45
Definition: is_convertible.hpp:217
Definition: is_convertible.hpp:172
Definition: is_convertible.hpp:227
Definition: is_void.hpp:17