1
2// Copyright 2017 Peter Dimov.
3//
4// Distributed under the Boost Software License, Version 1.0.
5//
6// See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt
8
9#include <boost/variant2/variant.hpp>
10#include <boost/core/lightweight_test.hpp>
11#include <boost/core/lightweight_test_trait.hpp>
12#include <type_traits>
13#include <utility>
14#include <string>
15
16using namespace boost::variant2;
17
18struct X
19{
20 X() = default;
21 template<class T> X( in_place_type_t<T> ) = delete;
22};
23
24int main()
25{
26 {
27 variant<int> v( in_place_type_t<int>{} );
28
29 BOOST_TEST_EQ( v.index(), 0 );
30 BOOST_TEST_EQ( get<0>(v), 0 );
31
32 BOOST_TEST( holds_alternative<int>(v) );
33 }
34
35 {
36 variant<X> v( in_place_type_t<X>{} );
37
38 BOOST_TEST_EQ( v.index(), 0 );
39
40 BOOST_TEST( holds_alternative<X>(v) );
41 }
42
43 {
44 variant<int> v( in_place_type_t<int>{}, 1 );
45
46 BOOST_TEST_EQ( v.index(), 0 );
47 BOOST_TEST_EQ( get<0>(v), 1 );
48
49 BOOST_TEST( holds_alternative<int>(v) );
50 }
51
52 {
53 variant<int, float> v( in_place_type_t<int>{} );
54
55 BOOST_TEST_EQ( v.index(), 0 );
56 BOOST_TEST_EQ( get<0>(v), 0 );
57
58 BOOST_TEST( holds_alternative<int>(v) );
59 }
60
61 {
62 variant<int, float> v( in_place_type_t<int>{}, 1 );
63
64 BOOST_TEST_EQ( v.index(), 0 );
65 BOOST_TEST_EQ( get<0>(v), 1 );
66
67 BOOST_TEST( holds_alternative<int>(v) );
68 }
69
70 {
71 variant<int, float> v( in_place_type_t<float>{} );
72
73 BOOST_TEST_EQ( v.index(), 1 );
74 BOOST_TEST_EQ( get<1>(v), 0 );
75
76 BOOST_TEST( holds_alternative<float>(v) );
77 }
78
79 {
80 variant<int, float> v( in_place_type_t<float>{}, 3.14f );
81
82 BOOST_TEST_EQ( v.index(), 1 );
83 BOOST_TEST_EQ( get<1>(v), 3.14f );
84
85 BOOST_TEST( holds_alternative<float>(v) );
86 }
87
88 {
89 variant<int, int, float, std::string> v( in_place_type_t<float>{}, 3.14f );
90
91 BOOST_TEST_EQ( v.index(), 2 );
92 BOOST_TEST_EQ( get<2>(v), 3.14f );
93
94 BOOST_TEST( holds_alternative<float>(v) );
95 }
96
97 {
98 variant<int, int, float, float, std::string> v( in_place_type_t<std::string>{}, "text" );
99
100 BOOST_TEST_EQ( v.index(), 4 );
101 BOOST_TEST_EQ( get<4>(v), std::string("text") );
102
103 BOOST_TEST( holds_alternative<std::string>(v) );
104 }
105
106 {
107 variant<int, int, float, float, std::string> v( in_place_type_t<std::string>{}, 4, 'a' );
108
109 BOOST_TEST_EQ( v.index(), 4 );
110 BOOST_TEST_EQ( get<4>(v), std::string( 4, 'a' ) );
111
112 BOOST_TEST( holds_alternative<std::string>(v) );
113 }
114
115 {
116 variant<int, int, float, float, std::string> v( in_place_type_t<std::string>{}, { 'a', 'b', 'c' } );
117
118 BOOST_TEST_EQ( v.index(), 4 );
119 BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
120
121 BOOST_TEST( holds_alternative<std::string>(v) );
122 }
123
124 {
125 variant<int, int, float, float, std::string> v( in_place_type_t<std::string>{}, { 'a', 'b', 'c' }, std::allocator<char>() );
126
127 BOOST_TEST_EQ( v.index(), 4 );
128 BOOST_TEST_EQ( get<4>(v), (std::string{ 'a', 'b', 'c' }) );
129
130 BOOST_TEST( holds_alternative<std::string>(v) );
131 }
132
133 return boost::report_errors();
134}
135

source code of boost/libs/variant2/test/variant_in_place_type_construct.cpp