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"
38namespace Vc_VERSIONED_NAMESPACE
41template <
class T,
int N>
42class Vector<T, simd_abi::fixed_size<N>> :
public SimdArray<T, N>
44 using SimdArray<T, N>::SimdArray;
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 "
61 "Vector::IndexesFromZero()") static Vector IndexesFromZero()
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; }
69template <
class T,
int N>
70class Mask<T, simd_abi::fixed_size<N>> :
public SimdMaskArray<T, N>
72 using SimdMaskArray<T, N>::SimdMaskArray;
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>;
94template <
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>;
102template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
103Vc_INTRINSIC_L
typename SimdArrayTraits<T, N>::storage_type0 &internal_data0(
104 SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
105template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
106Vc_INTRINSIC_L
typename SimdArrayTraits<T, N>::storage_type1 &internal_data1(
107 SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
108template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
109Vc_INTRINSIC_L
const typename SimdArrayTraits<T, N>::storage_type0 &internal_data0(
110 const SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
111template <
typename T, std::
size_t N,
typename VectorType, std::
size_t VectorSize>
112Vc_INTRINSIC_L
const typename SimdArrayTraits<T, N>::storage_type1 &internal_data1(
113 const SimdArray<T, N, VectorType, VectorSize> &x) Vc_INTRINSIC_R;
115template <
typename T, std::
size_t N,
typename V>
116Vc_INTRINSIC_L V &internal_data(SimdArray<T, N, V, N> &x) Vc_INTRINSIC_R;
117template <
typename T, std::
size_t N,
typename V>
118Vc_INTRINSIC_L
const V &internal_data(
const SimdArray<T, N, V, N> &x) Vc_INTRINSIC_R;
123template <
class T>
struct is_fixed_size_simd : std::false_type {
125template <
class T,
int N>
126struct is_fixed_size_simd<fixed_size_simd<T, N>> : std::true_type {
128template <
class T,
int N>
129struct is_fixed_size_simd<fixed_size_simd_mask<T, N>> : std::true_type {
133template <
class T,
int N>
134struct is_simd_vector_internal<fixed_size_simd<T, N>> : is_valid_vector_argument<T> {};
137template <
class T,
int N>
138struct is_simd_mask_internal<fixed_size_simd_mask<T, N>> : is_valid_vector_argument<T> {};
141template <
typename T, std::
size_t N,
typename V>
142struct is_atomic_simdarray_internal<SimdArray<T, N, V, N>> : is_valid_vector_argument<T> {};
143template <
typename T,
int N>
144struct is_atomic_simdarray_internal<fixed_size_simd<T, N>>
145 : is_atomic_simdarray_internal<SimdArray<T, N>> {
149template <
typename T, std::
size_t N,
typename V>
150struct is_atomic_simd_mask_array_internal<SimdMaskArray<T, N, V, N>>
151 : is_valid_vector_argument<T> {
153template <
typename T,
int N>
154struct is_atomic_simd_mask_array_internal<fixed_size_simd_mask<T, N>>
155 : is_atomic_simd_mask_array_internal<SimdMaskArray<T, N>> {
159template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
160struct is_simdarray_internal<SimdArray<T, N, VectorType, M>>
161 : is_valid_vector_argument<T> {
163template <
typename T,
int N>
164struct is_simdarray_internal<fixed_size_simd<T, N>> : is_valid_vector_argument<T> {
168template <
typename T, std::
size_t N,
typename VectorType, std::
size_t M>
169struct is_simd_mask_array_internal<SimdMaskArray<T, N, VectorType, M>>
170 : is_valid_vector_argument<T> {
172template <
typename T,
int N>
173struct is_simd_mask_array_internal<fixed_size_simd_mask<T, N>>
174 : is_valid_vector_argument<T> {
178template <
typename T, std::
size_t N,
typename V, std::
size_t M>
179struct is_integral_internal<SimdArray<T, N, V, M>, false> : std::is_integral<T> {
183template <
typename T, std::
size_t N,
typename V, std::
size_t M>
184struct is_floating_point_internal<SimdArray<T, N, V, M>, false>
185 : std::is_floating_point<T> {
189template <
typename T, std::
size_t N,
typename V, std::
size_t M>
190struct is_signed_internal<SimdArray<T, N, V, M>, false> : std::is_signed<T> {
194template <
typename T, std::
size_t N,
typename V, std::
size_t M>
195struct is_unsigned_internal<SimdArray<T, N, V, M>, false> : std::is_unsigned<T> {
199template <
typename T, std::
size_t N>
200struct has_no_allocated_data_impl<
Vc::SimdArray<T, N>> : std::true_type {
Vector Classes Namespace.