1// Boost.TypeErasure library
2//
3// Copyright 2012 Steven Watanabe
4//
5// Distributed under the Boost Software License Version 1.0. (See
6// accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9// $Id$
10
11#include <boost/type_erasure/any.hpp>
12#include <boost/type_erasure/param.hpp>
13#include <boost/type_erasure/builtin.hpp>
14
15using namespace boost::type_erasure;
16
17template<int N>
18struct size { typedef char (&type)[N]; };
19
20// lvalues
21extern any<copy_constructible<>, _self> a1;
22extern const any<copy_constructible<>, _self> a2;
23extern any<copy_constructible<>, _self&> a3;
24extern const any<copy_constructible<>, _self&> a4;
25extern any<copy_constructible<>, const _self&> a5;
26extern const any<copy_constructible<>, const _self&> a6;
27
28// rvalues
29any<copy_constructible<>, _self> a7();
30const any<copy_constructible<>, _self> a8();
31any<copy_constructible<>, _self&> a9();
32const any<copy_constructible<>, _self&> a10();
33any<copy_constructible<>, const _self&> a11();
34const any<copy_constructible<>, const _self&> a12();
35
36extern int i;
37
38size<1>::type f1(param<copy_constructible<>, _self&>);
39size<2>::type f1(...);
40
41void test_ref() {
42 BOOST_STATIC_ASSERT(sizeof(f1(a1)) == 1);
43 BOOST_STATIC_ASSERT(sizeof(f1(a2)) == 2);
44 BOOST_STATIC_ASSERT(sizeof(f1(a3)) == 1);
45 BOOST_STATIC_ASSERT(sizeof(f1(a4)) == 1);
46 BOOST_STATIC_ASSERT(sizeof(f1(a5)) == 2);
47 BOOST_STATIC_ASSERT(sizeof(f1(a6)) == 2);
48
49 BOOST_STATIC_ASSERT(sizeof(f1(a7())) == 2);
50 BOOST_STATIC_ASSERT(sizeof(f1(a8())) == 2);
51 BOOST_STATIC_ASSERT(sizeof(f1(a9())) == 1);
52 BOOST_STATIC_ASSERT(sizeof(f1(a10())) == 1);
53 BOOST_STATIC_ASSERT(sizeof(f1(a11())) == 2);
54 BOOST_STATIC_ASSERT(sizeof(f1(a12())) == 2);
55
56 BOOST_STATIC_ASSERT(sizeof(f1(i)) == 2);
57 BOOST_STATIC_ASSERT(sizeof(f1(1)) == 2);
58
59 // Make sure that the constructors are actually instantiated
60 param<copy_constructible<>, _self&> c1 = a1;
61 // param<copy_constructible<>, _self&> c2 = a2;
62 param<copy_constructible<>, _self&> c3 = a3;
63 param<copy_constructible<>, _self&> c4 = a4;
64 // param<copy_constructible<>, _self&> c5 = a5;
65 // param<copy_constructible<>, _self&> c6 = a6;
66
67 // param<copy_constructible<>, _self&> c7 = a7();
68 // param<copy_constructible<>, _self&> c8 = a8();
69 param<copy_constructible<>, _self&> c9 = a9();
70 param<copy_constructible<>, _self&> c10 = a10();
71 // param<copy_constructible<>, _self&> c11 = a11();
72 // param<copy_constructible<>, _self&> c12 = a12();
73}
74
75size<1>::type f2(param<copy_constructible<>, const _self&>);
76size<2>::type f2(...);
77
78void test_cref() {
79 BOOST_STATIC_ASSERT(sizeof(f2(a1)) == 1);
80 BOOST_STATIC_ASSERT(sizeof(f2(a2)) == 1);
81 BOOST_STATIC_ASSERT(sizeof(f2(a3)) == 1);
82 BOOST_STATIC_ASSERT(sizeof(f2(a4)) == 1);
83 BOOST_STATIC_ASSERT(sizeof(f2(a5)) == 1);
84 BOOST_STATIC_ASSERT(sizeof(f2(a6)) == 1);
85
86 BOOST_STATIC_ASSERT(sizeof(f2(a7())) == 1);
87 BOOST_STATIC_ASSERT(sizeof(f2(a8())) == 1);
88 BOOST_STATIC_ASSERT(sizeof(f2(a9())) == 1);
89 BOOST_STATIC_ASSERT(sizeof(f2(a10())) == 1);
90 BOOST_STATIC_ASSERT(sizeof(f2(a11())) == 1);
91 BOOST_STATIC_ASSERT(sizeof(f2(a12())) == 1);
92
93 BOOST_STATIC_ASSERT(sizeof(f2(i)) == 2);
94 BOOST_STATIC_ASSERT(sizeof(f2(1)) == 2);
95
96 // Make sure that the constructors are actually instantiated
97 param<copy_constructible<>, const _self&> c1 = a1;
98 param<copy_constructible<>, const _self&> c2 = a2;
99 param<copy_constructible<>, const _self&> c3 = a3;
100 param<copy_constructible<>, const _self&> c4 = a4;
101 param<copy_constructible<>, const _self&> c5 = a5;
102 param<copy_constructible<>, const _self&> c6 = a6;
103
104 param<copy_constructible<>, const _self&> c7 = a7();
105 param<copy_constructible<>, const _self&> c8 = a8();
106 param<copy_constructible<>, const _self&> c9 = a9();
107 param<copy_constructible<>, const _self&> c10 = a10();
108 param<copy_constructible<>, const _self&> c11 = a11();
109 param<copy_constructible<>, const _self&> c12 = a12();
110}
111
112size<1>::type f3(param<copy_constructible<>, _self>);
113size<2>::type f3(...);
114
115void test_val() {
116 BOOST_STATIC_ASSERT(sizeof(f3(a1)) == 1);
117 BOOST_STATIC_ASSERT(sizeof(f3(a2)) == 1);
118 BOOST_STATIC_ASSERT(sizeof(f3(a3)) == 1);
119 BOOST_STATIC_ASSERT(sizeof(f3(a4)) == 1);
120 BOOST_STATIC_ASSERT(sizeof(f3(a5)) == 1);
121 BOOST_STATIC_ASSERT(sizeof(f3(a6)) == 1);
122
123 BOOST_STATIC_ASSERT(sizeof(f3(a7())) == 1);
124 BOOST_STATIC_ASSERT(sizeof(f3(a8())) == 1);
125 BOOST_STATIC_ASSERT(sizeof(f3(a9())) == 1);
126 BOOST_STATIC_ASSERT(sizeof(f3(a10())) == 1);
127 BOOST_STATIC_ASSERT(sizeof(f3(a11())) == 1);
128 BOOST_STATIC_ASSERT(sizeof(f3(a12())) == 1);
129
130 BOOST_STATIC_ASSERT(sizeof(f3(i)) == 2);
131 BOOST_STATIC_ASSERT(sizeof(f3(1)) == 2);
132
133 // Make sure that the constructors are actually instantiated
134 param<copy_constructible<>, _self> c1 = a1;
135 param<copy_constructible<>, _self> c2 = a2;
136 param<copy_constructible<>, _self> c3 = a3;
137 param<copy_constructible<>, _self> c4 = a4;
138 param<copy_constructible<>, _self> c5 = a5;
139 param<copy_constructible<>, _self> c6 = a6;
140
141 param<copy_constructible<>, _self> c7 = a7();
142 param<copy_constructible<>, _self> c8 = a8();
143 param<copy_constructible<>, _self> c9 = a9();
144 param<copy_constructible<>, _self> c10 = a10();
145 param<copy_constructible<>, _self> c11 = a11();
146 param<copy_constructible<>, _self> c12 = a12();
147}
148
149#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
150
151size<1>::type f4(param<copy_constructible<>, _self&&>);
152size<2>::type f4(...);
153
154void test_rref() {
155 BOOST_STATIC_ASSERT(sizeof(f4(a1)) == 2);
156 BOOST_STATIC_ASSERT(sizeof(f4(a2)) == 2);
157 BOOST_STATIC_ASSERT(sizeof(f4(a3)) == 2);
158 BOOST_STATIC_ASSERT(sizeof(f4(a4)) == 2);
159 BOOST_STATIC_ASSERT(sizeof(f4(a5)) == 2);
160 BOOST_STATIC_ASSERT(sizeof(f4(a6)) == 2);
161
162 BOOST_STATIC_ASSERT(sizeof(f4(a7())) == 1);
163 BOOST_STATIC_ASSERT(sizeof(f4(a8())) == 2);
164 BOOST_STATIC_ASSERT(sizeof(f4(a9())) == 2);
165 BOOST_STATIC_ASSERT(sizeof(f4(a10())) == 2);
166 BOOST_STATIC_ASSERT(sizeof(f4(a11())) == 2);
167 BOOST_STATIC_ASSERT(sizeof(f4(a12())) == 2);
168
169 BOOST_STATIC_ASSERT(sizeof(f4(i)) == 2);
170 BOOST_STATIC_ASSERT(sizeof(f4(1)) == 2);
171
172 // Make sure that the constructors are actually instantiated
173 // param<copy_constructible<>, _self&&> c1 = a1;
174 // param<copy_constructible<>, _self&&> c2 = a2;
175 // param<copy_constructible<>, _self&&> c3 = a3;
176 // param<copy_constructible<>, _self&&> c4 = a4;
177 // param<copy_constructible<>, _self&&> c5 = a5;
178 // param<copy_constructible<>, _self&&> c6 = a6;
179
180 param<copy_constructible<>, _self&&> c7 = a7();
181 // param<copy_constructible<>, _self&&> c8 = a8();
182 // param<copy_constructible<>, _self&&> c9 = a9();
183 // param<copy_constructible<>, _self&&> c10 = a10();
184 // param<copy_constructible<>, _self&&> c11 = a11();
185 // param<copy_constructible<>, _self&&> c12 = a12();
186}
187
188#endif
189
190#ifndef BOOST_NO_CXX11_REF_QUALIFIERS
191
192// Test conversion sequence rank
193
194size<1>::type f5(param<copy_constructible<>, _self&>);
195size<2>::type f5(param<copy_constructible<>, const _self&>);
196
197void test_ref_cref() {
198 BOOST_STATIC_ASSERT(sizeof(f5(a1)) == 1);
199 BOOST_STATIC_ASSERT(sizeof(f5(a2)) == 2);
200 BOOST_STATIC_ASSERT(sizeof(f5(a3)) == 1);
201 BOOST_STATIC_ASSERT(sizeof(f5(a4)) == 1);
202 BOOST_STATIC_ASSERT(sizeof(f5(a5)) == 2);
203 BOOST_STATIC_ASSERT(sizeof(f5(a6)) == 2);
204
205 BOOST_STATIC_ASSERT(sizeof(f5(a7())) == 2);
206 BOOST_STATIC_ASSERT(sizeof(f5(a8())) == 2);
207 BOOST_STATIC_ASSERT(sizeof(f5(a9())) == 1);
208 BOOST_STATIC_ASSERT(sizeof(f5(a10())) == 1);
209 BOOST_STATIC_ASSERT(sizeof(f5(a11())) == 2);
210 BOOST_STATIC_ASSERT(sizeof(f5(a12())) == 2);
211}
212
213size<1>::type f6(param<copy_constructible<>, _self&>);
214size<2>::type f6(param<copy_constructible<>, _self&&>);
215
216void test_ref_rref() {
217 BOOST_STATIC_ASSERT(sizeof(f6(a1)) == 1);
218 // BOOST_STATIC_ASSERT(sizeof(f6(a2)) == 2);
219 BOOST_STATIC_ASSERT(sizeof(f6(a3)) == 1);
220 BOOST_STATIC_ASSERT(sizeof(f6(a4)) == 1);
221 // BOOST_STATIC_ASSERT(sizeof(f6(a5)) == 2);
222 // BOOST_STATIC_ASSERT(sizeof(f6(a6)) == 2);
223
224 BOOST_STATIC_ASSERT(sizeof(f6(a7())) == 2);
225 // BOOST_STATIC_ASSERT(sizeof(f6(a8())) == 2);
226 BOOST_STATIC_ASSERT(sizeof(f6(a9())) == 1);
227 BOOST_STATIC_ASSERT(sizeof(f6(a10())) == 1);
228 // BOOST_STATIC_ASSERT(sizeof(f6(a11())) == 2);
229 // BOOST_STATIC_ASSERT(sizeof(f6(a12())) == 2);
230}
231
232size<1>::type f7(param<copy_constructible<>, const _self&>);
233size<2>::type f7(param<copy_constructible<>, _self&&>);
234
235void test_cref_rref() {
236 BOOST_STATIC_ASSERT(sizeof(f7(a1)) == 1);
237 BOOST_STATIC_ASSERT(sizeof(f7(a2)) == 1);
238 BOOST_STATIC_ASSERT(sizeof(f7(a3)) == 1);
239 BOOST_STATIC_ASSERT(sizeof(f7(a4)) == 1);
240 BOOST_STATIC_ASSERT(sizeof(f7(a5)) == 1);
241 BOOST_STATIC_ASSERT(sizeof(f7(a6)) == 1);
242
243 BOOST_STATIC_ASSERT(sizeof(f7(a7())) == 2);
244 BOOST_STATIC_ASSERT(sizeof(f7(a8())) == 1);
245 BOOST_STATIC_ASSERT(sizeof(f7(a9())) == 1);
246 BOOST_STATIC_ASSERT(sizeof(f7(a10())) == 1);
247 BOOST_STATIC_ASSERT(sizeof(f7(a11())) == 1);
248 BOOST_STATIC_ASSERT(sizeof(f7(a12())) == 1);
249}
250
251#endif
252

source code of boost/libs/type_erasure/test/test_param.cpp