Skip to content

Commit a3a2505

Browse files
author
Julian LALU
committed
Add tuple piecewise construction
1 parent c1cc1b9 commit a3a2505

File tree

2 files changed

+67
-14
lines changed

2 files changed

+67
-14
lines changed

interface/core/containers/tuple.h

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ namespace hud
9191
* @param arg Object to move construct into the tuple leaf
9292
*/
9393
template<typename UType>
94+
requires(hud::is_constructible_v<type_t, UType>)
9495
HD_FORCEINLINE constexpr tuple_leaf(UType &&arg) noexcept
9596
: content(hud::forward<UType>(arg))
9697
{
@@ -105,10 +106,10 @@ namespace hud
105106
* @param ... Index sequences used to unpack the tuple elements.
106107
*/
107108
template<typename tuple_type, usize... indexes>
108-
constexpr tuple_leaf(tuple_type &tuple, hud::index_sequence<indexes...>) noexcept
109-
: content(hud::get<indexes>(hud::move(tuple))...)
109+
constexpr tuple_leaf(tuple_type tuple, hud::index_sequence<indexes...>) noexcept
110+
: content(hud::get<indexes>(tuple)...)
110111
{
111-
static_assert(hud::is_nothrow_constructible_v<type_t, hud::get<indexes>(hud::move(tuple))...>, "type_t(hud::get<indexes>(tuple)&&...) constructor is throwable. pair is not designed to allow throwable constructible components");
112+
// static_assert(hud::is_nothrow_constructible_v<type_t, hud::get<indexes>(tuple)...>, "type_t(hud::get<indexes>(tuple)&&...) constructor is throwable. pair is not designed to allow throwable constructible components");
112113
}
113114

114115
/**
@@ -180,19 +181,37 @@ namespace hud
180181
{
181182
}
182183

183-
/**
184-
* Piecewise constructor for `tuple` using tuples of arguments to construct each tuple leafs.
185-
* This constructor forwards the elements of the tuples into the respective constructors.
186-
*
187-
* @param hud::tag_piecewise_construct_t Tag to indicate piecewise construction.
188-
* @param tuples Tuples containing arguments to forward to the constructor of each leafs.
189-
*/
184+
// /**
185+
// * Piecewise constructor for `tuple` using tuples of arguments to construct each tuple leafs.
186+
// * This constructor forwards the elements of the tuples into the respective constructors.
187+
// *
188+
// * @param hud::tag_piecewise_construct_t Tag to indicate piecewise construction.
189+
// * @param tuples Tuples containing arguments to forward to the constructor of each leafs.
190+
// */
190191
template<typename... tuple_types>
191-
constexpr tuple_impl(hud::tag_piecewise_construct_t, tuple_types... tuples) noexcept
192-
: tuple_leaf<indices, types_t>(hud::get<indices>(hud::move(tuples))...)
192+
constexpr tuple_impl(hud::tag_piecewise_construct_t, tuple_types &&...tuples) noexcept
193+
: tuple_leaf<indices, types_t>(tuples..., hud::make_index_sequence<hud::tuple_size_v<tuples...>> {})...
193194
{
194195
}
195196

197+
// template<typename... tuple_types>
198+
// constexpr tuple_impl(hud::tag_piecewise_construct_t, tuple_type tuple) noexcept
199+
// : tuple_leaf<indices, types_t>()
200+
// {
201+
// }
202+
203+
// template<typename... types_t, typename... tuple_rest>
204+
// constexpr tuple_impl(hud::tag_piecewise_construct_t, tuple_impl<types_t...> tuple, tuple_rest... rest) noexcept
205+
// : tuple_leaf<indices, types_t>(tuple, hud::make_index_sequence_for<types_t...>)...
206+
// {
207+
// }
208+
209+
// template<typename... types_t>
210+
// constexpr tuple_impl(hud::tag_piecewise_construct_t, tuple_impl<types_t...> tuple) noexcept
211+
// : tuple_leaf<indices, types_t>(tuple, hud::make_index_sequence_for<types_t...>)...
212+
// {
213+
// }
214+
196215
/** Copy constructor */
197216
constexpr tuple_impl(const tuple_impl &) = default;
198217

@@ -650,8 +669,8 @@ namespace hud
650669
* @param tuples Tuples containing arguments to forward to the constructor of each element.
651670
*/
652671
template<typename... tuple_types>
653-
constexpr tuple(hud::tag_piecewise_construct_t, tuple_types... tuples) noexcept
654-
: super_type(hud::tag_piecewise_construct, hud::forward<tuple_types>(tuples)...)
672+
constexpr tuple(hud::tag_piecewise_construct_t, tuple_types &&...tuples) noexcept
673+
: super_type(hud::tag_piecewise_construct, tuples...)
655674
{
656675
}
657676

test/tuple/tuple_constructors.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,3 +2267,37 @@ GTEST_TEST(tuple, move_constructor_moveable_different_types)
22672267
hud_assert_true(std::get<5>(result));
22682268
}
22692269
}
2270+
2271+
GTEST_TEST(tuple, piecewise_constructor_trivial_type_same_type)
2272+
{
2273+
// using tuple_type = hud::tuple<i32, u32, i64, u64>;
2274+
2275+
// const auto test = []()
2276+
// {
2277+
// const tuple_type tuple {hud::tag_piecewise_construct, hud::forward_as_tuple(1), hud::forward_as_tuple(2), hud::forward_as_tuple(3), hud::forward_as_tuple(4)};
2278+
// return std::tuple {
2279+
// hud::get<0>(tuple) == 1,
2280+
// hud::get<1>(tuple) == 2,
2281+
// hud::get<2>(tuple) == 3,
2282+
// hud::get<3>(tuple) == 4,
2283+
// };
2284+
// };
2285+
2286+
// // Non constant
2287+
// {
2288+
// const auto result = test();
2289+
// hud_assert_true(std::get<0>(result));
2290+
// hud_assert_true(std::get<1>(result));
2291+
// hud_assert_true(std::get<2>(result));
2292+
// hud_assert_true(std::get<3>(result));
2293+
// }
2294+
2295+
// Constant
2296+
// {
2297+
// constexpr auto result = test();
2298+
// hud_assert_true(std::get<0>(result));
2299+
// hud_assert_true(std::get<1>(result));
2300+
// hud_assert_true(std::get<2>(result));
2301+
// hud_assert_true(std::get<3>(result));
2302+
// }
2303+
}

0 commit comments

Comments
 (0)