10 #ifndef EIGEN_TUPLE_GPU 11 #define EIGEN_TUPLE_GPU 13 #include <type_traits> 20 namespace tuple_impl {
23 template <
size_t N,
typename... Types>
27 template <
size_t N,
typename T1,
typename... Ts>
28 class 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_;
91 class TupleImpl<size_t(0)> {};
93 template <
typename TupleType>
94 struct is_tuple : std::false_type {};
96 template <
typename... Types>
97 struct is_tuple<TupleImpl<sizeof...(Types), Types...>> : std::true_type {};
100 template <
size_t Idx,
typename T1,
typename... Ts>
101 struct 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());
115 template <
typename T1,
typename... Ts>
116 struct 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(); }
126 template <
size_t NTuples,
typename... Tuples>
127 struct tuple_cat_impl;
129 template <
size_t NTuples,
size_t N1,
typename... Args1,
size_t N2,
typename... Args2,
typename... Tuples>
130 struct 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)...);
159 template <
size_t N,
typename... Args>
160 struct 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) {
171 struct tuple_cat_impl<0> {
172 using ReturnType = TupleImpl<0>;
173 static constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType run() {
return ReturnType{}; }
177 template <
typename T>
178 struct unwrap_reference_wrapper {
182 template <
typename T>
183 struct unwrap_reference_wrapper<
std::reference_wrapper<T>> {
188 template <
typename T>
189 struct unwrap_decay {
190 using type =
typename unwrap_reference_wrapper<typename std::decay<T>::type>::type;
196 template <
typename Tuple>
199 template <
typename... Types>
200 struct tuple_size<TupleImpl<sizeof...(Types), Types...>> : std::integral_constant<size_t, sizeof...(Types)> {};
209 template <
size_t Idx,
typename... Types>
210 constexpr 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);
215 template <
size_t Idx,
typename... Types>
216 constexpr 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);
226 template <
typename... Tuples,
typename EnableIf = std::enable_if_t<
227 internal::reduce_all<is_tuple<typename std::decay<Tuples>::type>::value...>::value>>
228 constexpr 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)...);
237 template <
typename... Args,
typename ReturnType = TupleImpl<
sizeof...(Args), Args&...>>
238 constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType tie(Args&... args) noexcept {
239 return ReturnType{args...};
245 template <
typename... Args,
typename ReturnType = TupleImpl<
sizeof...(Args),
typename unwrap_decay<Args>::type...>>
246 constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ReturnType make_tuple(Args&&... args) {
247 return ReturnType{std::forward<Args>(args)...};
253 template <
typename... Args>
254 constexpr 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)...);
261 template <
typename... Types>
262 using tuple = TupleImpl<
sizeof...(Types), Types...>;
268 #endif // EIGEN_TUPLE_GPU Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
Definition: BFloat16.h:231
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