17 #ifndef OPENKALMAN_TUPLE_WRAPPER_HPP 18 #define OPENKALMAN_TUPLE_WRAPPER_HPP 37 template<viewable_tuple_like T>
39 template<
typename T,
typename =
void>
45 #ifndef __cpp_concepts 46 static_assert(viewable_tuple_like<T>);
49 using Seq = std::make_index_sequence<size_of_v<T>>;
52 template<
typename U, std::size_t...i>
53 static constexpr decltype(
auto)
56 return std::tuple {
movable_wrapper {collections::get<i>(std::forward<U>(u))}...};
74 #ifdef __cpp_lib_concepts 75 tuple_wrapper() noexcept(
std::is_nothrow_default_constructible_v<
T_>) requires
std::default_initializable<
T_> = default;
85 tuple_wrapper(T&& t) noexcept : t_ {fill_tuple(std::forward<T>(t), Seq{})} {}
91 #ifdef __cpp_explicit_this_parameter 92 template<std::
size_t i>
93 constexpr decltype(
auto)
94 get(
this auto&&
self) noexcept
96 static_assert(i < size_of_v<T>,
"Index out of range");
97 return collections::get<i>(*(std::forward<decltype(self)>(
self).t_).get());
100 template<std::
size_t i>
101 constexpr decltype(
auto)
get() & noexcept
103 static_assert(i < size_of_v<T>,
"Index out of range");
104 return collections::get<i>(*t_).get();
108 template<std::
size_t i>
109 constexpr decltype(
auto)
get() const & noexcept
111 static_assert(i < size_of_v<T>,
"Index out of range");
112 return collections::get<i>(*t_).get();
116 template<std::
size_t i>
117 constexpr decltype(
auto)
get() && noexcept
119 static_assert(i < size_of_v<T>,
"Index out of range");
120 return collections::get<i>(*std::move(t_)).
get();
124 template<std::
size_t i>
125 constexpr decltype(
auto)
get() const && noexcept
127 static_assert(i < size_of_v<T>,
"Index out of range");
128 return collections::get<i>(*std::move(t_)).
get();
144 #ifdef __cpp_concepts 145 template<viewable_tuple_like T> requires std::move_constructible<T> and std::is_object_v<T>
149 struct
tuple_wrapper<T,
std::enable_if_t<viewable_tuple_like<T> and stdex::move_constructible<T> and std::is_object_v<T>>>
168 #ifdef __cpp_lib_concepts 169 tuple_wrapper() noexcept(
std::is_nothrow_default_constructible_v<
T_>) requires
std::default_initializable<
T_> = default;
185 template<std::
size_t i>
186 constexpr decltype(
auto)
get() & noexcept
188 static_assert(i < size_of_v<T>,
"Index out of range");
189 return collections::get<i>(t_.operator*());
193 template<std::
size_t i>
194 constexpr decltype(
auto)
get() const & noexcept
196 static_assert(i < size_of_v<T>,
"Index out of range");
197 return collections::get<i>(t_.operator*());
201 template<std::
size_t i>
202 constexpr decltype(
auto)
get() && noexcept
204 static_assert(i < size_of_v<T>,
"Index out of range");
205 return collections::get<i>(std::move(t_.operator*()));
209 template<std::
size_t i>
210 constexpr decltype(
auto)
get() const && noexcept
212 static_assert(i < size_of_v<T>,
"Index out of range");
213 return collections::get<i>(std::move(t_.operator*()));
228 #ifdef __cpp_concepts 229 template<viewable_tuple_like T>
258 template<std::
size_t i>
259 constexpr decltype(
auto)
get() const noexcept
261 static_assert(i < size_of_v<T>,
"Index out of range");
262 return collections::get<i>(t_.get());
284 template<
typename Tup>
285 struct tuple_size<
OpenKalman::collections::internal::tuple_wrapper<Tup>>
288 template<std::
size_t i,
typename Tup>
289 struct tuple_element<i, OpenKalman::collections::internal::tuple_wrapper<Tup>>
T & type
The wrapped type.
Definition: tuple_wrapper.hpp:245
Definition for collections::get.
constexpr tuple_wrapper(T &t)
Construct from an lvalue reference.
Definition: tuple_wrapper.hpp:252
Definition: tuple_wrapper.hpp:41
Definition for collections::size_of.
The size of a sized object (including a collection).
Definition: size_of.hpp:33
Definition for collections::viewable_tuple_like.
The root namespace for OpenKalman.
Definition: basics.hpp:34
Tup type
The wrapped type.
Definition: tuple_wrapper.hpp:67
constexpr tuple_wrapper(T &&t) noexcept
Construct from an rvalue reference.
Definition: tuple_wrapper.hpp:85
T type
The wrapped type.
Definition: tuple_wrapper.hpp:161
The type of the element at a given index, if it can be determined at compile time.
Definition: collection_element.hpp:48
decltype(auto) constexpr get() &noexcept
Get an element.
Definition: tuple_wrapper.hpp:101
Definition: trait_backports.hpp:64
constexpr tuple_wrapper(T &&t)
Construct from an rvalue reference.
Definition: tuple_wrapper.hpp:179
constexpr tuple_wrapper() noexcept(std::is_nothrow_default_constructible_v< T_ >)=default
Default constructor.
Definition: tuple_like_to_tuple.hpp:24
Basic definitions for OpenKalman as a whole.
Definition for collections::collection_element.
Definition: movable_wrapper.hpp:35