1 #ifndef TUPLE_UTILS_HPP 2 #define TUPLE_UTILS_HPP 11 template <
class Tuple,
class F,
size_t... Is>
14 std::index_sequence<Is...>) {
15 return std::make_tuple(f(std::get<Is>(std::forward<Tuple>(t)))...);
19 template <
class Tuple,
class F>
20 constexpr decltype(
auto)
apply(Tuple&& t, F&& f) {
21 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
23 std::make_index_sequence<len>{});
27 template <
class Tuple,
class F,
size_t... Is>
29 (void)std::initializer_list<int>{
30 (f(std::get<Is>(std::forward<Tuple>(t))), 0)...};
34 template <
class Tuple,
class F>
36 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
38 std::make_index_sequence<len>{});
42 template <
class Tuple,
size_t... Is>
44 std::index_sequence<Is...>) {
45 return std::make_tuple(std::get<Is>(std::forward<Tuple>(t))...);
49 template <
size_t N,
class Tuple>
52 std::make_index_sequence<N>{});
56 template <
size_t N,
class Tuple,
size_t... Is>
58 return std::make_tuple(std::get<N + Is>(std::forward<Tuple>(t))...);
62 template <
size_t N,
class Tuple>
64 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
65 return internal::take_rest_impl<N>(std::forward<Tuple>(t),
66 std::make_index_sequence<len - N>{});
70 template <
class Tuple,
size_t I>
72 return std::get<0>(std::forward<Tuple>(t));
75 template <
class Tuple,
size_t... Is>
77 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
78 return std::get<0>(std::forward<Tuple>(t)) +
80 std::make_index_sequence<len - 1>{});
84 template <
class Tuple>
86 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
88 std::make_index_sequence<len>{});
92 template <
class Tuple1,
class Tuple2,
size_t... Is>
95 std::index_sequence<Is...>) {
96 return std::make_tuple(
97 std::make_pair(std::get<Is>(std::forward<Tuple1>(t1)),
98 std::get<Is>(std::forward<Tuple2>(t2)))...);
102 template <
class Tuple1,
class Tuple2>
103 constexpr decltype(
auto)
zip(Tuple1&& t1, Tuple2&& t2) {
104 constexpr
auto len1 = std::tuple_size<std::remove_reference_t<Tuple1>>::value;
105 constexpr
auto len2 = std::tuple_size<std::remove_reference_t<Tuple2>>::value;
106 static_assert(len1 == len2,
"Two tuple lengths must be the same");
108 std::make_index_sequence<len1>{});
112 template <
class Tuple,
size_t... Is>
114 return std::make_tuple(
115 std::make_pair(Is, std::get<Is>(std::forward<Tuple>(t)))...);
119 template <
class Tuple>
121 constexpr
auto len = std::tuple_size<std::remove_reference_t<Tuple>>::value;
123 std::make_index_sequence<len>{});
126 #endif // TUPLE_UTILS_HPP decltype(auto) constexpr zip(Tuple1 &&t1, Tuple2 &&t2)
Definition: tuple_utils.hpp:103
decltype(auto) constexpr take_front_impl(Tuple &&t, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:43
constexpr void apply_void(Tuple &&t, F &&f)
Definition: tuple_utils.hpp:35
Definition: adapter_base.hpp:12
decltype(auto) constexpr enumerate(Tuple &&t)
Definition: tuple_utils.hpp:120
decltype(auto) constexpr take_rest_impl(Tuple &&t, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:57
decltype(auto) constexpr take_front(Tuple &&t)
Definition: tuple_utils.hpp:50
decltype(auto) constexpr take_rest(Tuple &&t)
Definition: tuple_utils.hpp:63
decltype(auto) constexpr sum_tuple_impl(Tuple &&t, std::index_sequence< I >)
Definition: tuple_utils.hpp:71
decltype(auto) constexpr enumerate_impl(Tuple &&t, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:113
constexpr void apply_void_impl(Tuple &&t, F &&f, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:28
decltype(auto) constexpr sum_tuple(Tuple &&t)
Definition: tuple_utils.hpp:85
decltype(auto) constexpr apply_impl(Tuple &&t, F &&f, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:12
decltype(auto) constexpr zip_impl(Tuple1 &&t1, Tuple2 &&t2, std::index_sequence< Is... >)
Definition: tuple_utils.hpp:93
decltype(auto) constexpr apply(Tuple &&t, F &&f)
Definition: tuple_utils.hpp:20