17 #ifndef OPENKALMAN_TUPLE_WRAPPER_HPP 18 #define OPENKALMAN_TUPLE_WRAPPER_HPP 35 template<viewable_tuple_like T>
37 template<
typename T,
typename =
void>
43 #ifndef __cpp_concepts 44 static_assert(viewable_tuple_like<T>);
47 using Seq = std::make_index_sequence<size_of_v<T>>;
50 template<
typename U, std::size_t...i>
51 static constexpr decltype(
auto)
54 return std::tuple {
movable_wrapper {collections::get<i>(std::forward<U>(u))}...};
72 #ifdef __cpp_lib_concepts 73 tuple_wrapper() noexcept(
std::is_nothrow_default_constructible_v<
T_>) requires
std::default_initializable<
T_> = default;
83 tuple_wrapper(T&& t) noexcept : t_ {fill_tuple(std::forward<T>(t), Seq{})} {}
89 #ifdef __cpp_explicit_this_parameter 90 template<std::
size_t i>
91 constexpr decltype(
auto)
92 get(
this auto&&
self) noexcept
94 static_assert(i < size_of_v<T>,
"Index out of range");
95 return collections::get<i>(*(std::forward<decltype(self)>(
self).t_).get());
98 template<std::
size_t i>
99 constexpr decltype(
auto)
get() & noexcept
101 static_assert(i < size_of_v<T>,
"Index out of range");
102 return collections::get<i>(*t_).get();
106 template<std::
size_t i>
107 constexpr decltype(
auto)
get() const & noexcept
109 static_assert(i < size_of_v<T>,
"Index out of range");
110 return collections::get<i>(*t_).get();
114 template<std::
size_t i>
115 constexpr decltype(
auto)
get() && noexcept
117 static_assert(i < size_of_v<T>,
"Index out of range");
118 return collections::get<i>(*std::move(t_)).
get();
122 template<std::
size_t i>
123 constexpr decltype(
auto)
get() const && noexcept
125 static_assert(i < size_of_v<T>,
"Index out of range");
126 return collections::get<i>(*std::move(t_)).
get();
142 #ifdef __cpp_concepts 143 template<viewable_tuple_like T> requires std::move_constructible<T> and std::is_object_v<T>
147 struct
tuple_wrapper<T,
std::enable_if_t<viewable_tuple_like<T> and stdex::move_constructible<T> and std::is_object_v<T>>>
166 #ifdef __cpp_lib_concepts 167 tuple_wrapper() noexcept(
std::is_nothrow_default_constructible_v<
T_>) requires
std::default_initializable<
T_> = default;
183 template<std::
size_t i>
184 constexpr decltype(
auto)
get() & noexcept
186 static_assert(i < size_of_v<T>,
"Index out of range");
187 return collections::get<i>(t_.operator*());
191 template<std::
size_t i>
192 constexpr decltype(
auto)
get() const & noexcept
194 static_assert(i < size_of_v<T>,
"Index out of range");
195 return collections::get<i>(t_.operator*());
199 template<std::
size_t i>
200 constexpr decltype(
auto)
get() && noexcept
202 static_assert(i < size_of_v<T>,
"Index out of range");
203 return collections::get<i>(std::move(t_.operator*()));
207 template<std::
size_t i>
208 constexpr decltype(
auto)
get() const && noexcept
210 static_assert(i < size_of_v<T>,
"Index out of range");
211 return collections::get<i>(std::move(t_.operator*()));
226 #ifdef __cpp_concepts 227 template<viewable_tuple_like T>
256 template<std::
size_t i>
257 constexpr decltype(
auto)
get() const noexcept
259 static_assert(i < size_of_v<T>,
"Index out of range");
260 return collections::get<i>(t_.get());
282 template<
typename Tup>
283 struct tuple_size<
OpenKalman::collections::internal::tuple_wrapper<Tup>> : tuple_size<std::decay_t<Tup>> {};
285 template<std::
size_t i,
typename Tup>
286 struct tuple_element<i, OpenKalman::collections::internal::tuple_wrapper<Tup>> : tuple_element<i, std::decay_t<Tup>> {};
T & type
The wrapped type.
Definition: tuple_wrapper.hpp:243
Definition for collections::get.
constexpr tuple_wrapper(T &t)
Construct from an lvalue reference.
Definition: tuple_wrapper.hpp:250
Definition: tuple_wrapper.hpp:39
Definition for collections::viewable_tuple_like.
The root namespace for OpenKalman.
Definition: basics.hpp:34
Tup type
The wrapped type.
Definition: tuple_wrapper.hpp:65
constexpr tuple_wrapper(T &&t) noexcept
Construct from an rvalue reference.
Definition: tuple_wrapper.hpp:83
T type
The wrapped type.
Definition: tuple_wrapper.hpp:159
decltype(auto) constexpr get() &noexcept
Get an element.
Definition: tuple_wrapper.hpp:99
Definition: trait_backports.hpp:64
constexpr tuple_wrapper(T &&t)
Construct from an rvalue reference.
Definition: tuple_wrapper.hpp:177
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: movable_wrapper.hpp:35