Skip to content

Commit afc59a0

Browse files
authored
Merge pull request #20 from rsl-org/feature/cv_types_for_variant
[variant] Handle CV types as arguments
2 parents 69fbb25 + 774efb1 commit afc59a0

File tree

3 files changed

+154
-1
lines changed

3 files changed

+154
-1
lines changed

include/rsl/variant

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,7 @@ consteval std::meta::info make_storage() {
790790
std::size_t idx = 0;
791791
define_aggregate(^^Storage,
792792
{data_member_spec(^^char, {.name="_rsl_dummy"}),
793-
data_member_spec(^^Ts, {.name= "_rsl_alt" + util::to_string(idx++)})...
793+
data_member_spec(remove_cvref(^^Ts), {.name= "_rsl_alt" + util::to_string(idx++)})...
794794
});
795795
};
796796
return ^^Storage;

test/variant/variant.ctor/default.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,27 @@ TEST(DefaultCtor, Constructible) {
2525
TEST(DefaultCtor, Noexcept) {
2626
ASSERT_TRUE((std::is_nothrow_default_constructible_v<rsl::variant<int>>));
2727
ASSERT_FALSE((std::is_nothrow_default_constructible_v<rsl::variant<NotNoexcept>>));
28+
29+
{
30+
constexpr rsl::variant<int> v(42);
31+
ASSERT_TRUE((v.index() == 0));
32+
ASSERT_EQ(rsl::get<0>(v), 42);
33+
}
34+
{
35+
constexpr rsl::variant<int, float> v(42);
36+
ASSERT_TRUE((v.index() == 0));
37+
ASSERT_EQ(rsl::get<0>(v), 42);
38+
}
39+
{
40+
constexpr rsl::variant<const int, float> v(42);
41+
ASSERT_TRUE((v.index() == 0));
42+
ASSERT_EQ(rsl::get<0>(v), 42);
43+
}
44+
{
45+
using V = rsl::variant<volatile int, float>;
46+
int x = 42;
47+
V v(x);
48+
ASSERT_TRUE((v.index() == 0));
49+
ASSERT_EQ(rsl::get<0>(v), 42);
50+
}
2851
}

test/variant/variant.get/get.cpp

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,21 @@ TEST(Get, IndexLvalue) {
1616
ASSERT_SAME(decltype(rsl::get<1>(v)), long&);
1717
ASSERT_EQ(rsl::get<1>(v), 42l);
1818
}
19+
20+
using variant_const = rsl::variant<const int, long>;
21+
{
22+
constexpr variant_const obj(42);
23+
ASSERT_NOT_NOEXCEPT(rsl::get<0>(obj));
24+
ASSERT_SAME(decltype(rsl::get<0>(obj)), const int&);
25+
static_assert(rsl::get<0>(obj) == 42, "Value mismatch");
26+
}
27+
{
28+
variant_const v(42l);
29+
ASSERT_SAME(decltype(rsl::get<1>(v)), long&);
30+
ASSERT_EQ(rsl::get<1>(v), 42l);
31+
}
1932
}
33+
2034
TEST(Get, IndexRvalue) {
2135
using variant = rsl::variant<int, long>;
2236
{
@@ -30,6 +44,18 @@ TEST(Get, IndexRvalue) {
3044
ASSERT_SAME(decltype(rsl::get<1>(std::move(v))), long&&);
3145
ASSERT_EQ(rsl::get<1>(std::move(v)), 42l);
3246
}
47+
using variant_const = rsl::variant<const int, long>;
48+
{
49+
variant_const v(42);
50+
ASSERT_NOT_NOEXCEPT(rsl::get<0>(std::move(v)));
51+
ASSERT_SAME(decltype(rsl::get<0>(std::move(v))), int&&);
52+
ASSERT_EQ(rsl::get<0>(std::move(v)), 42);
53+
}
54+
{
55+
variant_const v(42l);
56+
ASSERT_SAME(decltype(rsl::get<1>(std::move(v))), long&&);
57+
ASSERT_EQ(rsl::get<1>(std::move(v)), 42l);
58+
}
3359
}
3460

3561
TEST(Get, IndexConstLvalue) {
@@ -58,6 +84,32 @@ TEST(Get, IndexConstLvalue) {
5884
ASSERT_SAME(decltype(rsl::get<1>(v)), const long&);
5985
ASSERT_EQ(rsl::get<1>(v), 42);
6086
}
87+
88+
using variant_const = rsl::variant<const int, long>;
89+
{
90+
constexpr variant_const v(42);
91+
ASSERT_NOT_NOEXCEPT(rsl::get<0>(v));
92+
ASSERT_SAME(decltype(rsl::get<0>(v)), const int&);
93+
static_assert(rsl::get<0>(v) == 42, "");
94+
}
95+
{
96+
const variant_const v(42);
97+
ASSERT_NOT_NOEXCEPT(rsl::get<0>(v));
98+
ASSERT_SAME(decltype(rsl::get<0>(v)), const int&);
99+
ASSERT_EQ(rsl::get<0>(v), 42);
100+
}
101+
{
102+
constexpr variant_const v(42l);
103+
ASSERT_NOT_NOEXCEPT(rsl::get<1>(v));
104+
ASSERT_SAME(decltype(rsl::get<1>(v)), const long&);
105+
static_assert(rsl::get<1>(v) == 42, "");
106+
}
107+
{
108+
const variant_const v(42l);
109+
ASSERT_NOT_NOEXCEPT(rsl::get<1>(v));
110+
ASSERT_SAME(decltype(rsl::get<1>(v)), const long&);
111+
ASSERT_EQ(rsl::get<1>(v), 42);
112+
}
61113
}
62114

63115
TEST(Get, IndexConstRvalue) {
@@ -73,6 +125,19 @@ TEST(Get, IndexConstRvalue) {
73125
ASSERT_SAME(decltype(rsl::get<1>(std::move(v))), const long&&);
74126
ASSERT_EQ(rsl::get<1>(std::move(v)), 42);
75127
}
128+
129+
using variant_const = rsl::variant<const int, long>;
130+
{
131+
const variant_const v(42);
132+
ASSERT_NOT_NOEXCEPT(rsl::get<0>(std::move(v)));
133+
ASSERT_SAME(decltype(rsl::get<0>(std::move(v))), const int&&);
134+
ASSERT_EQ(rsl::get<0>(std::move(v)), 42);
135+
}
136+
{
137+
const variant_const v(42l);
138+
ASSERT_SAME(decltype(rsl::get<1>(std::move(v))), const long&&);
139+
ASSERT_EQ(rsl::get<1>(std::move(v)), 42);
140+
}
76141
}
77142

78143
TEST(Get, IndexException) {
@@ -108,6 +173,27 @@ TEST(Get, TypeLvalue) {
108173
ASSERT_EQ(rsl::get<long>(v), 42);
109174
ASSERT_EQ(rsl::get<const long&>(v), 42);
110175
}
176+
177+
using variant_const = rsl::variant<const int, long>;
178+
{
179+
variant_const v(42);
180+
ASSERT_NOT_NOEXCEPT(rsl::get<int>(v));
181+
ASSERT_SAME(decltype(rsl::get<int>(v)), int&);
182+
ASSERT_SAME(decltype(rsl::get<int&>(v)), int&);
183+
ASSERT_SAME(decltype(rsl::get<const int&>(v)), int&);
184+
ASSERT_SAME(decltype(rsl::get<int&&>(v)), int&);
185+
ASSERT_EQ(rsl::get<int>(v), 42);
186+
ASSERT_EQ(rsl::get<int&>(v), 42);
187+
ASSERT_EQ(rsl::get<const int&>(v), 42);
188+
ASSERT_EQ(rsl::get<int&&>(v), 42);
189+
}
190+
{
191+
variant_const v(42l);
192+
ASSERT_SAME(decltype(rsl::get<long>(v)), long&);
193+
ASSERT_SAME(decltype(rsl::get<const long&>(v)), long&);
194+
ASSERT_EQ(rsl::get<long>(v), 42);
195+
ASSERT_EQ(rsl::get<const long&>(v), 42);
196+
}
111197
}
112198

113199
TEST(Get, TypeRvalue) {
@@ -146,6 +232,22 @@ TEST(Get, TypeConstRvalue) {
146232
ASSERT_SAME(decltype(rsl::get<long>(std::move(v))), const long&&);
147233
ASSERT_EQ(rsl::get<long>(std::move(v)), 42);
148234
}
235+
using variant_const = rsl::variant<const int, long>;
236+
{
237+
const variant_const v(42);
238+
ASSERT_NOT_NOEXCEPT(rsl::get<int>(std::move(v)));
239+
ASSERT_SAME(decltype(rsl::get<int>(std::move(v))), const int&&);
240+
ASSERT_SAME(decltype(rsl::get<const int&>(std::move(v))), const int&&);
241+
ASSERT_SAME(decltype(rsl::get<const int&&>(std::move(v))), const int&&);
242+
ASSERT_EQ(rsl::get<int>(std::move(v)), 42);
243+
ASSERT_EQ(rsl::get<const int&>(std::move(v)), 42);
244+
ASSERT_EQ(rsl::get<const int&&>(std::move(v)), 42);
245+
}
246+
{
247+
const variant_const v(42l);
248+
ASSERT_SAME(decltype(rsl::get<long>(std::move(v))), const long&&);
249+
ASSERT_EQ(rsl::get<long>(std::move(v)), 42);
250+
}
149251
}
150252

151253
TEST(Get, TypeConstLvalue) {
@@ -177,4 +279,32 @@ TEST(Get, TypeConstLvalue) {
177279
ASSERT_SAME(decltype(rsl::get<long>(v)), const long&);
178280
ASSERT_EQ(rsl::get<long>(v), 42);
179281
}
282+
using variant_const = rsl::variant<const int, long>;
283+
{
284+
constexpr variant_const v(42);
285+
ASSERT_NOT_NOEXCEPT(rsl::get<int>(v));
286+
ASSERT_SAME(decltype(rsl::get<int>(v)), const int&);
287+
ASSERT_SAME(decltype(rsl::get<int&>(v)), const int&);
288+
ASSERT_SAME(decltype(rsl::get<const int&>(v)), const int&);
289+
ASSERT_SAME(decltype(rsl::get<int&&>(v)), const int&);
290+
static_assert(rsl::get<int>(v) == 42, "");
291+
}
292+
{
293+
const variant_const v(42);
294+
ASSERT_NOT_NOEXCEPT(rsl::get<int>(v));
295+
ASSERT_SAME(decltype(rsl::get<int>(v)), const int&);
296+
ASSERT_EQ(rsl::get<int>(v), 42);
297+
}
298+
{
299+
constexpr variant_const v(42l);
300+
ASSERT_NOT_NOEXCEPT(rsl::get<long>(v));
301+
ASSERT_SAME(decltype(rsl::get<long>(v)), const long&);
302+
static_assert(rsl::get<long>(v) == 42, "");
303+
}
304+
{
305+
const variant_const v(42l);
306+
ASSERT_NOT_NOEXCEPT(rsl::get<long>(v));
307+
ASSERT_SAME(decltype(rsl::get<long>(v)), const long&);
308+
ASSERT_EQ(rsl::get<long>(v), 42);
309+
}
180310
}

0 commit comments

Comments
 (0)