12#include "detray/definitions/detail/qualifiers.hpp"
25template <
typename... Ts>
29 static_assert(
sizeof...(Ts) == 0,
"There's a coding error in detray::tuple!");
33template <
typename T,
typename... Ts>
44 requires(std::is_copy_constructible_v<T> &&
45 (std::is_copy_constructible_v<Ts> && ...))
52 template <
typename U,
typename... Us>
53 requires std::is_constructible_v<T, U &&> &&
54 std::is_constructible_v<
tuple<Ts...>, Us &&...>
61 requires(std::is_move_constructible_v<T> &&
62 (std::is_move_constructible_v<Ts> && ...))
69 template <
typename U,
typename... Us>
70 requires std::is_constructible_v<T, U &&> &&
71 std::is_constructible_v<
tuple<Ts...>, Us &&...>
73 :
v(std::move(o.
v)),
r(std::move(o.
r)) {}
80 template <
typename U,
typename... Us>
81 requires std::is_constructible_v<T, U &&> &&
82 std::is_constructible_v<
tuple<Ts...>, Us &&...> &&
83 (!(std::is_same_v<tuple, U> ||
84 (std::is_same_v<tuple, Us> || ...)))
85 DETRAY_HOST_DEVICE
explicit constexpr tuple(U &&_v, Us &&..._r)
86 :
v(std::forward<U>(_v)),
r(std::forward<Us>(_r)...) {}
88 constexpr ~tuple() noexcept = default;
94 requires(std::is_copy_assignable_v<T> &&
95 (std::is_copy_assignable_v<Ts> && ...))
103 template <typename U, typename... Us>
104 DETRAY_HOST_DEVICE constexpr
tuple &operator=(const
tuple<U, Us...> &other)
105 requires(std::is_assignable_v<T &, const U &> &&
106 (std::is_assignable_v<Ts &, const Us &> && ...))
117 requires(std::is_move_assignable_v<T> &&
118 (std::is_move_assignable_v<Ts> && ...))
126 template <
typename U,
typename... Us>
128 requires(std::is_assignable_v<T &, U> &&
129 (std::is_assignable_v<Ts &, Us> && ...))
131 v = std::move(other.v);
132 r = std::move(other.r);
144template <
typename T1,
typename T2>
151template <std::size_t I,
typename... Ts>
153 static_assert(I <
sizeof...(Ts),
154 "Attempt to access index greater than tuple size.");
156 if constexpr (I == 0) {
159 return ::detray::get<I - 1>(t.r);
167template <std::size_t I,
typename... Ts>
169 static_assert(I <
sizeof...(Ts),
170 "Attempt to access index greater than tuple size.");
172 if constexpr (I == 0) {
175 return ::detray::get<I - 1>(t.r);
183template <
typename U,
typename T,
typename... Ts>
185 if constexpr (std::is_same_v<U, T>) {
187 }
else if constexpr (
sizeof...(Ts) > 0) {
188 static_assert((std::is_same_v<U, Ts> || ...),
"Type not found in tuple.");
189 return ::detray::get<U, Ts...>(t.r);
197template <
typename U,
typename T,
typename... Ts>
199 if constexpr (std::is_same_v<U, T>) {
201 }
else if constexpr (
sizeof...(Ts) > 0) {
202 static_assert((std::is_same_v<U, Ts> || ...),
"Type not found in tuple.");
203 return ::detray::get<U, Ts...>(t.r);
210template <
typename... Ts>
218template <
typename... Ts>
228template <
typename T1,
typename T2>
232 std::forward<T2>(v2));
Detray include(s).
Definition array_operators.hpp:18
constexpr detray::tuple< std::decay_t< Ts >... > make_tuple(Ts &&...vs)
Construct a tuple by decaying and forwarding its arguments.
Definition tuple.hpp:219
const auto & get(const detray::tuple< Ts... > &t) noexcept
Get a tuple element by index from a const tuple.
Definition tuple.hpp:152
tuple< T1, T2 > pair
A two-element tuple alias.
Definition tuple.hpp:145
constexpr detray::tuple< Ts &... > tie(Ts &...args)
Create a tuple of references to the supplied objects.
Definition tuple.hpp:211
constexpr detray::pair< std::decay_t< T1 >, std::decay_t< T2 > > make_pair(T1 &&v1, T2 &&v2)
Construct a pair by decaying and forwarding its two arguments.
Definition tuple.hpp:230
constexpr tuple(U &&_v, Us &&..._r)
Construct the tuple elements from individual values.
Definition tuple.hpp:85
constexpr tuple(const tuple &o)=default
Copy construct this tuple when every element is copy constructible.
constexpr tuple(tuple &&o) noexcept=default
Move construct this tuple when every element is movable.
tuple< Ts... > r
Remaining tuple elements.
Definition tuple.hpp:140
constexpr tuple()=default
Default construct the recursive tuple node when all elements allow it.
constexpr tuple & operator=(tuple &&other) noexcept=default
Move assign this tuple when all elements are movable.
constexpr tuple & operator=(tuple< U, Us... > &&other)
Move assign from a tuple with compatible element types.
Definition tuple.hpp:127
T v
Value stored in this tuple node.
Definition tuple.hpp:136
constexpr tuple(const tuple< U, Us... > &o)
Construct from a tuple with element types convertible to this tuple.
Definition tuple.hpp:55
constexpr tuple(tuple< U, Us... > &&o)
Move construct from a tuple with compatible element types.
Definition tuple.hpp:72
Default tuple type.
Definition tuple.hpp:26