21#ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_TUPLE_HPP
22#define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_TUPLE_HPP
28template <
bool,
typename T =
void>
struct StaticIf;
46template <
class T,
class... Ts>
47struct Tuple<T, Ts...> {
48 Tuple(T t, Ts... ts) : head(t), tail(ts...) {}
58template <
size_t,
class>
63template <
class T,
class... Ts>
74template <
size_t k,
class T,
class... Ts>
86#define TERMINATE_CONDS_TUPLE_GET(CVQual) \
87template <size_t k, class... Ts> \
88typename StaticIf<k == 0, CVQual typename ElemTypeHolder<0, Tuple<Ts...> >::type &>::type \
89get(CVQual Tuple<Ts...> &t) { \
90 static_assert(sizeof...(Ts)!=0, "The requseted value is bigger than the size of the tuple"); \
94TERMINATE_CONDS_TUPLE_GET(
const)
95TERMINATE_CONDS_TUPLE_GET()
96#undef TERMINATE_CONDS_TUPLE_GET
104#define RECURSIVE_TUPLE_GET(CVQual) \
105template <size_t k, class T, class... Ts> \
106typename StaticIf<k != 0, CVQual typename ElemTypeHolder<k, Tuple<T, Ts...> >::type &>::type \
107get(CVQual Tuple<T, Ts...> &t) { \
108 return utility::tuple::get<k - 1>(t.tail); \
110RECURSIVE_TUPLE_GET(
const)
112#undef RECURSIVE_TUPLE_GET
120template <
typename... Args>
121Tuple<Args...> make_tuple(Args... args) {
122 return Tuple<Args...>(args...);
130template <
typename... Args>
131static constexpr size_t size(Tuple<Args...> &) {
132 return sizeof...(Args);
138template <
size_t... Is>
147template <
size_t MIN,
size_t N,
size_t... Is>
151#ifndef EIGEN_PARSED_BY_DOXYGEN
156template <
size_t MIN,
size_t... Is>
167template <
size_t MIN,
size_t N,
size_t... Is>
174template <
size_t MIN,
size_t MAX>
186template <
typename... Args,
typename T,
size_t... I>
188 return utility::tuple::make_tuple(get<I>(t)..., a);
199template <
typename... Args,
typename T>
200Tuple<Args..., T> append(Tuple<Args...> t, T a) {
201 return utility::tuple::append_base(t, a, IndexRange<0,
sizeof...(Args)>());
217template <
typename... Args1,
typename... Args2,
size_t... I1,
size_t... I2>
218Tuple<Args1..., Args2...> append_base(Tuple<Args1...> t1, Tuple<Args2...> t2, IndexList<I1...>, IndexList<I2...>) {
219 return utility::tuple::make_tuple(get<I1>(t1)...,get<I2>(t2)...);
231template <
typename... Args1,
typename... Args2>
233 return utility::tuple::append_base(t1, t2,
IndexRange<0,
sizeof...(Args1)>(),
IndexRange<0,
sizeof...(Args2)>());
ElemTypeHolder class is used to specify the types of the elements inside the tuple.
Definition TensorSyclTuple.h:59
Creates a list of index from the elements in the tuple.
Definition TensorSyclTuple.h:139
IndexRange that returns a [MIN, MAX) index range.
Definition TensorSyclTuple.h:175
Collects internal details for generating index ranges [MIN, MAX) Declare primary template for index r...
Definition TensorSyclTuple.h:148
The StaticIf struct is used to statically choose the type based on the condition.
Definition TensorSyclTuple.h:28
is a fixed-size collection of heterogeneous values
Definition TensorSyclTuple.h:40