42 #ifndef CUDA_KAT_TUPLE_HPP_ 43 #define CUDA_KAT_TUPLE_HPP_ 50 #include <type_traits> 56 template <
typename... T>
59 template <
typename Tuple>
62 template <
size_t I,
typename Tuple>
65 template <
size_t I,
typename Tuple>
69 template <
size_t I,
typename Tuple>
70 using const_tuple_element_t =
typename std::conditional<
71 std::is_lvalue_reference<tuple_element_t<I, Tuple>>::value,
72 typename std::add_lvalue_reference<const typename std::remove_reference<tuple_element_t<I, Tuple>>::type >,
73 const tuple_element_t<I, Tuple>
77 template <
size_t I,
typename... Ts_>
78 KAT_HD tuple_element_t<I,
tuple<Ts_...>>&
get(
tuple<Ts_...>& t);
80 template <
size_t I,
typename... Ts_>
81 KAT_HD const_tuple_element_t<I,
tuple<Ts_...>>&
get(
const tuple<Ts_...>& t);
83 template <
size_t I,
typename... Ts_>
84 KAT_HD tuple_element_t<I,
tuple<Ts_...>>&&
get(
tuple<Ts_...>&& t);
86 template <
typename T,
typename... ts_>
87 KAT_HD T&
get(
tuple<ts_...>& t);
89 template <
typename T,
typename... ts_>
90 KAT_HD
const T&
get(
const tuple<ts_...>& t);
92 template <
typename T,
typename... ts_>
93 KAT_HD T&&
get(
tuple<ts_...>&& t);
116 template <
typename... Ts>
class tuple_size<
tuple_types<Ts...>> :
public std::integral_constant<size_t, sizeof...(Ts)> {};
117 template <
typename... Ts>
class tuple_size<
tuple<Ts...>> :
public std::integral_constant<size_t, sizeof...(Ts)> {};
119 template <
typename... Ts>
class tuple_size<
std::
tuple<Ts...>> :
public std::integral_constant<size_t, sizeof...(Ts)> {};
123 template <
typename T1,
typename T2>
124 class tuple_size<std::pair<T1, T2>> :
public std::integral_constant<size_t, 2> {};
126 template <
typename T1,
typename T2>
127 class tuple_size<const std::pair<T1, T2>> :
public std::integral_constant<size_t, 2> {};
129 #if __cplusplus >= 201703L 136 template <
typename TupleIndices,
typename... Ts>
140 template <
typename Indices,
typename... Ts>
141 class tuple_size<detail::tuple_impl<Indices, Ts...>> :
public std::integral_constant<size_t, sizeof...(Ts)> { };
144 template <
size_t I,
typename T>
151 static_assert(I != I,
"tuple_element index out of range");
154 template <
typename H,
typename... Ts>
161 template <
size_t I,
typename H,
typename... Ts>
165 using type = tuple_element_t<I - 1,
tuple_types<Ts...>>;
169 template <
size_t I,
typename... Ts>
173 using type = tuple_element_t<I,
tuple_types<Ts...>>;
177 template <
size_t I,
typename... Ts>
184 template <
size_t I,
typename... Ts>
188 using type =
typename std::add_const<tuple_element_t<I,
tuple_types<Ts...>>>::type;
192 template <
size_t I,
typename... Ts>
199 template <
size_t I,
typename... Ts>
203 using type =
typename std::add_volatile<tuple_element_t<I,
tuple_types<Ts...>>>::type;
207 template <
size_t I,
typename... Ts>
215 template <
size_t I,
typename... Ts>
219 using type =
typename std::add_cv<tuple_element_t<I,
tuple_types<Ts...>>>::type;
223 template <
size_t I,
typename... Ts>
231 template <
size_t I,
typename Indices,
typename... Ts>
236 template <
size_t I,
typename Indices,
typename... Ts>
241 template <
size_t I,
typename Indices,
typename... Ts>
246 template <
size_t I,
typename Indices,
typename... Ts>
248 I, const volatile tuple<Ts...>>
254 template<
typename T1,
typename T2>
260 template<
typename T1,
typename T2>
266 template<
typename T1,
typename T2>
269 typedef const T1 type;
272 template<
typename T1,
typename T2>
275 typedef const T2 type;
279 template <
typename T,
typename Tuple>
284 template <
typename T>
287 typedef void DuplicateTypeCheck;
289 static const size_t index = 0;
292 template <
typename T,
typename... TsRest>
295 typedef int DuplicateTypeCheck;
299 static_assert(std::is_void<
typename tuple_index<T,
tuple_types<TsRest...>>::DuplicateTypeCheck>::value,
"duplicate type T in tuple_vector::get<T>(); unique types must be provided in declaration, or only use get<size_t>()");
301 static const size_t index = 0;
304 template <
typename T,
typename TsHead,
typename... TsRest>
311 template <
typename T,
typename Indices,
typename... Ts>
323 template <
typename... Ts>
324 constexpr KAT_HD
void swallow(Ts&&...) {}
329 template <size_t I, typename ValueType, bool IsEmpty = std::is_empty<ValueType>::value>
333 template <
size_t I,
typename ValueType,
bool IsEmpty>
334 CONSTEXPR_SINCE_CPP_14
inline KAT_HD
void swap(
337 ) noexcept(noexcept(kat::swap(a.get_internal(),b.get_internal())))
339 kat::swap(a.get_internal(), b.get_internal());
342 template <
size_t I,
typename ValueType,
bool IsEmpty>
352 KAT_HD
explicit tuple_leaf(ValueType&& v) : mValue(std::move(v)) {}
354 template <typename T, typename = typename std::enable_if<std::is_constructible<ValueType, T&&>::value>::type>
356 : mValue(std::forward<T>(t))
360 template <
typename T>
362 : mValue(t.get_internal())
366 template <
typename T>
369 mValue = std::forward<T>(t);
375 kat::detail::swap(*
this, t);
379 KAT_HD ValueType& get_internal() {
return mValue; }
380 KAT_HD
const ValueType& get_internal()
const {
return mValue; }
387 template <
size_t I,
typename ValueType,
bool IsEmpty>
394 template <typename T, typename = typename std::enable_if<std::is_constructible<ValueType, T&&>::value>::type>
396 : mValue(std::forward<T>(t))
400 KAT_HD
explicit tuple_leaf(ValueType& t) : mValue(t)
404 template <
typename T>
406 : mValue(t.get_internal())
410 template <
typename T>
411 KAT_HD tuple_leaf& operator=(T&& t)
413 mValue = std::forward<T>(t);
417 KAT_HD
int swap(tuple_leaf& t)
419 kat::detail::swap(*
this, t);
423 KAT_HD ValueType& get_internal() {
return mValue; }
424 KAT_HD
const ValueType& get_internal()
const {
return mValue; }
431 template <
size_t I,
typename ValueType>
439 template <typename T, typename = typename std::enable_if<std::is_constructible<ValueType, T&&>::value>::type>
441 : ValueType(std::forward<T>(t))
445 template <
typename T>
447 : ValueType(t.get_internal())
451 template <
typename T>
452 KAT_HD tuple_leaf& operator=(T&& t)
454 ValueType::operator=(std::forward<T>(t));
458 KAT_HD
int swap(tuple_leaf& t)
460 kat::detail::swap(*
this, t);
464 KAT_HD ValueType& get_internal() {
return static_cast<ValueType&
>(*this); }
465 KAT_HD
const ValueType& get_internal()
const {
return static_cast<const ValueType&
>(*this); }
468 KAT_HD tuple_leaf& operator=(
const tuple_leaf&) =
delete;
476 template <
typename tuple_types,
typename Tuple,
size_t Start,
size_t End>
479 template <
typename... Types,
typename Tuple,
size_t Start,
size_t End>
482 typedef typename std::remove_reference<Tuple>::type tuple_type;
484 tuple_types<Types...,
typename std::conditional<std::is_lvalue_reference<Tuple>::value,
486 tuple_element_t<Start, tuple_type>&,
488 tuple_element_t<Start, tuple_type>>::type>,
489 Tuple, Start + 1, End>::type type;
492 template <
typename... Types,
typename Tuple,
size_t End>
498 template <
typename Tuple>
506 template <
size_t I,
typename Indices,
typename... Ts>
507 inline KAT_HD tuple_element_t<I,
tuple_impl<Indices, Ts...>>&
get(
tuple_impl<Indices, Ts...>& t);
509 template <
size_t I,
typename Indices,
typename... Ts>
510 inline KAT_HD const_tuple_element_t<I,
tuple_impl<Indices, Ts...>>&
get(
const tuple_impl<Indices, Ts...>& t);
512 template <
size_t I,
typename Indices,
typename... Ts>
515 template <
typename T,
typename Indices,
typename... Ts>
518 template <
typename T,
typename Indices,
typename... Ts>
519 KAT_HD
const T&
get(
const tuple_impl<Indices, Ts...>& t);
521 template <
typename T,
typename Indices,
typename... Ts>
522 KAT_HD T&&
get(
tuple_impl<Indices, Ts...>&& t);
524 template <
size_t... Indices,
typename... Ts>
532 template <
typename... Us,
typename... ValueTypes>
538 template <
typename OtherTuple>
539 KAT_HD tuple_impl(OtherTuple&& t)
540 :
tuple_leaf<Indices, Ts>(std::forward<tuple_element_t<Indices, make_tuple_types_t<OtherTuple>>>(get<Indices>(t)))...
544 template <
typename OtherTuple>
545 KAT_HD tuple_impl& operator=(OtherTuple&& t)
548 std::forward<tuple_element_t<Indices, make_tuple_types_t<OtherTuple>>>(get<Indices>(t)))...);
552 KAT_HD tuple_impl& operator=(
const tuple_impl& t)
562 template <
size_t I,
typename Indices,
typename... Ts>
563 inline KAT_HD tuple_element_t<I,
tuple_impl<Indices, Ts...>>&
get(
tuple_impl<Indices, Ts...>& t)
565 typedef tuple_element_t<I,
tuple_impl<Indices, Ts...>> Type;
569 template <
size_t I,
typename Indices,
typename... Ts>
570 inline KAT_HD const_tuple_element_t<I,
tuple_impl<Indices, Ts...>>&
get(
const tuple_impl<Indices, Ts...>& t)
572 typedef tuple_element_t<I,
tuple_impl<Indices, Ts...>> Type;
576 template <
size_t I,
typename Indices,
typename... Ts>
577 inline KAT_HD tuple_element_t<I,
tuple_impl<Indices, Ts...>>&&
get(
tuple_impl<Indices, Ts...>&& t)
579 typedef tuple_element_t<I,
tuple_impl<Indices, Ts...>> Type;
583 template <
typename T,
typename Indices,
typename... Ts>
590 template <
typename T,
typename Indices,
typename... Ts>
591 inline KAT_HD
const T&
get(
const tuple_impl<Indices, Ts...>& t)
597 template <
typename T,
typename Indices,
typename... Ts>
598 inline KAT_HD T&&
get(
tuple_impl<Indices, Ts...>&& t)
604 template <
size_t... Indices,
typename... Ts>
605 inline KAT_HOST std::tuple<Ts...> as_std_tuple(
tuple_impl<std::integer_sequence<size_t, Indices...>, Ts...> ti);
612 template <
typename T>
struct tuple_like :
public std::false_type {};
617 template <
typename... Ts>
621 template <
typename... Ts>
624 template <
typename First,
typename Second>
625 struct tuple_like<std::pair<First, Second>> :
public std::true_type {};
636 template <
bool IsSameSize,
typename From,
typename To>
641 template <
typename... FromTypes,
typename... ToTypes>
643 :
public kat::bool_constant<conjunction<std::is_convertible<FromTypes, ToTypes>...>::value>
647 template <
typename From,
typename To,
654 template <
typename From,
typename To>
657 tuple_size<typename std::remove_reference<To>::type>::value,
658 make_tuple_types_t<From>, make_tuple_types_t<To>>
667 template <
bool IsSameSize,
typename Target,
typename From>
672 template <
typename... TargetTypes,
typename... FromTypes>
674 :
public bool_constant<conjunction<std::is_assignable<TargetTypes, FromTypes>...>::value>
678 template <
typename Target,
typename From,
685 template <
typename Target,
typename From>
688 tuple_size<typename std::remove_reference<Target>::type>::value ==
689 tuple_size<typename std::remove_reference<From>::type>::value,
690 make_tuple_types_t<Target>, make_tuple_types_t<From>>
695 make_tuple_types_t<Target>, make_tuple_types_t<From>>;
703 template <
bool IsSameSize,
typename TargetType,
typename... FromTypes>
709 template <
typename... TargetTypes,
typename... FromTypes>
712 std::is_constructible<TargetTypes, FromTypes>...,
713 std::is_convertible<FromTypes, TargetTypes>...>
717 template <
typename TargetTupleType,
typename... FromTypes>
720 tuple_size<TargetTupleType>::value == sizeof...(FromTypes),
721 make_tuple_types_t<TargetTupleType>, FromTypes...>::type
725 template<
typename TargetTupleType,
typename... FromTypes>
728 template <
bool IsSameSize,
typename TargetType,
typename... FromTypes>
733 template <
typename... TargetTypes,
typename... FromTypes>
736 std::is_constructible<TargetTypes, FromTypes>...,
737 negation<conjunction<std::is_convertible<FromTypes, TargetTypes>...>>>
741 template <
typename TargetTupleType,
typename... FromTypes>
744 tuple_size<TargetTupleType>::value == sizeof...(FromTypes),
745 make_tuple_types_t<TargetTupleType>, FromTypes...>::type
749 template<
typename TargetTupleType,
typename... FromTypes>
760 template <
typename Tuple1,
typename Tuple2>
761 KAT_HD
bool operator()(
const Tuple1& t1,
const Tuple2& t2)
764 return tuple_equal<I - 1>()(t1, t2) &&
get<I - 1>(t1) == get<I - 1>(t2);
771 template <
typename Tuple1,
typename Tuple2>
772 KAT_HD
bool operator()(
const Tuple1&,
const Tuple2&)
786 template <
typename Tuple1,
typename Tuple2>
787 KAT_HD
bool operator()(
const Tuple1& t1,
const Tuple2& t2)
790 return tuple_less<I - 1>()(t1, t2) || (!
tuple_less<I - 1>()(t2, t1) &&
get<I - 1>(t1) < get<I - 1>(t2));
797 template <
typename Tuple1,
typename Tuple2>
798 KAT_HD
bool operator()(
const Tuple1&,
const Tuple2&)
812 template <
typename T>
822 template <
typename Tuple1,
typename Is1,
typename Tuple2,
typename Is2>
825 template <
typename... T1s,
size_t... I1s,
typename... T2s,
size_t... I2s>
830 template <
typename Tuple1,
typename Tuple2>
831 static KAT_HD result_type do_cat_2(Tuple1&& t1, Tuple2&& t2)
833 return result_type(get<I1s>(std::forward<Tuple1>(t1))..., get<I2s>(std::forward<Tuple2>(t2))...);
838 template <
typename Tuple1,
typename Tuple2>
841 template <
typename... T1s,
typename... T2s>
844 using Is1 = make_index_sequence<
sizeof...(T1s)>;
845 using Is2 = make_index_sequence<
sizeof...(T2s)>;
847 using result_type =
typename tci_type::result_type;
849 template <
typename Tuple1,
typename Tuple2>
850 static inline KAT_HD result_type do_cat_2(Tuple1&& t1, Tuple2&& t2)
852 return tci_type::do_cat_2(std::forward<Tuple1>(t1), std::forward<Tuple2>(t2));
857 template <
typename... Tuples>
860 template <
typename Tuple1,
typename Tuple2,
typename... TuplesRest>
864 using result_type =
typename tuple_cat<first_result_type, TuplesRest...>::result_type;
866 template <
typename TupleArg1,
typename TupleArg2,
typename... TupleArgsRest>
867 static inline KAT_HD result_type do_cat(TupleArg1&& t1, TupleArg2&& t2, TupleArgsRest&&... ts)
871 std::forward<TupleArgsRest>(ts)...);
875 template <
typename Tuple1,
typename Tuple2>
879 using result_type =
typename tc2_type::result_type;
881 template <
typename TupleArg1,
typename TupleArg2>
882 static KAT_HD result_type do_cat(TupleArg1&& t1, TupleArg2&& t2)
884 return tc2_type::do_cat_2(std::forward<TupleArg1>(t1), std::forward<TupleArg2>(t2));
898 template <
typename T,
typename... Ts>
904 template <
typename T2 = T,
905 detail::tuple_implicitly_convertible_t<
tuple,
const T2&,
const Ts&...> = 0>
906 constexpr KAT_HD tuple(
const T& t,
const Ts&... ts)
907 : impl_(make_index_sequence<
sizeof...(Ts) + 1>{}, detail::make_tuple_types_t<tuple>{}, t, ts...)
911 template <
typename T2 = T,
912 detail::tuple_explicitly_convertible_t<tuple,
const T2&,
const Ts&...> = 0>
913 explicit constexpr KAT_HD tuple(
const T& t,
const Ts&... ts)
914 : impl_(make_index_sequence<
sizeof...(Ts) + 1>{}, detail::make_tuple_types_t<tuple>{}, t, ts...)
918 template <
typename U,
typename... Us,
919 detail::tuple_implicitly_convertible_t<tuple, U, Us...> = 0>
920 constexpr KAT_HD tuple(U&& u, Us&&... us)
921 : impl_(make_index_sequence<
sizeof...(Us) + 1>{}, detail::make_tuple_types_t<tuple>{}, std::forward<U>(u),
922 std::forward<Us>(us)...)
926 template <
typename U,
typename... Us,
927 detail::tuple_explicitly_convertible_t<tuple, U, Us...> = 0>
928 explicit constexpr KAT_HD tuple(U&& u, Us&&... us)
929 : impl_(make_index_sequence<
sizeof...(Us) + 1>{}, detail::make_tuple_types_t<tuple>{}, std::forward<U>(u),
930 std::forward<Us>(us)...)
934 template <
typename OtherTuple,
935 typename std::enable_if<detail::tuple_convertible<OtherTuple, tuple>::value,
bool>::type =
false>
936 KAT_HD tuple(OtherTuple&& t)
937 : impl_(std::forward<OtherTuple>(t))
941 template <
typename OtherTuple,
942 typename std::enable_if<detail::tuple_assignable<tuple, OtherTuple>::value,
bool>::type =
false>
943 KAT_HD tuple& operator=(OtherTuple&& t)
945 impl_.operator=(std::forward<OtherTuple>(t));
949 KAT_HD
void swap(tuple& t) { impl_.swap(t.impl_); }
952 operator std::tuple<T, Ts...>()
const {
953 return detail::as_std_tuple(impl_);
960 template <size_t I, typename... Ts_>
963 template <
size_t I,
typename... Ts_>
964 friend KAT_HD const_tuple_element_t<I, tuple<Ts_...>>&
get(
const tuple<Ts_...>& t);
966 template <
size_t I,
typename... Ts_>
967 friend KAT_HD tuple_element_t<I, tuple<Ts_...>>&&
get(tuple<Ts_...>&& t);
969 template <
typename T_,
typename... ts_>
970 friend KAT_HD T_&
get(tuple<ts_...>& t);
972 template <
typename T_,
typename... ts_>
973 friend KAT_HD
const T_&
get(
const tuple<ts_...>& t);
975 template <
typename T_,
typename... ts_>
976 friend KAT_HD T_&&
get(tuple<ts_...>&& t);
984 KAT_HD
void swap(
tuple&) {}
987 operator std::tuple<>()
const 989 return std::tuple<>();
993 template <
size_t I,
typename... Ts>
994 inline KAT_HD tuple_element_t<I,
tuple<Ts...>>&
get(
tuple<Ts...>& t)
996 return get<I>(t.impl_);
999 template <
size_t I,
typename... Ts>
1000 inline KAT_HD const_tuple_element_t<I,
tuple<Ts...>>&
get(
const tuple<Ts...>& t)
1002 return get<I>(t.impl_);
1005 template <
size_t I,
typename... Ts>
1006 inline KAT_HD tuple_element_t<I,
tuple<Ts...>>&&
get(
tuple<Ts...>&& t)
1008 return get<I>(std::move(t.impl_));
1011 template <
typename T,
typename... Ts>
1012 inline KAT_HD T&
get(
tuple<Ts...>& t)
1014 return get<T>(t.impl_);
1017 template <
typename T,
typename... Ts>
1018 inline KAT_HD
const T&
get(
const tuple<Ts...>& t)
1020 return get<T>(t.impl_);
1023 template <
typename T,
typename... Ts>
1024 inline KAT_HD T&&
get(
tuple<Ts...>&& t)
1026 return get<T>(std::move(t.impl_));
1029 template <
typename... Ts>
1039 template <
typename... T1s,
typename... T2s>
1046 template <
typename... T1s,
typename... T2s>
1047 KAT_HOST
bool operator==(
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2)
1053 template <
typename... T1s,
typename... T2s>
1054 KAT_HOST
bool operator==(
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2)
1061 template <
typename... T1s,
typename... T2s>
1068 template <
typename... T1s,
typename... T2s>
1069 KAT_HOST
bool operator<(
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2)
1075 template <
typename... T1s,
typename... T2s>
1076 KAT_HOST
bool operator<(
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2)
1081 template <
typename... T1s,
typename... T2s>
inline KAT_HD
bool operator!=(
const tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t1 == t2); }
1082 template <
typename... T1s,
typename... T2s>
inline KAT_HD
bool operator> (
const tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return t2 < t1; }
1083 template <
typename... T1s,
typename... T2s>
inline KAT_HD
bool operator<=(
const tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t2 < t1); }
1084 template <
typename... T1s,
typename... T2s>
inline KAT_HD
bool operator>=(
const tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t1 < t2); }
1087 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator!=(
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2) {
return !(t1 == t2); }
1088 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator> (
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2) {
return t2 < t1; }
1089 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator<=(
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2) {
return !(t2 < t1); }
1090 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator>=(
const tuple<T1s...>& t1,
const std::tuple<T2s...>& t2) {
return !(t1 < t2); }
1093 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator!=(
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t1 == t2); }
1094 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator> (
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return t2 < t1; }
1095 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator<=(
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t2 < t1); }
1096 template <
typename... T1s,
typename... T2s>
inline KAT_HOST
bool operator>=(
const std::tuple<T1s...>& t1,
const tuple<T2s...>& t2) {
return !(t1 < t2); }
1102 template <
typename... Tuples>
1103 inline KAT_HD
typename detail::tuple_cat<Tuples...>::result_type tuple_cat(Tuples&&... ts)
1112 template <
typename... Ts>
1122 template <
typename... Ts>
1123 inline KAT_HD constexpr
tuple<Ts&&...> forward_as_tuple(Ts&&... ts) noexcept
1125 return tuple<Ts&&...>(std::forward<Ts&&>(ts)...);
1130 template <
size_t... Indices,
typename... Ts>
1131 inline KAT_HOST std::tuple<Ts...> as_std_tuple(tuple_impl<std::integer_sequence<size_t, Indices...>, Ts...> ti)
1133 return std::make_tuple(get<Indices>(ti)...);
1148 template <
class T> KAT_HD constexpr
const ignore_t& operator=(T&&)
const {
return *
this; }
1165 template <
typename... Ts>
1166 inline KAT_HD constexpr
tuple<Ts&...> tie(Ts&... ts) noexcept
1168 return tuple<Ts&...>(ts...);
1171 #if __cplusplus >= 201703L 1182 template <
class F,
class Tuple,
size_t... I>
1183 constexpr KAT_HD decltype(
auto) apply_impl(F&& f, Tuple&& t, index_sequence<I...>)
1186 return std::invoke(forward<F>(f), get<I>(forward<Tuple>(t))...);
1190 template <
class F,
class Tuple>
1191 constexpr KAT_HD decltype(
auto) apply(F&& f, Tuple&& t)
1193 return detail::apply_impl(std::forward<F>(f), forward<Tuple>(t),
1194 make_index_sequence<tuple_size_v<
typename std::remove_reference<Tuple>::type>>{});
1205 #if __cplusplus >= 201703L 1217 template <
class... Ts>
1222 template <
size_t I,
class... Ts>
1231 #endif // __cplusplus >= 201703L 1233 #endif // CUDA_KAT_TUPLE_HPP_ Definition: tuple.hpp:330
reference_wrapper
Definition: reference_wrapper.hpp:53
Definition: tuple.hpp:477
Definition: tuple.hpp:758
Definition: tuple.hpp:784
Definition: tuple.hpp:718
Definition: tuple.hpp:637
Definition: tuple.hpp:839
Definition: tuple.hpp:137
Definition: tuple.hpp:729
Definition: tuple.hpp:1146
Definition: common.hpp:16
Basic type and macro definitions used throughout the KAT library.
Definition: tuple.hpp:809
Definition: tuple.hpp:668
Definition: tuple.hpp:704
Definition: tuple.hpp:742
KAT_FHD CONSTEXPR_SINCE_CPP_14 void swap(T &a, T &b) noexcept(std::is_nothrow_move_constructible< T >::value &&std::is_nothrow_move_assignable< T >::value)
Swap two values on the device-side, in-place.
Definition: utility.hpp:73
An adaptation for host-and-device use of some of the standard C++ library's <utility> code...
Definition: array.hpp:358
Definition: tuple.hpp:823
Definition: tuple.hpp:612
This file implements kat::reference_wrapper, an equivalent of C++11's std::reference_wrapper which ma...
Definition: tuple.hpp:858
Definition: tuple.hpp:108
Definition: tuple.hpp:280
Definition: tuple.hpp:681
Definition: tuple.hpp:650
Definition: common.hpp:32