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 | |
15 | using namespace boost::type_erasure; |
16 | |
17 | template<int N> |
18 | struct size { typedef char (&type)[N]; }; |
19 | |
20 | // lvalues |
21 | extern any<copy_constructible<>, _self> a1; |
22 | extern const any<copy_constructible<>, _self> a2; |
23 | extern any<copy_constructible<>, _self&> a3; |
24 | extern const any<copy_constructible<>, _self&> a4; |
25 | extern any<copy_constructible<>, const _self&> a5; |
26 | extern const any<copy_constructible<>, const _self&> a6; |
27 | |
28 | // rvalues |
29 | any<copy_constructible<>, _self> a7(); |
30 | const any<copy_constructible<>, _self> a8(); |
31 | any<copy_constructible<>, _self&> a9(); |
32 | const any<copy_constructible<>, _self&> a10(); |
33 | any<copy_constructible<>, const _self&> a11(); |
34 | const any<copy_constructible<>, const _self&> a12(); |
35 | |
36 | extern int i; |
37 | |
38 | size<1>::type f1(param<copy_constructible<>, _self&>); |
39 | size<2>::type f1(...); |
40 | |
41 | void 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 | |
75 | size<1>::type f2(param<copy_constructible<>, const _self&>); |
76 | size<2>::type f2(...); |
77 | |
78 | void 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 | |
112 | size<1>::type f3(param<copy_constructible<>, _self>); |
113 | size<2>::type f3(...); |
114 | |
115 | void 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 | |
151 | size<1>::type f4(param<copy_constructible<>, _self&&>); |
152 | size<2>::type f4(...); |
153 | |
154 | void 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 | |
194 | size<1>::type f5(param<copy_constructible<>, _self&>); |
195 | size<2>::type f5(param<copy_constructible<>, const _self&>); |
196 | |
197 | void 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 | |
213 | size<1>::type f6(param<copy_constructible<>, _self&>); |
214 | size<2>::type f6(param<copy_constructible<>, _self&&>); |
215 | |
216 | void 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 | |
232 | size<1>::type f7(param<copy_constructible<>, const _self&>); |
233 | size<2>::type f7(param<copy_constructible<>, _self&&>); |
234 | |
235 | void 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 | |