28 #ifndef VC_COMMON_DETAIL_H_
29 #define VC_COMMON_DETAIL_H_
35 namespace Vc_VERSIONED_NAMESPACE
41 template <
typename IV>
42 Vc_INTRINSIC enable_if<(Traits::is_simd_vector<IV>::value &&
43 sizeof(
typename IV::EntryType) >=
sizeof(
int)),
45 convertIndexVector(
const IV &indexVector)
52 template <
typename IV>
53 Vc_INTRINSIC enable_if<(Traits::is_simd_vector<IV>::value &&
54 sizeof(
typename IV::EntryType) <
sizeof(
int)),
55 fixed_size_simd<int, IV::Size>>
56 convertIndexVector(
const IV &indexVector)
58 return static_cast<fixed_size_simd<int, IV::Size>
>(indexVector);
62 template <
class T>
using promoted_type = decltype(std::declval<T>() + 1);
66 template <
typename T, std::
size_t N>
67 Vc_INTRINSIC enable_if<std::is_integral<T>::value, fixed_size_simd<promoted_type<T>, N>>
68 convertIndexVector(
const std::array<T, N> &indexVector)
70 return fixed_size_simd<promoted_type<T>, N>{std::addressof(indexVector[0]),
73 template <
typename T, std::
size_t N>
74 Vc_INTRINSIC enable_if<std::is_integral<T>::value, fixed_size_simd<promoted_type<T>, N>>
77 return fixed_size_simd<promoted_type<T>, N>{std::addressof(indexVector[0]),
80 template <
typename T, std::
size_t N>
81 Vc_INTRINSIC enable_if<std::is_integral<T>::value, fixed_size_simd<promoted_type<T>, N>>
82 convertIndexVector(
const T (&indexVector)[N])
84 return fixed_size_simd<promoted_type<T>, N>{std::addressof(indexVector[0]),
94 enable_if<std::is_pointer<T>::value,
void> convertIndexVector(T indexVector) =
delete;
100 Vc_INTRINSIC std::vector<promoted_type<T>> convertIndexVector(
101 const std::initializer_list<T> &indexVector)
103 return {begin(indexVector), end(indexVector)};
107 template <
typename T>
109 enable_if<(std::is_integral<T>::value &&
sizeof(T) >=
sizeof(
int)), std::vector<T>>
110 convertIndexVector(
const std::vector<T> &indexVector)
114 template <
typename T>
115 Vc_INTRINSIC enable_if<(std::is_integral<T>::value &&
sizeof(T) <
sizeof(
int)),
117 convertIndexVector(
const std::vector<T> &indexVector)
119 return {std::begin(indexVector), std::end(indexVector)};
124 (!std::is_pointer<T>::value && !Traits::is_simd_vector<T>::value &&
125 !std::is_lvalue_reference<decltype(std::declval<const T &>()[0])>::value)>>
126 Vc_INTRINSIC
const T &convertIndexVector(
const T &i)
135 #endif // VC_COMMON_DETAIL_H_