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; };
172 template <
typename T>
using scalar_type =
typename scalar_type_internal<decay<T>, is_simd_vector<T>::value>::type;
177 #include "entry_type_of.h"
179 #endif // VC_TRAITS_TYPE_TRAITS_H_