28#ifndef VC_TRAITS_TYPE_TRAITS_H_
29#define VC_TRAITS_TYPE_TRAITS_H_
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"
40namespace Vc_VERSIONED_NAMESPACE
43struct enable_if_default_type
45 constexpr enable_if_default_type() {}
47static constexpr enable_if_default_type nullarg;
48template <
bool Test,
typename T = enable_if_default_type>
using enable_if =
typename std::enable_if<Test, T>::type;
50template <
bool B,
class T,
class F>
51using conditional_t =
typename std::conditional<B, T, F>::type;
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"
64template<
typename T>
struct is_valid_vector_argument :
public std::false_type {};
66template <>
struct is_valid_vector_argument<double> :
public std::true_type {};
67template <>
struct is_valid_vector_argument<float> :
public std::true_type {};
68template <>
struct is_valid_vector_argument<int> :
public std::true_type {};
69template <>
struct is_valid_vector_argument<unsigned int> :
public std::true_type {};
70template <>
struct is_valid_vector_argument<short> :
public std::true_type {};
71template <>
struct is_valid_vector_argument<unsigned short> :
public std::true_type {};
73template<
typename T>
struct is_simd_mask_internal :
public std::false_type {};
74template<
typename T>
struct is_simd_vector_internal :
public std::false_type {};
75template<
typename T>
struct is_simdarray_internal :
public std::false_type {};
76template<
typename T>
struct is_simd_mask_array_internal :
public std::false_type {};
77template<
typename T>
struct is_loadstoreflag_internal :
public std::false_type {};
79template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_integral_internal;
80template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_floating_point_internal;
81template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_signed_internal;
82template <typename T, bool = is_simd_vector_internal<T>::value>
struct is_unsigned_internal;
84template <
typename T>
struct is_integral_internal <T, false> :
public std::is_integral <T> {};
85template <
typename T>
struct is_floating_point_internal<T, false> :
public std::is_floating_point<T> {};
86template <
typename T>
struct is_signed_internal <T, false> :
public std::is_signed <T> {};
87template <
typename T>
struct is_unsigned_internal <T, false> :
public std::is_unsigned <T> {};
89template <
typename V>
struct is_integral_internal <V, true> :
public std::is_integral <typename V::EntryType> {};
90template <
typename V>
struct is_floating_point_internal<V, true> :
public std::is_floating_point<typename V::EntryType> {};
91template <
typename V>
struct is_signed_internal <V, true> :
public std::is_signed <typename V::EntryType> {};
92template <
typename V>
struct is_unsigned_internal <V, true> :
public std::is_unsigned <typename V::EntryType> {};
95struct is_arithmetic_internal
96 :
public std::integral_constant<
98 (is_floating_point_internal<T>::value || is_integral_internal<T>::value)>
102template <
class T,
class =
void>
103struct vector_size_internal : std::integral_constant<std::size_t, 0> {
106struct vector_size_internal<T, decltype((void)(T::size() > 0))>
107 : std::integral_constant<std::size_t, T::size()> {
118 (is_simd_mask_internal<decay<T>>::value ||
119 is_simd_mask_array_internal<decay<T>>::value)>
129 :
public std::integral_constant<bool,
130 (is_simd_vector_internal<decay<T>>::value ||
131 is_simdarray_internal<decay<T>>::value)>
148template <
typename T>
struct is_load_store_flag :
public is_loadstoreflag_internal<decay<T>> {};
151template <
typename T>
struct is_atomic_simdarray_internal :
public std::false_type {};
152template <
typename T>
using isAtomicSimdArray = is_atomic_simdarray_internal<decay<T>>;
155template <
typename T>
struct is_atomic_simd_mask_array_internal :
public std::false_type {};
156template <
typename T>
using isAtomicSimdMaskArray = is_atomic_simd_mask_array_internal<decay<T>>;
164template <
typename T>
struct is_integral :
public is_integral_internal<decay<T>> {};
165template <
typename T>
struct is_floating_point :
public is_floating_point_internal<decay<T>> {};
166template <
typename T>
struct is_arithmetic :
public is_arithmetic_internal<decay<T>> {};
167template <
typename T>
struct is_signed :
public is_signed_internal<decay<T>> {};
168template <
typename T>
struct is_unsigned :
public is_unsigned_internal<decay<T>> {};
170template <
typename T,
bool IsSimdVector>
struct scalar_type_internal {
using type = T; };
171template <
typename T>
struct scalar_type_internal<T, true> {
using type =
typename T::EntryType; };
172template <
typename T>
using scalar_type =
typename scalar_type_internal<decay<T>, is_simd_vector<T>::value>::type;
177#include "entry_type_of.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)
Identifies any SIMD mask type (independent of implementation or whether it's SimdMaskArray<T,...
Identifies any SIMD vector type (independent of implementation or whether it's SimdArray<T,...
The value member will either be the number of SIMD vector entries or 0 if T is not a SIMD type.