28 #ifndef VC_COMMON_VECTOR_H_ 29 #define VC_COMMON_VECTOR_H_ 32 #include "elementreference.h" 34 #include "vectorabi.h" 35 #include "vectortraits.h" 36 #include "simdarrayfwd.h" 37 #include "loadstoreflags.h" 38 #include "writemaskedvector.h" 40 namespace Vc_VERSIONED_NAMESPACE
53 template <
typename T,
typename Abi,
54 typename = enable_if<std::is_floating_point<T>::value &&
55 !detail::is_fixed_size_abi<Abi>::value>>
91 template <
typename T,
typename Abi,
92 typename = enable_if<std::is_floating_point<T>::value &&
93 !detail::is_fixed_size_abi<Abi>::value>>
103 template <
typename T,
typename Abi>
124 template<
typename T,
typename Abi = VectorAbi::Best<T>>
class Vector 141 static constexpr
size_t size() {
return VectorTraits<T, Abi>::size(); }
153 using EntryType =
typename VectorTraits<T, Abi>::EntryType;
157 using VectorEntryType =
typename VectorTraits<T, Abi>::VectorEntryType;
161 using VectorType =
typename VectorTraits<T, Abi>::VectorType;
165 using vector_type = VectorType;
180 using reference = Detail::ElementReference<Vector>;
212 static inline Vector Random();
215 template <
typename G>
static inline Vector generate(G gen);
229 inline Vector() =
default;
236 explicit inline Vector(VectorSpecialInitializerZero);
243 explicit inline Vector(VectorSpecialInitializerOne);
250 explicit inline Vector(VectorSpecialInitializerIndexesFromZero);
258 template <
typename U>
260 enable_if<Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
273 template <
typename U>
274 Vc_DEPRECATED(
"use simd_cast instead of explicit type casting to convert between " 275 "vector types") inline explicit
Vector(
277 enable_if<!Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
288 template <
typename U>
289 inline Vector(U a, enable_if<std::is_same<U, int>::value &&
290 !std::is_same<U, EntryType>::value> = nullarg);
296 #include "../common/loadinterface.h" 298 #include "../common/storeinterface.h" 304 inline void setZero();
322 inline void setZeroInverted(
MaskType mask);
327 inline void setQnan();
336 #define Vc_CURRENT_CLASS_NAME Vector 337 #include "../common/gatherinterface.h" 338 #include "../common/scatterinterface.h" 339 #undef Vc_CURRENT_CLASS_NAME 359 inline reference operator[](
size_t index) noexcept;
368 inline EntryType operator[](
size_t index)
const noexcept;
387 inline Vector operator~()
const;
405 inline Vector &operator++();
407 inline Vector operator++(
int);
408 inline Vector &operator--();
409 inline Vector operator--(
int);
412 #define Vc_OP(symbol) \ 413 inline Vc_PURE Vector operator symbol(const Vector &x) const; 439 Vc_ALL_ARITHMETICS(Vc_OP);
461 Vc_ALL_BINARY(Vc_OP);
482 Vc_ALL_SHIFTS(Vc_OP);
504 #define Vc_CMP_OP(symbol) inline Vc_PURE MaskType operator symbol(const Vector &x) const; 506 Vc_ALL_COMPARES(Vc_CMP_OP);
529 inline Common::WriteMaskedVector<Vector, MaskType> operator()(
MaskType mask);
556 inline Vector partialSum()
const;
636 inline Vector rotated(
int amount)
const;
638 inline Vector reversed()
const;
671 inline Vector sorted()
const;
704 template <
typename F>
void callWithValuesSorted(F &&f);
706 template <
typename F>
inline void call(F &&f)
const;
708 template <
typename F>
inline void call(F &&f,
MaskType mask)
const;
711 template <
typename F>
inline Vector apply(F &&f)
const;
713 template <
typename F>
inline Vector apply(F &&f,
MaskType mask)
const;
716 template <
typename IndexT>
inline void fill(
EntryType(&f)(IndexT));
742 inline VectorType &data();
744 inline const VectorType &data()
const;
757 Vc_DEPRECATED(
"use exponent(x) instead") inline
Vector exponent() const;
770 static constexpr
size_t Size = VectorTraits<T, Abi>::size();
779 template <typename V2> inline V2 staticCast() const;
788 template <typename V2>
790 reinterpretCast() const;
802 Vc_DEPRECATED("use copysign(x, y) instead") inline
Vector 803 copySign(
Vector reference) const;
806 Vc_FREE_STORE_OPERATORS_ALIGNED(alignof(
Vector));
830 template <typename V, typename T, typename Abi>
831 Vc_ALWAYS_INLINE Vc_CONST enable_if<
832 (V::size() == Vector<T, Abi>::size() &&
833 sizeof(typename V::VectorEntryType) ==
834 sizeof(typename Vector<T, Abi>::VectorEntryType) &&
835 sizeof(V) == sizeof(Vector<T, Abi>) && alignof(V) <= alignof(Vector<T, Abi>)),
839 return reinterpret_cast<const V &
>(x);
842 #define Vc_OP(symbol) \ 843 template <typename T, typename Abi> \ 844 inline Vector<T, Abi> &operator symbol##=(Vector<T, Abi> &, \ 845 const Vector<T, Abi> &x); 853 #endif // VC_COMMON_VECTOR_H_ static constexpr size_t size()
Returns the number of scalar components ( ) in a vector of this type.
The main vector class for expressing data parallelism.
constexpr VectorSpecialInitializerIndexesFromZero IndexesFromZero
The special object Vc::IndexesFromZero can be used to construct Vector objects initialized to values ...
Vc::Vector< T > min(const Vc::Vector< T > &x, const Vc::Vector< T > &y)
result_vector_type< L, R > operator-(L &&lhs, R &&rhs)
Applies - component-wise and concurrently.
Vc::Vector< T > max(const Vc::Vector< T > &x, const Vc::Vector< T > &y)
Data-parallel arithmetic type with user-defined number of elements.
Vector< T, detail::not_fixed_size_abi< Abi > >::MaskType isnegative(Vector< T, Abi > x)
Returns for each vector component whether it stores a negative value.
Abi abi
The ABI tag type of the current template instantiation.
void assign(SimdizeDetail::Adapter< S, T, N > &a, size_t i, const S &x)
Assigns one scalar object x to a SIMD slot at offset i in the simdized object a.
Vector< T, Abi > exponent(Vector< T, Abi > x)
Extracts the exponent of each floating-point vector component.
enable_if< (V::size()==Vector< T, Abi >::size()&&sizeof(typename V::VectorEntryType)==sizeof(typename Vector< T, Abi >::VectorEntryType)&&sizeof(V)==sizeof(Vector< T, Abi >)&&alignof(V)<=alignof(Vector< T, Abi >)), V > reinterpret_components_cast(const Vector< T, Abi > &x)
Constructs a new Vector object of type V from the Vector x, reinterpreting the bits of x for the new ...
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently.
static constexpr std::size_t size()
Returns N, the number of scalar components in an object of this type.
Vector< T, Abi > copysign(Vector< T, Abi > magnitude, Vector< T, Abi > sign)
Copies the sign(s) of sign to the value(s) in magnitude and returns the resulting vector...
EntryType value_type
The type of the entries in the vector.
The main SIMD mask class.
constexpr VectorSpecialInitializerZero Zero
The special object Vc::Zero can be used to construct Vector and Mask objects initialized to zero/fals...
Adapter< S, T, N > shifted(const Adapter< S, T, N > &a, int shift)
Returns a new vectorized object where each entry is shifted by shift.
constexpr VectorSpecialInitializerOne One
The special object Vc::One can be used to construct Vector and Mask objects initialized to one/true...
constexpr std::size_t MemoryAlignment
Specifies the most conservative memory alignment necessary for aligned loads and stores of Vector typ...
typename VectorTraits< T, Abi >::EntryType EntryType
The type of the entries in the vector.