17 #ifndef OPENKALMAN_TUPLE_FLATTEN_HPP 18 #define OPENKALMAN_TUPLE_FLATTEN_HPP 20 #include <type_traits> 28 template<
typename Arg> constexpr
auto 29 tuple_flatten_impl(Arg&&);
32 template<
typename Arg, std::size_t...Ix>
34 tuple_flatten_impl(Arg&& arg, std::index_sequence<Ix...>)
36 if constexpr ((... or
tuple_like<std::tuple_element_t<Ix, std::decay_t<Arg>>>))
37 return
std::tuple_cat(tuple_flatten_impl(
std::
get<Ix>(
std::forward<Arg>(arg)))...);
39 return
std::forward<Arg>(arg);
43 template<typename Arg>
45 tuple_flatten_impl(Arg&& arg)
47 if constexpr (tuple_like<Arg>)
49 constexpr
auto seq = std::make_index_sequence<std::tuple_size_v<std::decay_t<Arg>>>{};
50 return tuple_flatten_impl(std::forward<Arg>(arg), seq);
52 else return std::tuple {std::forward<Arg>(arg)};
62 template<tuple_like Arg>
65 template<
typename Arg, std::enable_if_t<tuple_like<Arg>,
int> = 0>
68 tuple_flatten(Arg&& arg)
70 return detail::tuple_flatten_impl(std::forward<Arg>(arg));
75 #endif //OPENKALMAN_TUPLE_FLATTEN_HPP Definition for collections::tuple_like.
Namespace for collections.
Definition: collections.hpp:27
decltype(auto) constexpr get(Arg &&arg, I i)
A generalization of std::get.
Definition: get.hpp:62
Definition: tuple_reverse.hpp:103
constexpr bool tuple_like
T is a non-empty tuple, pair, array, or other type that acts like a tuple.
Definition: tuple_like.hpp:51