Skip to content

Commit 88e47fb

Browse files
authored
Added repeating tuple types (#121)
1 parent 735495c commit 88e47fb

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

lib/wlib/wlib/stl/Tuple.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,28 @@ namespace wlp {
576576
return Tuple<Types &...>(elements...);
577577
}
578578

579+
template<typename Type, size_type>
580+
struct repeat_tuple_type_hopper {
581+
typedef Type type;
582+
};
583+
584+
template<typename, typename>
585+
struct repeat_tuple_type_sub;
586+
587+
template<typename Type, size_type ...Indices>
588+
struct repeat_tuple_type_sub<Type, IndexSequence<Indices...>> {
589+
using type = Tuple<typename repeat_tuple_type_hopper<Type, Indices>::type...>;
590+
};
591+
592+
template<typename Type, size_type Repeat>
593+
struct repeat_tuple_type {
594+
using Sequence = typename MakeIndexSequence<Repeat>::type;
595+
typedef typename repeat_tuple_type_sub<Type, Sequence>::type type;
596+
};
597+
598+
template<typename Type, size_type Repeat>
599+
using RepeatTuple = typename repeat_tuple_type<Type, Repeat>::type;
600+
579601
/**
580602
* Undefined base type for type at tuple.
581603
*/
@@ -765,7 +787,6 @@ namespace wlp {
765787
);
766788
};
767789

768-
769790
}
770791

771792
#endif //EMBEDDEDCPLUSPLUS_TUPLE_H

tests/stl/tuple_check.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,22 @@ TEST(tuple_test, test_tuple_tie) {
139139
ASSERT_EQ('g', c);
140140
ASSERT_DOUBLE_EQ(66.55, d);
141141
}
142+
143+
TEST(tuple_test, test_repeat_tuple_size) {
144+
RepeatTuple<int, 5> rt_1;
145+
size_type value = tuple_size<decltype(rt_1)>::value;
146+
ASSERT_EQ(value, 5);
147+
ASSERT_NE(value, 6);
148+
RepeatTuple<int, 6> rt_2;
149+
value = tuple_size<decltype(rt_2)>::value;
150+
ASSERT_EQ(value, 6);
151+
ASSERT_NE(value, 5);
152+
}
153+
154+
TEST(tuple_test, test_repeat_tuple_values) {
155+
RepeatTuple<bool, 4> rt_1 = make_tuple(true, false, false, true);
156+
ASSERT_TRUE(get<0>(rt_1));
157+
ASSERT_FALSE(get<1>(rt_1));
158+
ASSERT_FALSE(get<2>(rt_1));
159+
ASSERT_TRUE(get<3>(rt_1));
160+
}

0 commit comments

Comments
 (0)