/
cnstr.move.cpp
128 lines (102 loc) · 3.07 KB
/
cnstr.move.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Eggs.Variant
//
// Copyright Agustin K-ballo Berge, Fusion Fenix 2014-2017
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <eggs/variant.hpp>
#include <string>
#include <typeinfo>
#include <type_traits>
#include <eggs/variant/detail/config/prefix.hpp>
#include <eggs/variant/detail/utility.hpp>
using eggs::variants::detail::move;
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "constexpr.hpp"
EGGS_CXX11_STATIC_CONSTEXPR std::size_t npos = eggs::variant<>::npos;
TEST_CASE("variant<Ts...>::variant(variant<Ts...>&&)", "[variant.cnstr]")
{
eggs::variant<int, std::string> v1(42);
REQUIRE(bool(v1) == true);
REQUIRE(v1.which() == 0u);
REQUIRE(*v1.target<int>() == 42);
eggs::variant<int, std::string> v2(::move(v1));
CHECK(bool(v1) == true);
CHECK(bool(v2) == true);
CHECK(v2.which() == v1.which());
REQUIRE(v1.target<int>() != nullptr);
CHECK(*v1.target<int>() == 42);
// list-initialization
{
eggs::variant<int, std::string> v = {};
CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(v.target() == nullptr);
#if EGGS_CXX98_HAS_RTTI
CHECK(v.target_type() == typeid(void));
#endif
}
#if EGGS_CXX11_STD_HAS_IS_TRIVIALLY_COPYABLE
// trivially_copyable
{
eggs::variant<int, float> v1(42);
REQUIRE(bool(v1) == true);
REQUIRE(v1.which() == 0u);
REQUIRE(*v1.target<int>() == 42);
CHECK(std::is_trivially_copyable<decltype(v1)>::value == true);
eggs::variant<int, float> v2(::move(v1));
CHECK(bool(v1) == true);
CHECK(bool(v2) == true);
CHECK(v2.which() == v1.which());
REQUIRE(v1.target<int>() != nullptr);
CHECK(*v1.target<int>() == 42);
REQUIRE(v2.target<int>() != nullptr);
CHECK(*v2.target<int>() == 42);
}
#endif
#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
struct test { static constexpr int call()
{
eggs::variant<int, ConstexprTrivial> v1(ConstexprTrivial(42));
eggs::variant<int, ConstexprTrivial> v2(::move(v1));
return 0;
}};
constexpr int c = test::call();
}
#endif
}
TEST_CASE("variant<>::variant(variant<>&&)", "[variant.cnstr]")
{
eggs::variant<> v1;
REQUIRE(bool(v1) == false);
REQUIRE(v1.which() == npos);
eggs::variant<> v2(::move(v1));
CHECK(bool(v1) == false);
CHECK(bool(v2) == false);
CHECK(v2.which() == v1.which());
// list-initialization
{
eggs::variant<> v = {};
CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(v.target() == nullptr);
#if EGGS_CXX98_HAS_RTTI
CHECK(v.target_type() == typeid(void));
#endif
}
#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
struct test { static constexpr int call()
{
eggs::variant<> v1;
eggs::variant<> v2(::move(v1));
return 0;
}};
constexpr int c = test::call();
}
#endif
}