29 #ifndef VC_COMMON_SIMDARRAYFWD_H_
30 #define VC_COMMON_SIMDARRAYFWD_H_
32 #include "../scalar/types.h"
33 #include "../sse/types.h"
34 #include "../avx/types.h"
35 #include "../mic/types.h"
40 namespace Vc_VERSIONED_NAMESPACE
51 template<std::size_t N,
typename... Typelist>
struct select_best_vector_type_impl;
53 template<std::
size_t N,
typename T>
struct select_best_vector_type_impl<N, T>
57 template<std::size_t N,
typename T,
typename... Typelist>
struct select_best_vector_type_impl<N, T, Typelist...>
59 using type =
typename std::conditional<
60 (N < T::Size),
typename select_best_vector_type_impl<N, Typelist...>::type,
63 template <
typename T, std::
size_t N>
64 using select_best_vector_type =
65 typename select_best_vector_type_impl<N,
70 #elif defined(Vc_IMPL_AVX)
74 #elif defined(Vc_IMPL_Scalar)
76 #elif defined(Vc_IMPL_SSE)
79 #elif defined(Vc_IMPL_MIC)
112 template <
typename T, std::size_t N,
113 typename VectorType = Common::select_best_vector_type<T, N>,
114 std::size_t VectorSize =
120 template <
typename T, std::size_t N,
121 typename VectorType = Common::select_best_vector_type<T, N>,
122 std::size_t VectorSize =
132 template <
typename T, std::
size_t N>
struct SimdArrayTraits {
133 static constexpr std::size_t N0 = Common::left_size(N);
134 static constexpr std::size_t N1 = Common::right_size(N);
140 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
143 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
146 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
149 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
153 template <
typename T, std::
size_t N,
typename V>
155 template <
typename T, std::
size_t N,
typename V>
160 template <
typename T, std::
size_t N,
typename V>
struct is_atomic_simdarray_internal<
SimdArray<T, N, V, N>> :
public std::true_type {};
161 template <
typename T, std::
size_t N,
typename V>
struct is_atomic_simd_mask_array_internal<SimdMaskArray<T, N, V, N>> :
public std::true_type {};
163 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
struct is_simdarray_internal<SimdArray<T, N, VectorType, M>> :
public std::true_type {};
164 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
struct is_simd_mask_array_internal<SimdMaskArray<T, N, VectorType, M>> :
public std::true_type {};
165 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
struct is_integral_internal <SimdArray<T, N, V, M>, false> :
public std::is_integral<T> {};
166 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
struct is_floating_point_internal<SimdArray<T, N, V, M>, false> :
public std::is_floating_point<T> {};
167 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
struct is_signed_internal <SimdArray<T, N, V, M>, false> :
public std::is_signed<T> {};
168 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
struct is_unsigned_internal <SimdArray<T, N, V, M>, false> :
public std::is_unsigned<T> {};
170 template<
typename T, std::
size_t N>
struct has_no_allocated_data_impl<
Vc::SimdArray<T, N>> :
public std::true_type {};
175 #endif // VC_COMMON_SIMDARRAYFWD_H_
Data-parallel arithmetic type with user-defined number of elements.
Data-parallel mask type with user-defined number of boolean elements.
Vector Classes Namespace.