17 #ifndef OPENKALMAN_TUPLE_REVERSE_HPP 18 #define OPENKALMAN_TUPLE_REVERSE_HPP 20 #include <type_traits> 31 template<tuple_like T>
39 static constexpr
auto base_size = std::tuple_size_v<std::decay_t<T>>;
46 template<
typename aT = T, std::enable_if_t<std::is_default_constructible_v<aT>,
int> = 0>
52 template<
typename Arg> requires std::constructible_from<T, Arg&&>
54 template<
typename Arg, std::enable_if_t<std::is_constructible_v<T, Arg&&>,
int> = 0>
63 template<std::
size_t i> requires (i < std::tuple_size_v<std::decay_t<T>>)
65 template<std::
size_t i, std::enable_if_t<i < std::tuple_size_v<std::decay_t<T>>,
int> = 0>
67 friend constexpr decltype(auto)
68 get(const tuple_reverse_view& v)
70 return collections::get(v.t, std::
integral_constant<std::
size_t, base_size - i - 1_uz>{});
78 template<std::
size_t i> requires (i < std::tuple_size_v<std::decay_t<T>>)
80 template<std::
size_t i, std::enable_if_t<i < std::tuple_size_v<std::decay_t<T>>,
int> = 0>
82 friend constexpr decltype(auto)
83 get(tuple_reverse_view&& v)
85 return collections::get(std::move(v).t, std::
integral_constant<std::
size_t, base_size - i - 1_uz>{});
97 template<
typename Arg>
106 struct tuple_size<OpenKalman::collections::tuple_reverse_view<T>> : std::tuple_size<std::decay_t<T>> {};
109 template<std::
size_t i,
typename T>
112 static_assert(i < std::tuple_size_v<std::decay_t<T>>);
113 using type = std::tuple_element_t<std::tuple_size_v<std::decay_t<T>> - i - 1_uz, std::decay_t<T>>;
123 #ifdef __cpp_concepts 124 template<tuple_like Arg>
127 template<
typename Arg, std::enable_if_t<tuple_like<Arg>,
int> = 0>
139 #ifdef __cpp_concepts 140 template<tuple_like T> requires std::default_initializable<T>
142 template<
typename T, std::enable_if_t<tuple_like<T> and std::is_default_constructible_v<T>,
int> = 0>
152 #endif //OPENKALMAN_TUPLE_REVERSE_HPP Definition for collections::tuple_like.
Namespace for collections.
Definition: collections.hpp:27
tuple_reverse_view(Arg &&) -> tuple_reverse_view< Arg >
Deduction guide.
Definition: tuple_reverse.hpp:103
A view of a tuple that reverses the order of a base tuple.
Definition: tuple_reverse.hpp:35
The root namespace for OpenKalman.
Definition: basics.hpp:34
constexpr auto tuple_reverse(Arg &&arg)
Reverses the order of a tuple_like object.
Definition: tuple_reverse.hpp:130
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