11 #ifndef smtk_TupleTraits_h
12 #define smtk_TupleTraits_h
30 template<
typename T,
typename Tuple>
37 using type = std::tuple<T>;
41 template<
typename T,
typename U,
typename... Ts>
48 template<
typename T,
typename... Ts>
51 using type = std::tuple<>;
56 template<
typename T,
typename Tuple>
63 using type = std::tuple<T>;
67 template<
typename T,
typename U,
typename... Ts>
70 using type =
typename std::conditional<
71 std::is_base_of<T, U>::value,
79 template<
typename T,
typename... Args>
85 using type = std::tuple<>;
91 using type = std::tuple<T>;
94 template<
typename T,
typename... Args>
97 using type = decltype(std::tuple_cat(
120 using type =
typename untuple<T>::type;
140 using type = std::tuple<>;
144 template<
typename T,
typename... Args>
147 using type = decltype(std::tuple_cat(
148 std::declval<std::tuple<
typename detail::untuple<T>::type>>(),
149 std::declval<
typename flatten_tuple<std::tuple<Args...>>::type>()));
153 template<
typename... TupleArgs,
typename... Args>
156 using type = decltype(std::tuple_cat(
157 std::declval<std::tuple<TupleArgs...>>(),
158 std::declval<
typename flatten_tuple<std::tuple<Args...>>::type>()));
169 template<
typename T,
typename... Args>
176 using type = std::tuple<>;
183 using type = std::tuple<T>;
187 template<
typename T,
typename... Args>
190 using type = decltype(std::tuple_cat(
192 std::declval<
typename unique_tuple<std::tuple<Args...>>::type>()));
207 using type = std::tuple<T>;
210 template<
typename T,
typename... Args>
213 using type = decltype(std::tuple_cat(
214 std::declval<
typename reverse_tuple<std::tuple<Args...>>::type>(),
215 std::declval<std::tuple<T>>()));
227 template<
template<
typename>
class X,
typename T>
230 using type =
typename X<T>::type;
233 template<
template<
typename>
class X,
typename... Args>
236 using type =
typename X<std::tuple<typename recursive<X, Args>::type...>>::type;
258 template<
typename T,
typename Tuple>
262 template<
typename T,
typename... Args>
265 using type = decltype(std::declval<
typename remove_from_tuple<T, std::tuple<Args...>>::type>());
269 template<
typename T,
typename X,
typename... Args>
272 using type = decltype(std::tuple_cat(
273 std::declval<std::tuple<X>>(),
281 using type = std::tuple<>;
291 template<
class T,
class Tuple>
295 template<
class T,
class... Types>
298 constexpr
static const std::size_t value = 0;
302 template<
class T,
class U,
class... Types>
305 constexpr
static const std::size_t value = 1 +
tuple_index<T, std::tuple<Types...>>::value;
316 template<
typename T,
typename Tuple>
326 template<
typename T,
typename U,
typename... Ts>
332 template<
typename T,
typename... Ts>
345 template<std::size_t...>
350 template<std::size_t N, std::size_t... S>
355 template<std::size_t... S>
364 template<std::
size_t I,
typename RI,
template<
typename T,
typename R>
class Reducer,
typename Tuple>
367 template<
typename RI,
template<
typename T,
typename R>
class Reducer,
typename Tuple>
373 template<std::
size_t I,
typename RI,
template<
typename T,
typename R>
class Reducer,
typename Tuple>
376 static_assert(I > 0,
"This template can never terminate the sequence.");
380 typename std::tuple_element<std::tuple_size<Tuple>::value - 1, Tuple>::type,
412 template<
template<
typename T,
typename RI>
class Reducer,
typename Tuple,
typename Start>
415 using type =
typename std::conditional<
416 std::tuple_size<Tuple>::value == 0,
454 template<
typename Functor,
size_t I = 0,
typename... Ts>
455 typename std::enable_if<I ==
sizeof...(Ts),
void>::type
apply(Functor& f, std::tuple<Ts...> tup)
459 template<
typename Functor,
size_t I = 0,
typename... Ts>
460 typename std::enable_if<(I <
sizeof...(Ts)),
void>::type
apply(Functor& f, std::tuple<Ts...> tup)
462 f(I, std::get<I>(tup));
465 apply<Functor, I + 1>(f, tup);
495 template<
typename Tuple, std::
size_t I = 0,
typename Functor>
496 typename std::enable_if<I == std::tuple_size<Tuple>::value,
void>::type
tuple_evaluate(Functor& f)
502 template<
typename Tuple, std::
size_t I = 0,
typename Functor>
503 typename std::enable_if<(I < std::tuple_size<Tuple>::value),
void>::type
tuple_evaluate(Functor& f)
506 f.template evaluate<typename std::tuple_element<I, Tuple>::type>(I);
509 smtk::tuple_evaluate<Tuple, I + 1>(f);