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