10#ifndef EIGEN_TUPLE_GPU
11#define EIGEN_TUPLE_GPU
23template <
size_t N,
typename... Types>
27template <
size_t N,
typename T1,
typename... Ts>
28class TupleImpl<N, T1, Ts...> {
31 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
34 template <
typename U1 = T1,
35 typename EnableIf = std::enable_if_t<std::is_default_constructible<U1>::value &&
36 reduce_all<std::is_default_constructible<Ts>::value...>::value>>
37 constexpr EIGEN_DEVICE_FUNC TupleImpl() : head_{}, tail_{} {}
40 template <
typename U1,
typename... Us,
42 typename EnableIf = std::enable_if_t<
44 sizeof...(Us) ==
sizeof...(Ts) && (
46 N > 1 || std::is_convertible<U1, T1>::value)>>
47 constexpr EIGEN_DEVICE_FUNC TupleImpl(U1&& arg1, Us&&... args)
48 : head_(std::forward<U1>(arg1)), tail_(std::forward<Us>(args)...) {}
51 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T1& head() {
return head_; }
53 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const T1& head()
const {
return head_; }
56 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE TupleImpl<N - 1, Ts...>& tail() {
return tail_; }
58 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const TupleImpl<N - 1, Ts...>& tail()
const {
return tail_; }
60 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void swap(TupleImpl& other) {
62 swap(head_, other.head_);
63 swap(tail_, other.tail_);
66 template <
typename... UTypes>
67 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl& operator=(
const TupleImpl<N, UTypes...>& other) {
73 template <
typename... UTypes>
74 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl& operator=(TupleImpl<N, UTypes...>&& other) {
75 head_ = std::move(other.head_);
76 tail_ = std::move(other.tail_);
82 template <
size_t M,
typename... UTypes>
83 friend class TupleImpl;
86 TupleImpl<N - 1, Ts...> tail_;
91class TupleImpl<size_t(0)> {};
93template <
typename TupleType>
94struct is_tuple : std::false_type {};
96template <
typename... Types>
97struct is_tuple<TupleImpl<sizeof...(Types), Types...>> : std::true_type {};
100template <
size_t Idx,
typename T1,
typename... Ts>
101struct tuple_get_impl {
102 using TupleType = TupleImpl<
sizeof...(Ts) + 1, T1, Ts...>;
103 using ReturnType =
typename tuple_get_impl<Idx - 1, Ts...>::ReturnType;
105 static constexpr EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ReturnType& run(TupleType& tuple) {
106 return tuple_get_impl<Idx - 1, Ts...>::run(tuple.tail());
109 static constexpr EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const ReturnType& run(
const TupleType& tuple) {
110 return tuple_get_impl<Idx - 1, Ts...>::run(tuple.tail());
115template <
typename T1,
typename... Ts>
116struct tuple_get_impl<0, T1, Ts...> {
117 using TupleType = TupleImpl<
sizeof...(Ts) + 1, T1, Ts...>;
118 using ReturnType = T1;
120 static constexpr EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T1& run(TupleType& tuple) {
return tuple.head(); }
122 static constexpr EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
const T1& run(
const TupleType& tuple) {
return tuple.head(); }
126template <
size_t NTuples,
typename... Tuples>
127struct tuple_cat_impl;
129template <
size_t NTuples,
size_t N1,
typename... Args1,
size_t N2,
typename... Args2,
typename... Tuples>
130struct tuple_cat_impl<NTuples, TupleImpl<N1, Args1...>, TupleImpl<N2, Args2...>, Tuples...> {
131 using TupleType1 = TupleImpl<N1, Args1...>;
132 using TupleType2 = TupleImpl<N2, Args2...>;
133 using MergedTupleType = TupleImpl<N1 + N2, Args1..., Args2...>;
135 using ReturnType =
typename tuple_cat_impl<NTuples - 1, MergedTupleType, Tuples...>::ReturnType;
139 template <
typename Tuple1,
size_t... I1s,
typename Tuple2,
size_t... I2s,
typename... MoreTuples>
140 static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1, std::index_sequence<I1s...>,
141 Tuple2&& tuple2, std::index_sequence<I2s...>,
142 MoreTuples&&... tuples) {
143 return tuple_cat_impl<NTuples - 1, MergedTupleType, Tuples...>::run(
144 MergedTupleType(tuple_get_impl<I1s, Args1...>::run(std::forward<Tuple1>(tuple1))...,
145 tuple_get_impl<I2s, Args2...>::run(std::forward<Tuple2>(tuple2))...),
146 std::forward<MoreTuples>(tuples)...);
150 template <
typename Tuple1,
typename Tuple2,
typename... MoreTuples>
151 static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1, Tuple2&& tuple2,
152 MoreTuples&&... tuples) {
153 return run(std::forward<Tuple1>(tuple1), std::make_index_sequence<N1>{}, std::forward<Tuple2>(tuple2),
154 std::make_index_sequence<N2>{}, std::forward<MoreTuples>(tuples)...);
159template <
size_t N,
typename... Args>
160struct tuple_cat_impl<1, TupleImpl<N, Args...>> {
161 using ReturnType = TupleImpl<N, Args...>;
163 template <
typename Tuple1>
164 static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run(Tuple1&& tuple1) {
171struct tuple_cat_impl<0> {
172 using ReturnType = TupleImpl<0>;
173 static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run() {
return ReturnType{}; }
178struct unwrap_reference_wrapper {
183struct unwrap_reference_wrapper<std::reference_wrapper<T>> {
190 using type =
typename unwrap_reference_wrapper<typename std::decay<T>::type>::type;
196template <
typename Tuple>
199template <
typename... Types>
200struct tuple_size<TupleImpl<sizeof...(Types), Types...>> : std::integral_constant<size_t, sizeof...(Types)> {};
209template <
size_t Idx,
typename... Types>
210constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const typename tuple_get_impl<Idx, Types...>::ReturnType& get(
211 const TupleImpl<
sizeof...(Types), Types...>& tuple) {
212 return tuple_get_impl<Idx, Types...>::run(tuple);
215template <
size_t Idx,
typename... Types>
216constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
typename tuple_get_impl<Idx, Types...>::ReturnType& get(
217 TupleImpl<
sizeof...(Types), Types...>& tuple) {
218 return tuple_get_impl<Idx, Types...>::run(tuple);
226template <
typename... Tuples,
typename EnableIf = std::enable_if_t<
227 internal::reduce_all<is_tuple<typename std::decay<Tuples>::type>::value...>::value>>
228constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
229 typename tuple_cat_impl<
sizeof...(Tuples),
typename std::decay<Tuples>::type...>
::ReturnType
230 tuple_cat(Tuples&&... tuples) {
231 return tuple_cat_impl<
sizeof...(Tuples),
typename std::decay<Tuples>::type...>::run(std::forward<Tuples>(tuples)...);
237template <
typename... Args,
typename ReturnType = TupleImpl<
sizeof...(Args), Args&...>>
238constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType tie(Args&... args)
noexcept {
239 return ReturnType{args...};
245template <
typename... Args,
typename ReturnType = TupleImpl<
sizeof...(Args),
typename unwrap_decay<Args>::type...>>
246constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType make_tuple(Args&&... args) {
247 return ReturnType{std::forward<Args>(args)...};
253template <
typename... Args>
254constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TupleImpl<
sizeof...(Args), Args...> forward_as_tuple(Args&&... args) {
255 return TupleImpl<
sizeof...(Args), Args...>(std::forward<Args>(args)...);
261template <
typename... Types>
262using tuple = TupleImpl<
sizeof...(Types), Types...>;
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
std::enable_if_t< std::is_base_of< DenseBase< std::decay_t< DerivedA > >, std::decay_t< DerivedA > >::value &&std::is_base_of< DenseBase< std::decay_t< DerivedB > >, std::decay_t< DerivedB > >::value, void > swap(DerivedA &&a, DerivedB &&b)
Definition DenseBase.h:667