28 #ifndef Vc_CURRENT_CLASS_NAME 29 #error "incorrect use of common/gatherinterface.h: Vc_CURRENT_CLASS_NAME must be defined to the current class name for declaring constructors." 55 template <
typename MT,
typename IT>
56 inline void gatherImplementation(
const MT *mem, IT &&indexes);
62 template <
typename MT,
typename IT>
63 inline void gatherImplementation(
const MT *mem, IT &&indexes, MaskArgument mask);
73 template <typename IT, typename = enable_if<std::is_pointer<IT>::value ||
74 Traits::is_simd_vector<IT>::value>>
75 static Vc_INTRINSIC IT adjustIndexParameter(IT &&indexes)
77 return std::forward<IT>(indexes);
90 template <
typename IT,
92 !std::is_pointer<IT>::value && !Traits::is_simd_vector<IT>::value &&
93 std::is_lvalue_reference<decltype(std::declval<IT>()[0])>::value>>
94 static Vc_INTRINSIC decltype(std::addressof(std::declval<IT>()[0]))
95 adjustIndexParameter(IT &&i)
97 return std::addressof(i[0]);
107 template <
typename IT>
109 enable_if<!std::is_pointer<IT>::value && !Traits::is_simd_vector<IT>::value &&
110 !std::is_lvalue_reference<decltype(std::declval<IT>()[0])>::value,
112 adjustIndexParameter(IT &&i)
114 return std::forward<IT>(i);
118 #define Vc_ASSERT_GATHER_PARAMETER_TYPES_ \ 120 std::is_convertible<MT, EntryType>::value, \ 121 "The memory pointer needs to point to a type that can be converted to the " \ 122 "EntryType of this SIMD vector type."); \ 124 Vc::Traits::has_subscript_operator<IT>::value, \ 125 "The indexes argument must be a type that implements the subscript operator."); \ 127 !Traits::is_simd_vector<IT>::value || \ 128 Traits::simd_vector_size<IT>::value >= Size, \ 129 "If you use a SIMD vector for the indexes parameter, the index vector must " \ 130 "have at least as many entries as this SIMD vector."); \ 132 !std::is_array<T>::value || \ 133 (std::rank<T>::value == 1 && \ 134 (std::extent<T>::value == 0 || std::extent<T>::value >= Size)), \ 135 "If you use a simple array for the indexes parameter, the array must have " \ 136 "at least as many entries as this SIMD vector.") 180 template <
typename MT,
typename IT,
181 typename = enable_if<Traits::has_subscript_operator<IT>::value>>
182 Vc_INTRINSIC Vc_CURRENT_CLASS_NAME(
const MT *mem, IT &&indexes)
184 Vc_ASSERT_GATHER_PARAMETER_TYPES_;
185 gatherImplementation(mem, adjustIndexParameter(std::forward<IT>(indexes)));
189 template <
typename MT,
typename IT,
190 typename = enable_if<Vc::Traits::has_subscript_operator<IT>::value>>
191 Vc_INTRINSIC Vc_CURRENT_CLASS_NAME(
const MT *mem, IT &&indexes, MaskArgument mask)
193 Vc_ASSERT_GATHER_PARAMETER_TYPES_;
194 gatherImplementation(mem, adjustIndexParameter(std::forward<IT>(indexes)), mask);
198 template <
typename MT,
200 typename = enable_if<Vc::Traits::has_subscript_operator<IT>::value>>
201 Vc_INTRINSIC
void gather(
const MT *mem, IT &&indexes)
203 Vc_ASSERT_GATHER_PARAMETER_TYPES_;
204 gatherImplementation(mem, adjustIndexParameter(std::forward<IT>(indexes)));
208 template <
typename MT,
210 typename = enable_if<Vc::Traits::has_subscript_operator<IT>::value>>
211 Vc_INTRINSIC
void gather(
const MT *mem, IT &&indexes, MaskArgument mask)
213 Vc_ASSERT_GATHER_PARAMETER_TYPES_;
214 gatherImplementation(mem, adjustIndexParameter(std::forward<IT>(indexes)), mask);
233 template <
typename S1,
typename IT>
234 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 235 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
236 const EntryType S1::*member1,
239 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
240 array, indexes)[member1]
257 template <
typename S1,
typename IT>
258 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 259 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
260 const EntryType S1::*member1,
261 IT indexes, MaskArgument mask)
263 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
264 array, indexes)[member1]
283 template <
typename S1,
typename S2,
typename IT>
284 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 285 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
286 const S2 S1::*member1,
287 const EntryType S2::*member2,
290 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
291 array, indexes)[member1][member2]
310 template <
typename S1,
typename S2,
typename IT>
311 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 312 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
313 const S2 S1::*member1,
314 const EntryType S2::*member2,
315 IT indexes, MaskArgument mask)
317 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
318 array, indexes)[member1][member2]
334 template <
typename S1,
typename IT1,
typename IT2>
336 "use the subscript operator to Vc::array or Vc::vector " 337 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
338 const EntryType *const S1::*ptrMember1,
339 IT1 outerIndexes, IT2 innerIndexes)
341 gather(Common::SubscriptOperation<S1, IT1, std::ratio<1, 1>,
true>(
342 array, outerIndexes)[ptrMember1][innerIndexes]
358 template <
typename S1,
typename IT1,
typename IT2>
360 "use the subscript operator to Vc::array or Vc::vector " 361 "instead.") inline Vc_CURRENT_CLASS_NAME(const S1 *array,
362 const EntryType *const S1::*ptrMember1,
363 IT1 outerIndexes, IT2 innerIndexes,
366 gather(Common::SubscriptOperation<S1, IT1, std::ratio<1, 1>,
true>(
367 array, outerIndexes)[ptrMember1][innerIndexes]
384 template <
typename S1,
typename IT>
385 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 386 "instead.") inline
void gather(const S1 *array,
387 const EntryType S1::*member1, IT indexes)
389 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
390 array, indexes)[member1]
407 template <
typename S1,
typename IT>
408 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 409 "instead.") inline
void gather(const S1 *array,
410 const EntryType S1::*member1,
414 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
415 array, indexes)[member1]
434 template <
typename S1,
typename S2,
typename IT>
435 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 436 "instead.") inline
void gather(const S1 *array, const S2 S1::*member1,
437 const EntryType S2::*member2, IT indexes)
439 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
440 array, indexes)[member1][member2]
459 template <
typename S1,
typename S2,
typename IT>
460 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 461 "instead.") inline
void gather(const S1 *array, const S2 S1::*member1,
462 const EntryType S2::*member2, IT indexes,
465 gather(Common::SubscriptOperation<S1, IT, std::ratio<1, 1>,
true>(
466 array, indexes)[member1][member2]
482 template <
typename S1,
typename IT1,
typename IT2>
483 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 484 "instead.") inline
void gather(const S1 *array,
485 const EntryType *const S1::*ptrMember1,
486 IT1 outerIndexes, IT2 innerIndexes)
488 gather(Common::SubscriptOperation<S1, IT1, std::ratio<1, 1>,
true>(
489 array, outerIndexes)[ptrMember1][innerIndexes]
505 template <
typename S1,
typename IT1,
typename IT2>
506 Vc_DEPRECATED(
"use the subscript operator to Vc::array or Vc::vector " 507 "instead.") inline
void gather(const S1 *array,
508 const EntryType *const S1::*ptrMember1,
509 IT1 outerIndexes, IT2 innerIndexes,
512 gather(Common::SubscriptOperation<S1, IT1, std::ratio<1, 1>,
true>(
513 array, outerIndexes)[ptrMember1][innerIndexes]
525 template <
typename MT,
typename IT>
527 Vc_INTRINSIC
void gather(
const Common::GatherArguments<MT, IT> &args)
529 gather(args.address, adjustIndexParameter(args.indexes));
532 template <
typename MT,
typename IT>
533 Vc_INTRINSIC
void gather(
const Common::GatherArguments<MT, IT> &args, MaskArgument mask)
535 gather(args.address, adjustIndexParameter(args.indexes), mask);
539 #undef Vc_ASSERT_GATHER_PARAMETER_TYPES_