Skip to content

Commit 7186173

Browse files
committed
Fix tuple assignment
1 parent b3d6bab commit 7186173

3 files changed

Lines changed: 35 additions & 32 deletions

File tree

interface/core/containers/compressed_tuple.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ namespace hud
706706
constexpr compressed_tuple &operator=(const compressed_tuple &other) noexcept
707707
requires(hud::conjunction_v<hud::is_copy_assignable<types_t>...>)
708708
{
709-
details::tuple::tuple_assign<sizeof...(types_t), compressed_tuple, compressed_tuple>()(*this, other);
709+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, other);
710710
return *this;
711711
}
712712

@@ -721,7 +721,7 @@ namespace hud
721721
requires(hud::conjunction_v<hud::is_copy_assignable<types_t, u_types_t>...>)
722722
constexpr compressed_tuple &operator=(const compressed_tuple<u_types_t...> &other) noexcept
723723
{
724-
details::tuple::tuple_assign<sizeof...(types_t), compressed_tuple, compressed_tuple<u_types_t...>>()(*this, other);
724+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, other);
725725
return *this;
726726
}
727727

@@ -735,7 +735,7 @@ namespace hud
735735
constexpr compressed_tuple &operator=(compressed_tuple &&other) noexcept
736736
requires(hud::conjunction_v<hud::is_move_assignable<types_t>...>)
737737
{
738-
details::tuple::tuple_assign<sizeof...(types_t), compressed_tuple, compressed_tuple>()(*this, hud::move(other));
738+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, hud::move(other));
739739
return *this;
740740
}
741741

@@ -750,7 +750,7 @@ namespace hud
750750
requires(hud::conjunction_v<hud::is_move_assignable<types_t, u_types_t>...>)
751751
constexpr compressed_tuple &operator=(compressed_tuple<u_types_t...> &&other) noexcept
752752
{
753-
details::tuple::tuple_assign<sizeof...(types_t), compressed_tuple, compressed_tuple<u_types_t...>>()(*this, hud::move(other));
753+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, hud::move(other));
754754
return *this;
755755
}
756756

interface/core/containers/tuple.h

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -320,30 +320,25 @@ namespace hud
320320
* Recursively assign a tuple to another.
321321
* @tparam count Number of element to assign
322322
*/
323-
template<usize count, typename tuple_to_type, typename tuple_from_type>
324-
struct tuple_assign;
325-
326-
template<usize count, typename... types_t, typename... u_types_t>
327-
struct tuple_assign<count, hud::tuple<types_t...>, hud::tuple<u_types_t...>>
323+
template<usize count>
324+
struct tuple_assign
328325
{
329-
using tuple_to_type = hud::tuple<types_t...>;
330-
using tuple_from_type = hud::tuple<u_types_t...>;
331-
332326
/**
333327
* Assign a 2 tuple elements.
334328
* @tparam types_t... List of types_t of the tuple to
335329
* @tparam u_types_t... List of types_t of the tuple from
336330
* @param to The assigned tuple
337331
* @param from The tuple to assign
338332
*/
333+
template<typename tuple_to_type, typename tuple_from_type>
339334
constexpr void operator()([[maybe_unused]] tuple_to_type &to, [[maybe_unused]] const tuple_from_type &from) noexcept
340335
{
341336
static_assert(hud::tuple_size_v<tuple_to_type> == hud::tuple_size_v<tuple_from_type>, "Assigning tuples of different size is not supported");
342337
if constexpr (count > 0u)
343338
{
344339
constexpr const usize idx = tuple_size_v<tuple_to_type> - count;
345-
hud::get<idx>(to) = hud::get<idx>(from);
346-
tuple_assign<count - 1u, tuple_to_type, tuple_from_type>()(to, from);
340+
get<idx>(to) = get<idx>(from);
341+
tuple_assign<count - 1u>()(to, from);
347342
}
348343
}
349344

@@ -354,18 +349,26 @@ namespace hud
354349
* @param to The assigned tuple
355350
* @param from The tuple to assign
356351
*/
352+
template<typename tuple_to_type, typename tuple_from_type>
357353
constexpr void operator()([[maybe_unused]] tuple_to_type &to, [[maybe_unused]] tuple_from_type &&from) noexcept
358354
{
359355
static_assert(hud::tuple_size_v<tuple_to_type> == hud::tuple_size_v<tuple_from_type>, "Assigning tuples of different size is not supported");
360356
if constexpr (count > 0)
361357
{
362358
constexpr const usize idx = tuple_size_v<tuple_to_type> - count;
363-
hud::get<idx>(to) = hud::get<idx>(hud::move(from));
364-
tuple_assign<count - 1u, tuple_to_type, tuple_from_type>()(to, hud::move(from));
359+
get<idx>(to) = get<idx>(hud::move(from));
360+
tuple_assign<count - 1u>()(to, hud::move(from));
365361
}
366362
}
367363
};
368364

365+
// template<usize count, typename... types_t, typename... u_types_t>
366+
// struct tuple_assign<count, hud::tuple<types_t...>, hud::tuple<u_types_t...>>
367+
// {
368+
// using tuple_to_type = hud::tuple<types_t...>;
369+
// using tuple_from_type = hud::tuple<u_types_t...>;
370+
// };
371+
369372
/** Swap tuple1_t and tuple2_t element at the index if element is swappable. */
370373
template<usize type_index, typename tuple1_t, typename tuple2_t, bool = hud::is_swappable_v<hud::tuple_element_t<type_index, tuple1_t>, hud::tuple_element_t<type_index, tuple2_t>>>
371374
struct swap_element
@@ -815,7 +818,7 @@ namespace hud
815818
constexpr tuple &operator=(const tuple &other) noexcept
816819
requires(hud::conjunction_v<hud::is_copy_assignable<types_t>...>)
817820
{
818-
details::tuple::tuple_assign<sizeof...(types_t), tuple, tuple>()(*this, other);
821+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, other);
819822
return *this;
820823
}
821824

@@ -830,7 +833,7 @@ namespace hud
830833
requires(hud::conjunction_v<hud::is_copy_assignable<types_t, u_types_t>...>)
831834
constexpr tuple &operator=(const tuple<u_types_t...> &other) noexcept
832835
{
833-
details::tuple::tuple_assign<sizeof...(types_t), tuple, tuple<u_types_t...>>()(*this, other);
836+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, other);
834837
return *this;
835838
}
836839

@@ -844,7 +847,7 @@ namespace hud
844847
constexpr tuple &operator=(tuple &&other) noexcept
845848
requires(hud::conjunction_v<hud::is_move_assignable<types_t>...>)
846849
{
847-
details::tuple::tuple_assign<sizeof...(types_t), tuple, tuple>()(*this, hud::move(other));
850+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, hud::move(other));
848851
return *this;
849852
}
850853

@@ -859,7 +862,7 @@ namespace hud
859862
requires(hud::conjunction_v<hud::is_move_assignable<types_t, u_types_t>...>)
860863
constexpr tuple &operator=(tuple<u_types_t...> &&other) noexcept
861864
{
862-
details::tuple::tuple_assign<sizeof...(types_t), tuple, tuple<u_types_t...>>()(*this, hud::move(other));
865+
details::tuple::tuple_assign<sizeof...(types_t)>()(*this, hud::move(other));
863866
return *this;
864867
}
865868

test/compressed_tuple/compressed_tuple_assignments.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ GTEST_TEST(compressed_tuple, copy_assign_trivially_copy_assignable_same_types)
99
tuple_type compressed_tuple {hud::tag_init};
1010
const tuple_type other_tuple {12.0f, 123, L'h'};
1111
compressed_tuple = other_tuple;
12-
return std::compressed_tuple {
12+
return std::tuple {
1313
hud::get<0>(compressed_tuple) == 12.f,
1414
hud::get<1>(compressed_tuple) == 123,
1515
hud::get<2>(compressed_tuple) == L'h',
@@ -43,7 +43,7 @@ GTEST_TEST(compressed_tuple, copy_assign_trivially_copy_assignable_different_typ
4343
tuple_type compressed_tuple {hud::tag_init};
4444
const other_tuple_type other_tuple {(u16)12, (i16)123, u'h'};
4545
compressed_tuple = other_tuple;
46-
return std::compressed_tuple {
46+
return std::tuple {
4747
hud::get<0>(compressed_tuple) == 12,
4848
hud::get<1>(compressed_tuple) == 123,
4949
hud::get<2>(compressed_tuple) == L'h',
@@ -76,7 +76,7 @@ GTEST_TEST(compressed_tuple, copy_assign_non_trivially_copy_assignable_same_type
7676
tuple_type compressed_tuple {hud::tag_init};
7777
const tuple_type other_tuple {1, 12.0f, 123, L'h'};
7878
compressed_tuple = other_tuple;
79-
return std::compressed_tuple {
79+
return std::tuple {
8080
hud::get<0>(compressed_tuple).id() == 1,
8181
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
8282
hud::get<0>(compressed_tuple).copy_assign_count() == 1u,
@@ -119,7 +119,7 @@ GTEST_TEST(compressed_tuple, copy_assign_non_trivially_copy_assignable_different
119119
tuple_type compressed_tuple {hud::tag_init};
120120
const other_tuple_type other_tuple {1, (u16)12, (i16)123, u'h'};
121121
compressed_tuple = other_tuple;
122-
return std::compressed_tuple {
122+
return std::tuple {
123123
hud::get<0>(compressed_tuple).id() == 1,
124124
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
125125
hud::get<0>(compressed_tuple).copy_assign_count() == 1u,
@@ -161,7 +161,7 @@ GTEST_TEST(compressed_tuple, move_assign_trivially_copy_assignable_same_types)
161161
tuple_type compressed_tuple {hud::tag_init};
162162
tuple_type other_tuple {12.0f, 123, L'h'};
163163
compressed_tuple = hud::move(other_tuple);
164-
return std::compressed_tuple {
164+
return std::tuple {
165165
hud::get<0>(compressed_tuple) == 12.f,
166166
hud::get<1>(compressed_tuple) == 123,
167167
hud::get<2>(compressed_tuple) == L'h',
@@ -195,7 +195,7 @@ GTEST_TEST(compressed_tuple, move_assign_trivially_copy_assignable_different_typ
195195
tuple_type compressed_tuple {hud::tag_init};
196196
other_tuple_type other_tuple {(u16)12, (i16)123, u'h'};
197197
compressed_tuple = hud::move(other_tuple);
198-
return std::compressed_tuple {
198+
return std::tuple {
199199
hud::get<0>(compressed_tuple) == 12,
200200
hud::get<1>(compressed_tuple) == 123,
201201
hud::get<2>(compressed_tuple) == L'h',
@@ -228,7 +228,7 @@ GTEST_TEST(compressed_tuple, move_assign_non_trivially_copy_assignable_same_type
228228
tuple_type compressed_tuple {hud::tag_init};
229229
tuple_type other_tuple {1, 12.0f, 123, L'h'};
230230
compressed_tuple = hud::move(other_tuple);
231-
return std::compressed_tuple {
231+
return std::tuple {
232232
hud::get<0>(compressed_tuple).id() == 1,
233233
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
234234
hud::get<0>(compressed_tuple).copy_assign_count() == 1u,
@@ -271,7 +271,7 @@ GTEST_TEST(compressed_tuple, move_assign_non_trivially_copy_assignable_different
271271
tuple_type compressed_tuple {hud::tag_init};
272272
other_tuple_type other_tuple {1, (u16)12, (i16)123, u'h'};
273273
compressed_tuple = hud::move(other_tuple);
274-
return std::compressed_tuple {
274+
return std::tuple {
275275
hud::get<0>(compressed_tuple).id() == 1,
276276
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
277277
hud::get<0>(compressed_tuple).copy_assign_count() == 1u,
@@ -313,7 +313,7 @@ GTEST_TEST(compressed_tuple, move_assign_trivially_move_assignable_same_types)
313313
tuple_type compressed_tuple {hud::tag_init};
314314
tuple_type other_tuple {12.0f, 123, L'h'};
315315
compressed_tuple = hud::move(other_tuple);
316-
return std::compressed_tuple {
316+
return std::tuple {
317317
hud::get<0>(compressed_tuple) == 12.f,
318318
hud::get<1>(compressed_tuple) == 123,
319319
hud::get<2>(compressed_tuple) == L'h',
@@ -347,7 +347,7 @@ GTEST_TEST(compressed_tuple, move_assign_trivially_move_assignable_different_typ
347347
tuple_type compressed_tuple {hud::tag_init};
348348
other_tuple_type other_tuple {(u16)12, (i16)123, u'h'};
349349
compressed_tuple = hud::move(other_tuple);
350-
return std::compressed_tuple {
350+
return std::tuple {
351351
hud::get<0>(compressed_tuple) == 12,
352352
hud::get<1>(compressed_tuple) == 123,
353353
hud::get<2>(compressed_tuple) == L'h',
@@ -380,7 +380,7 @@ GTEST_TEST(compressed_tuple, move_assign_non_trivially_move_assignable_same_type
380380
tuple_type compressed_tuple {hud::tag_init};
381381
tuple_type other_tuple {1, 12.0f, 123, L'h'};
382382
compressed_tuple = hud::move(other_tuple);
383-
return std::compressed_tuple {
383+
return std::tuple {
384384
hud::get<0>(compressed_tuple).id() == 1,
385385
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
386386
hud::get<0>(compressed_tuple).move_constructor_count() == 0u,
@@ -429,7 +429,7 @@ GTEST_TEST(compressed_tuple, move_assign_non_trivially_move_assignable_different
429429
tuple_type compressed_tuple {hud::tag_init};
430430
other_tuple_type other_tuple {1, (u16)12, (i16)123, u'h'};
431431
compressed_tuple = hud::move(other_tuple);
432-
return std::compressed_tuple {
432+
return std::tuple {
433433
hud::get<0>(compressed_tuple).id() == 1,
434434
hud::get<0>(compressed_tuple).copy_constructor_count() == 0u,
435435
hud::get<0>(compressed_tuple).move_constructor_count() == 0u,

0 commit comments

Comments
 (0)