17 #ifndef OPENKALMAN_TUPLE_SLICE_HPP 18 #define OPENKALMAN_TUPLE_SLICE_HPP 20 #include <type_traits> 33 template<std::
size_t index1, std::
size_t index2, tuple_like T> requires
34 (index1 <= index2) and (index2 <= std::tuple_size_v<std::decay_t<T>>)
36 template<std::
size_t index1, std::
size_t index2,
typename T>
42 static constexpr
auto base_size = std::tuple_size_v<std::decay_t<T>>;
47 constexpr
tuple_slice_view() requires std::default_initializable<T> =
default;
49 template<
typename aT = T, std::enable_if_t<std::is_default_constructible_v<aT>,
int> = 0>
55 template<
typename Arg> requires std::constructible_from<T, Arg&&>
57 template<
typename Arg, std::enable_if_t<std::is_constructible_v<T, Arg&&>,
int> = 0>
59 explicit constexpr
tuple_slice_view(Arg&& arg) : t {std::forward<Arg>(arg)} {}
66 template<std::
size_t i> requires (i + index1 < index2)
68 template<std::
size_t i, std::enable_if_t<(i + index1 < index2),
int> = 0>
70 friend constexpr decltype(auto)
71 get(const tuple_slice_view& v)
73 return get(v.t, std::
integral_constant<std::
size_t, i + index1>{});
81 template<std::
size_t i> requires (i + index1 < index2)
83 template<std::
size_t i, std::enable_if_t<(i + index1 < index2),
int> = 0>
85 friend constexpr decltype(auto)
86 get(tuple_slice_view&& v)
88 return get(std::move(v).t, std::
integral_constant<std::
size_t, i + index1>{});
101 template<std::
size_t index1, std::
size_t index2,
typename T>
102 struct tuple_size<OpenKalman::collections::tuple_slice_view<index1, index2, T>> : std::integral_constant<std::size_t, index2 - index1> {};
105 template<std::
size_t i, std::
size_t index1, std::
size_t index2,
typename T>
106 struct tuple_element<i,
OpenKalman::collections::tuple_slice_view<index1, index2, T>>
108 static_assert(i + index1 < index2);
109 using type = std::tuple_element_t<i + index1, std::decay_t<T>>;
124 #ifdef __cpp_concepts 125 template<std::
size_t index1, std::
size_t index2, tuple_like Arg> requires
126 (index1 <= index2) and (index2 <= std::tuple_size_v<std::remove_reference_t<Arg>>)
128 template<std::
size_t index1, std::
size_t index2,
typename Arg, std::enable_if_t<tuple_like<Arg> and
129 (index1 <= index2) and (index2 <= std::tuple_size<std::remove_reference_t<Arg>>::value),
int> = 0>
132 tuple_slice(Arg&& arg)
134 return tuple_slice_view<index1, index2, Arg> {std::forward<Arg>(arg)};
141 #ifdef __cpp_concepts
142 template<std::
size_t index1, std::
size_t index2, tuple_like T> requires std::default_initializable<T>
144 template<std::size_t index1, std::size_t index2,
typename T, std::enable_if_t<
145 tuple_like<T> and std::is_default_constructible_v<T>,
int> = 0>
155 #endif //OPENKALMAN_TUPLE_SLICE_HPP Definition for collections::tuple_like.
Namespace for collections.
Definition: collections.hpp:27
The root namespace for OpenKalman.
Definition: basics.hpp:34
constexpr auto tuple_slice(Arg &&arg)
Takes a slice of a tuple, given an index range.
Definition: tuple_slice.hpp:132
A view to a slice of a tuple_like object.
Definition: tuple_slice.hpp:38