28 #ifndef VC_TRAITS_TYPE_TRAITS_H_ 29 #define VC_TRAITS_TYPE_TRAITS_H_ 31 #include <type_traits> 33 #include "has_no_allocated_data.h" 34 #include "has_contiguous_storage.h" 35 #include "is_functor_argument_immutable.h" 36 #include "is_output_iterator.h" 37 #include "is_index_sequence.h" 38 #include "is_implicit_cast_allowed.h" 40 namespace Vc_VERSIONED_NAMESPACE
43 struct enable_if_default_type
45 constexpr enable_if_default_type() {}
47 static constexpr enable_if_default_type nullarg;
48 template <
bool Test,
typename T = enable_if_default_type>
using enable_if =
typename std::enable_if<Test, T>::type;
50 template <
bool B,
class T,
class F>
51 using conditional_t =
typename std::conditional<B, T, F>::type;
54 using remove_cvref_t =
55 typename std::remove_cv<typename std::remove_reference<T>::type>::type;
59 #include "has_subscript_operator.h" 60 #include "has_multiply_operator.h" 61 #include "has_addition_operator.h" 62 #include "has_equality_operator.h" 64 template<
typename T>
struct is_valid_vector_argument :
public std::false_type {};
66 template <>
struct is_valid_vector_argument<double> :
public std::true_type {};
67 template <>
struct is_valid_vector_argument<float> :
public std::true_type {};
68 template <>
struct is_valid_vector_argument<int> :
public std::true_type {};
69 template <>
struct is_valid_vector_argument<unsigned int> :
public std::true_type {};
70 template <>
struct is_valid_vector_argument<short> :
public std::true_type {};
71 template <>
struct is_valid_vector_argument<unsigned short> :
public std::true_type {};
73 template<
typename T>
struct is_simd_mask_internal :
public std::false_type {};
74 template<
typename T>
struct is_simd_vector_internal :
public std::false_type {};
75 template<
typename T>
struct is_simdarray_internal :
public std::false_type {};
76 template<
typename T>
struct is_simd_mask_array_internal :
public std::false_type {};
77 template<
typename T>
struct is_loadstoreflag_internal :
public std::false_type {};
79 template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_integral_internal;
80 template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_floating_point_internal;
81 template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_signed_internal;
82 template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_unsigned_internal;
84 template <
typename T>
struct is_integral_internal <T, false> :
public std::is_integral <T> {};
85 template <
typename T>
struct is_floating_point_internal<T, false> :
public std::is_floating_point<T> {};
86 template <
typename T>
struct is_signed_internal <T, false> :
public std::is_signed <T> {};
87 template <
typename T>
struct is_unsigned_internal <T, false> :
public std::is_unsigned <T> {};
89 template <
typename V>
struct is_integral_internal <V, true> :
public std::is_integral <typename V::EntryType> {};
90 template <
typename V>
struct is_floating_point_internal<V, true> :
public std::is_floating_point<typename V::EntryType> {};
91 template <
typename V>
struct is_signed_internal <V, true> :
public std::is_signed <typename V::EntryType> {};
92 template <
typename V>
struct is_unsigned_internal <V, true> :
public std::is_unsigned <typename V::EntryType> {};
95 struct is_arithmetic_internal
96 :
public std::integral_constant<
98 (is_floating_point_internal<T>::value || is_integral_internal<T>::value)>
102 template <
class T,
class =
void>
103 struct vector_size_internal : std::integral_constant<std::size_t, 0> {
106 struct vector_size_internal<T, decltype((void)(T::size() > 0))>
107 : std::integral_constant<std::size_t, T::size()> {
116 template <
typename T>
118 (is_simd_mask_internal<decay<T>>::value ||
119 is_simd_mask_array_internal<decay<T>>::value)>
127 template <
typename T>
129 :
public std::integral_constant<bool,
130 (is_simd_vector_internal<decay<T>>::value ||
131 is_simdarray_internal<decay<T>>::value)>
136 template <
typename T>
142 template <
typename T>
148 template <
typename T>
struct is_load_store_flag :
public is_loadstoreflag_internal<decay<T>> {};
151 template <
typename T>
struct is_atomic_simdarray_internal :
public std::false_type {};
152 template <
typename T>
using isAtomicSimdArray = is_atomic_simdarray_internal<decay<T>>;
155 template <
typename T>
struct is_atomic_simd_mask_array_internal :
public std::false_type {};
156 template <
typename T>
using isAtomicSimdMaskArray = is_atomic_simd_mask_array_internal<decay<T>>;
164 template <
typename T>
struct is_integral :
public is_integral_internal<decay<T>> {};
165 template <
typename T>
struct is_floating_point :
public is_floating_point_internal<decay<T>> {};
166 template <
typename T>
struct is_arithmetic :
public is_arithmetic_internal<decay<T>> {};
167 template <
typename T>
struct is_signed :
public is_signed_internal<decay<T>> {};
168 template <
typename T>
struct is_unsigned :
public is_unsigned_internal<decay<T>> {};
170 template <
typename T,
bool IsSimdVector>
struct scalar_type_internal {
using type = T; };
171 template <
typename T>
struct scalar_type_internal<T, true> {
using type =
typename T::EntryType; };
177 #include "entry_type_of.h" 179 #endif // VC_TRAITS_TYPE_TRAITS_H_ Identifies any possible SimdArray<T, N> type (independent of const/volatile or reference) ...
Identifies any possible SimdMaskArray<T, N> type (independent of const/volatile or reference) ...
The value member will either be the number of SIMD vector entries or 0 if T is not a SIMD type...
Identifies any SIMD vector type (independent of implementation or whether it's SimdArray<T, N>).
Identifies any SIMD mask type (independent of implementation or whether it's SimdMaskArray<T, N>).