28 #ifndef VC_COMMON_SIMDARRAYFWD_H_
29 #define VC_COMMON_SIMDARRAYFWD_H_
31 #include "../scalar/types.h"
32 #include "../sse/types.h"
33 #include "../avx/types.h"
38 namespace Vc_VERSIONED_NAMESPACE
41 template <
class T,
int N>
42 class Vector<T, simd_abi::fixed_size<N>> :
public SimdArray<T, N>
49 Vc_INTRINSIC Vector(
const Vector &x) : SimdArray<T, N>(x) {}
50 Vc_INTRINSIC Vector &operator=(
const Vector &x)
52 SimdArray<T, N>::operator=(x);
57 using abi_type = simd_abi::fixed_size<N>;
60 Vc_DEPRECATED(
"use Vector([](int n) { return n; }) instead of "
63 return Vector([](
size_t i) -> T {
return i; });
65 Vc_DEPRECATED(
"use 0 instead of Vector::Zero()") static Vector
Zero() {
return 0; }
66 Vc_DEPRECATED(
"use 1 instead of Vector::One()") static Vector
One() {
return 1; }
69 template <
class T,
int N>
70 class Mask<T, simd_abi::fixed_size<N>> :
public SimdMaskArray<T, N>
77 Vc_INTRINSIC Mask(
const Mask &x) : SimdMaskArray<T, N>(x) {}
78 Vc_INTRINSIC Mask &operator=(
const Mask &x)
80 SimdMaskArray<T, N>::operator=(x);
85 using abi_type = simd_abi::fixed_size<N>;
94 template <
typename T, std::
size_t N>
struct SimdArrayTraits {
95 static constexpr std::size_t N0 = Common::left_size<N>();
96 static constexpr std::size_t N1 = Common::right_size<N>();
98 using storage_type0 = fixed_size_simd<T, N0>;
99 using storage_type1 = fixed_size_simd<T, N1>;
102 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
103 Vc_INTRINSIC_L
typename SimdArrayTraits<T, N>::storage_type0 &internal_data0(
104 SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
105 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
106 Vc_INTRINSIC_L
typename SimdArrayTraits<T, N>::storage_type1 &internal_data1(
107 SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
108 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
109 Vc_INTRINSIC_L
const typename SimdArrayTraits<T, N>::storage_type0 &internal_data0(
110 const SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
111 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
112 Vc_INTRINSIC_L
const typename SimdArrayTraits<T, N>::storage_type1 &internal_data1(
113 const SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
115 template <
typename T, std::
size_t N,
typename V>
116 Vc_INTRINSIC_L V &internal_data(SimdArray<T, N, V, N> &x) Vc_INTRINSIC_R;
117 template <
typename T, std::
size_t N,
typename V>
118 Vc_INTRINSIC_L
const V &internal_data(
const SimdArray<T, N, V, N> &x) Vc_INTRINSIC_R;
123 template <
class T>
struct is_fixed_size_simd : std::false_type {
125 template <
class T,
int N>
126 struct is_fixed_size_simd<fixed_size_simd<T, N>> : std::true_type {
128 template <
class T,
int N>
129 struct is_fixed_size_simd<fixed_size_simd_mask<T, N>> : std::true_type {
133 template <
class T,
int N>
134 struct is_simd_vector_internal<fixed_size_simd<T, N>> : is_valid_vector_argument<T> {};
137 template <
class T,
int N>
138 struct is_simd_mask_internal<fixed_size_simd_mask<T, N>> : is_valid_vector_argument<T> {};
141 template <
typename T, std::
size_t N,
typename V>
142 struct is_atomic_simdarray_internal<SimdArray<T, N, V, N>> : is_valid_vector_argument<T> {};
143 template <
typename T,
int N>
144 struct is_atomic_simdarray_internal<fixed_size_simd<T, N>>
145 : is_atomic_simdarray_internal<SimdArray<T, N>> {
149 template <
typename T, std::
size_t N,
typename V>
150 struct is_atomic_simd_mask_array_internal<SimdMaskArray<T, N, V, N>>
151 : is_valid_vector_argument<T> {
153 template <
typename T,
int N>
154 struct is_atomic_simd_mask_array_internal<fixed_size_simd_mask<T, N>>
155 : is_atomic_simd_mask_array_internal<SimdMaskArray<T, N>> {
159 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
160 struct is_simdarray_internal<SimdArray<T, N, VectorType, M>>
161 : is_valid_vector_argument<T> {
163 template <
typename T,
int N>
164 struct is_simdarray_internal<fixed_size_simd<T, N>> : is_valid_vector_argument<T> {
168 template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
169 struct is_simd_mask_array_internal<SimdMaskArray<T, N, VectorType, M>>
170 : is_valid_vector_argument<T> {
172 template <
typename T,
int N>
173 struct is_simd_mask_array_internal<fixed_size_simd_mask<T, N>>
174 : is_valid_vector_argument<T> {
178 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
179 struct is_integral_internal<SimdArray<T, N, V, M>, false> : std::is_integral<T> {
183 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
184 struct is_floating_point_internal<SimdArray<T, N, V, M>, false>
185 : std::is_floating_point<T> {
189 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
190 struct is_signed_internal<SimdArray<T, N, V, M>, false> : std::is_signed<T> {
194 template <
typename T, std::
size_t N,
typename V, std::
size_t M>
195 struct is_unsigned_internal<SimdArray<T, N, V, M>, false> : std::is_unsigned<T> {
199 template <
typename T, std::
size_t N>
200 struct has_no_allocated_data_impl<
Vc::SimdArray<T, N>> : std::true_type {
208 #endif // VC_COMMON_SIMDARRAYFWD_H_