1// Boost.TypeErasure library
2//
3// Copyright 2011 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/config.hpp>
12
13#ifdef BOOST_MSVC
14#pragma warning(disable:4244) // conversion from double to int
15#endif
16
17#include <boost/type_erasure/any.hpp>
18#include <boost/type_erasure/tuple.hpp>
19#include <boost/type_erasure/builtin.hpp>
20#include <boost/type_erasure/operators.hpp>
21#include <boost/type_erasure/any_cast.hpp>
22#include <boost/type_erasure/relaxed.hpp>
23#include <boost/mpl/vector.hpp>
24
25#define BOOST_TEST_MAIN
26#include <boost/test/unit_test.hpp>
27
28using namespace boost::type_erasure;
29using boost::core::demangle;
30
31template<class T = _self>
32struct common : ::boost::mpl::vector<
33 copy_constructible<T>,
34 typeid_<T>
35> {};
36
37#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
38
39template<class T = _self>
40struct movable_common : ::boost::mpl::vector<
41 destructible<T>,
42 constructible<T(T&&)>,
43 typeid_<T>
44> {};
45
46template<class T = _self, class U = T>
47struct move_assignable : ::boost::mpl::vector<
48 assignable<T, U&&>
49> {};
50
51#endif
52
53template<class T, bool CCtor, bool MoveCtor, bool CAssign, bool MoveAssign>
54struct test_class
55{
56 explicit test_class(T n) : value(n) {}
57 test_class(const test_class& src) : value(src.value)
58 {
59 BOOST_STATIC_ASSERT_MSG(CCtor, "Copy constructor not allowed.");
60 }
61 test_class& operator=(const test_class& src)
62 {
63 BOOST_STATIC_ASSERT_MSG(CAssign, "Copy assignment not allowed.");
64 value = src.value;
65 return *this;
66 }
67#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
68 test_class(test_class&& src) : value(src.value)
69 {
70 BOOST_STATIC_ASSERT_MSG(MoveCtor, "Move constructor not allowed.");
71 src.value = 0;
72 }
73 test_class& operator=(test_class&& src)
74 {
75 BOOST_STATIC_ASSERT_MSG(MoveAssign, "Move assignment not allowed.");
76 value = src.value;
77 src.value = 0;
78 return *this;
79 }
80#endif
81 bool operator==(T n) const { return value == n; }
82 T value;
83};
84
85template<class T, bool CCtor, bool MoveCtor, bool CAssign, bool MoveAssign>
86std::ostream& operator<<(std::ostream& os, const test_class<T, CCtor, MoveCtor, CAssign, MoveAssign>& t)
87{
88 return os << t.value;
89}
90
91enum copy_info {
92 id_lvalue = 1,
93 id_const_lvalue = 2,
94#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
95 id_rvalue = 3,
96 id_maybe_const_lvalue = id_lvalue, // used for the id of construction from a raw value
97#else
98 id_rvalue = id_const_lvalue,
99 id_maybe_const_lvalue = id_const_lvalue,
100#endif
101 id_construct = 4,
102 id_assign = 8,
103 id_copy = 16,
104 id_int = 32
105};
106
107#ifdef BOOST_MSVC
108#pragma warning(disable:4521) // multiple copy constructors specified
109#pragma warning(disable:4522) // multiple assignment operators specified
110#endif
111
112template<class T>
113struct copy_tracker
114{
115 copy_tracker(const copy_tracker& src) : value(src.value), info(id_const_lvalue | id_construct | id_copy), moved_from(false) {}
116 copy_tracker(copy_tracker& src) : value(src.value), info(id_lvalue | id_construct | id_copy), moved_from(false) {}
117 copy_tracker& operator=(const copy_tracker& src) { value = (src.value); info = (id_const_lvalue | id_assign | id_copy); moved_from = false; return *this; }
118 copy_tracker& operator=(copy_tracker& src) { value = (src.value); info = (id_lvalue | id_assign | id_copy); moved_from = false; return *this; }
119 copy_tracker(const T& src) : value(src), info(id_const_lvalue | id_construct | id_int), moved_from(false) {}
120 copy_tracker(T& src) : value(src), info(id_lvalue | id_construct | id_int), moved_from(false) {}
121 copy_tracker& operator=(const T& src) { value = (src); info = (id_const_lvalue | id_assign | id_int); moved_from = false; return *this; }
122 copy_tracker& operator=(T& src) { value = (src); info = (id_lvalue | id_assign | id_int); moved_from = false; return *this; }
123#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
124 copy_tracker(copy_tracker&& src) : value(std::move(src.value)), info(id_rvalue | id_construct | id_copy), moved_from(false) { src.moved_from = true; }
125 copy_tracker& operator=(copy_tracker&& src) { value = std::move(src.value); info = (id_rvalue | id_assign | id_copy); moved_from = false; src.moved_from = true; return *this; }
126 copy_tracker(T&& src) : value(std::move(src)), info(id_rvalue | id_construct | id_int), moved_from(false) {}
127 copy_tracker& operator=(T&& src) { value = std::move(src); info = (id_rvalue | id_assign | id_int); moved_from = false; return *this; }
128#endif
129 template<class U>
130 explicit copy_tracker(const U& src) : value(src), info(id_const_lvalue | id_construct | id_int), moved_from(false) {}
131 T value;
132 int info;
133 bool moved_from;
134};
135
136template<class T>
137struct value_holder
138{
139 typedef copy_tracker<T> type;
140 typedef copy_tracker<T> unwrapped_type;
141 template<class U>
142 value_holder(const U& u) : value(u) {}
143 type value;
144 type get() { return value; }
145 const unwrapped_type& unwrap() { return value; }
146 template<class U>
147 const U& unwrap() { return value; }
148};
149
150template<class C, class P>
151struct value_holder<any<C, P> >
152{
153 typedef any<C, P> type;
154 typedef any<C, P> unwrapped_type;
155#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
156 template<class U>
157 value_holder(U&& u) : value(std::forward<U>(u)) {}
158#else
159 template<class U>
160 value_holder(U& u) : value(u) {}
161 template<class U>
162 value_holder(const U& u) : value(u) {}
163#endif
164 type value;
165 type get() { return value; }
166 const unwrapped_type& unwrap() { return value; }
167 template<class U>
168 const U& unwrap() { return any_cast<const U&>(value); }
169};
170
171template<class T>
172struct value_holder<T&>
173{
174 typedef typename value_holder<T>::type& type;
175 typedef typename value_holder<T>::unwrapped_type unwrapped_type;
176#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
177 template<class U>
178 value_holder(U&& u) : impl(std::forward<U>(u)) {}
179#else
180 template<class U>
181 value_holder(U& u) : impl(u) {}
182 template<class U>
183 value_holder(const U& u) : impl(u) {}
184#endif
185 value_holder<T> impl;
186 type get() { return impl.value; }
187 const unwrapped_type& unwrap() { return unwrap<unwrapped_type>(); }
188 template<class U>
189 const U& unwrap() { return impl.template unwrap<unwrapped_type>(); }
190};
191
192template<class T>
193struct value_holder<const T&>
194{
195 typedef const typename value_holder<T>::type& type;
196 typedef typename value_holder<T>::unwrapped_type unwrapped_type;
197#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
198 template<class U>
199 value_holder(U&& u) : impl(std::forward<U>(u)) {}
200#else
201 template<class U>
202 value_holder(U& u) : impl(u) {}
203 template<class U>
204 value_holder(const U& u) : impl(u) {}
205#endif
206 value_holder<T> impl;
207 type get() { return impl.value; }
208 const unwrapped_type& unwrap() { return unwrap<unwrapped_type>(); }
209 template<class U>
210 const U& unwrap() { return impl.template unwrap<unwrapped_type>(); }
211};
212
213#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
214
215template<class T>
216struct value_holder<T&&>
217{
218 typedef typename value_holder<T>::type&& type;
219 typedef typename value_holder<T>::unwrapped_type unwrapped_type;
220 template<class U>
221 value_holder(U&& u) : impl(std::forward<U>(u)) {}
222 value_holder<T> impl;
223 type get() { return std::move(impl.value); }
224 const unwrapped_type& unwrap() { return unwrap<unwrapped_type>(); }
225 template<class U>
226 const U& unwrap() { return impl.template unwrap<unwrapped_type>(); }
227};
228
229#endif
230
231template<class T, class A>
232struct value_holder<T(A)>
233{
234#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
235 template<class U>
236 value_holder(U&& u) : init(std::forward<U>(u)), impl(init.get()) {}
237#else
238 template<class U>
239 value_holder(U& u) : init(u), impl(init.get()) {}
240 template<class U>
241 value_holder(const U& u) : init(u), impl(init.get()) {}
242#endif
243 value_holder<A> init;
244 value_holder<T> impl;
245 typedef typename value_holder<T>::type type;
246 typedef typename value_holder<A>::unwrapped_type unwrapped_type;
247 type get() { return impl.get(); }
248 const unwrapped_type& unwrap() { return unwrap<unwrapped_type>(); }
249 template<class U>
250 const U& unwrap() { return impl.template unwrap<unwrapped_type>(); }
251};
252
253#define TEST_ASSIGNMENT_I(LHS, RHS, result, ptr_op, R) \
254 try \
255 { \
256 value_holder<LHS> lhs(17); \
257 value_holder<RHS> rhs(23); \
258 const void * original = any_cast<const void*>(&lhs.get()); \
259 lhs.get() = rhs.get(); \
260 typedef value_holder<R>::unwrapped_type expected_type; \
261 if(const expected_type* ptr = \
262 any_cast<const expected_type*>(&lhs.get())) \
263 { \
264 BOOST_TEST(ptr->value == 23); \
265 BOOST_TEST(ptr->info == (result)); \
266 BOOST_TEST(ptr ptr_op original); \
267 } \
268 else \
269 { \
270 BOOST_ERROR("Wrong type: Expected " \
271 << boost::core::demangle(typeid(expected_type).name()) \
272 << " but got " \
273 << boost::core::demangle(typeid_of(lhs.get()).name())); \
274 } \
275 } \
276 catch(bad_function_call&) \
277 { \
278 BOOST_ERROR("bad_function_call in " \
279 << demangle(typeid(value_holder<LHS>::type).name()) \
280 << " = " \
281 << demangle(typeid(value_holder<RHS>::type).name())); \
282 }
283
284#define TEST_ASSIGNMENT_id_dispatch(LHS, RHS, result) \
285 TEST_ASSIGNMENT_I(LHS, RHS, result, ==, LHS)
286
287#define TEST_ASSIGNMENT_id_fallback(LHS, RHS, result) \
288 TEST_ASSIGNMENT_I(LHS, RHS, result, !=, RHS)
289
290#define TEST_ASSIGNMENT_id_throw(LHS, RHS, result) \
291 { \
292 value_holder<LHS> lhs(17); \
293 value_holder<RHS> rhs(23); \
294 BOOST_CHECK_THROW(lhs.get() = rhs.get(), bad_function_call); \
295 }
296
297#define TEST_ASSIGNMENT(LHS, RHS, tag, result) \
298 BOOST_PP_CAT(TEST_ASSIGNMENT_, tag)(LHS, RHS, result)
299
300BOOST_AUTO_TEST_CASE(test_nothing)
301{
302 // Nothing to test. Assignment is entirely illegal
303}
304
305BOOST_AUTO_TEST_CASE(test_nothing_relaxed)
306{
307 typedef ::boost::mpl::vector<
308 destructible<>,
309 typeid_<>,
310 constructible<_self(int)>,
311 relaxed
312 > test_concept;
313 typedef test_class<int, false, false, false, false> test_type;
314
315 typedef any<test_concept> any_val;
316 typedef any<test_concept, _self&> any_ref;
317
318 // Compile-time check.
319 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
320 any_val v1(test_binding, 1);
321
322 // assignment of same type
323
324 // different stored type
325
326 // raw value
327
328 // assignment to a reference
329 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_fallback, id_rvalue | id_construct | id_copy);
330 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_int);
331 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
332 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
333
334 // reference with a different type
335 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
336 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
337 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
338 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
339
340 // reference with raw value
341 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
342 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
343
344#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
345
346 typedef any<test_concept, _self&&> any_rref;
347
348 // rvalue reference as the rhs
349
350 // assignment to an rvalue reference
351 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_fallback, id_rvalue | id_construct | id_copy);
352 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
353 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
354 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
355
356 // rvalue reference with a different type
357 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
358 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
359 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
360 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
361
362 // rvalue reference with raw value
363 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
364 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
365#endif
366}
367
368BOOST_AUTO_TEST_CASE(test_copy_assignable)
369{
370 typedef ::boost::mpl::vector<
371 destructible<>,
372 typeid_<>,
373 assignable<>,
374 constructible<_self(int)>
375 > test_concept;
376 typedef test_class<int, false, false, true, false> test_type;
377
378 typedef any<test_concept> any_val;
379 typedef any<test_concept, _self&> any_ref;
380 typedef any<test_concept, const _self&> any_cref;
381
382 // Compile-time check.
383 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
384 any_val v1(test_binding, 1);
385
386 // assignment of same type
387#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
388 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
389#endif
390 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
391 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
392 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
393 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
394 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
395 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
396 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
397 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
398
399 // different stored type (undefined behavior)
400
401 // raw value (compile error)
402
403 // assignment to a reference
404#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
405 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
406#endif
407 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
408 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
409 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
410 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
411 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
412 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
413 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
414 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
415
416 // reference with a different type (undefined behavior)
417
418 // reference with raw value (compile error)
419
420#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
421
422 typedef any<test_concept, _self&&> any_rref;
423
424 // rvalue reference as the rhs
425 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
426 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
427 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
428 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
429 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
430 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
431
432 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
433 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
434 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
435 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
436 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
437 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
438 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
439 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
440 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
441 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
442 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
443 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
444 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
445
446 // rvalue reference with a different type (undefined behavior)
447
448 // rvalue reference with raw value (compile error)
449#endif
450}
451
452BOOST_AUTO_TEST_CASE(test_copy_assignable_relaxed)
453{
454 typedef ::boost::mpl::vector<
455 destructible<>,
456 typeid_<>,
457 assignable<>,
458 constructible<_self(int)>,
459 relaxed
460 > test_concept;
461 typedef test_class<int, false, false, true, false> test_type;
462
463 typedef any<test_concept> any_val;
464 typedef any<test_concept, _self&> any_ref;
465 typedef any<test_concept, const _self&> any_cref;
466
467 // Compile-time check.
468 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
469 any_val v1(test_binding, 1);
470
471 // assignment of same type
472#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
473 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
474#endif
475 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
476 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
477 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
478 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
479 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
480 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
481 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
482 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
483
484 // different stored type
485#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
486 TEST_ASSIGNMENT(any_val&(int), any_val&&(long), id_throw, 0);
487#endif
488 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_throw, 0);
489 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_throw, 0);
490 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_throw, 0);
491 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_throw, 0);
492 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_throw, 0);
493 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_throw, 0);
494 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_throw, 0);
495 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_throw, 0);
496
497 // raw value
498 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
499 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
500 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
501 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
502 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
503 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
504
505 // assignment to a reference
506#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
507 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
508#endif
509 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
510 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
511 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
512 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
513 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
514 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
515 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
516 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
517
518 // reference with a different type
519#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
520 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(long), id_throw, 0);
521#endif
522 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
523 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(long), id_throw, 0);
524 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
525 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
526 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
527 TEST_ASSIGNMENT(any_ref&(int&), any_cref(long&), id_throw, 0);
528 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(long&), id_throw, 0);
529 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(long&), id_throw, 0);
530
531 // reference with raw value
532 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
533 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
534
535#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
536
537 typedef any<test_concept, _self&&> any_rref;
538
539 // rvalue reference as the rhs
540 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
541 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
542 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
543 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_throw, 0);
544 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_throw, 0);
545 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_throw, );
546 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
547 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
548 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
549 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
550 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
551 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
552
553 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
554 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
555 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
556 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
557 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
558 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
559 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
560 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
561 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
562 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
563 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
564 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
565 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
566
567 // rvalue reference with a different type
568 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
569 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(long), id_throw, 0);
570 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(long), id_throw, 0);
571 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(long&), id_throw, 0);
572 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(long&), id_throw, 0);
573 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(long&), id_throw, 0);
574 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(long&), id_throw, 0);
575 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(long&), id_throw, 0);
576 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(long&), id_throw, 0);
577 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
578 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
579 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
580
581 // rvalue reference with raw value
582 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
583 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
584#endif
585}
586
587#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
588
589BOOST_AUTO_TEST_CASE(test_move_assignable)
590{
591 typedef ::boost::mpl::vector<
592 destructible<>,
593 typeid_<>,
594 move_assignable<>,
595 constructible<_self(int)>
596 > test_concept;
597 typedef test_class<int, false, false, false, true> test_type;
598
599 typedef any<test_concept> any_val;
600 typedef any<test_concept, _self&> any_ref;
601
602 // Compile-time check.
603 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
604 any_val v1(test_binding, 1);
605
606 // assignment of same type
607 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
608
609 // different stored type
610
611 // raw value
612
613 // assignment to a reference
614 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
615
616 // reference with a different type
617
618 // reference with raw value
619
620 typedef any<test_concept, _self&&> any_rref;
621
622 // rvalue reference as the rhs
623 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
624 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
625 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
626 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
627 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
628 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);;
629
630 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
631 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
632 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
633 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
634 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
635
636 // rvalue reference with a different type
637
638 // rvalue reference with raw value
639}
640
641BOOST_AUTO_TEST_CASE(test_move_assignable_relaxed)
642{
643 typedef ::boost::mpl::vector<
644 destructible<>,
645 typeid_<>,
646 move_assignable<>,
647 constructible<_self(int)>,
648 relaxed
649 > test_concept;
650 typedef test_class<int, false, false, false, true> test_type;
651
652 typedef any<test_concept> any_val;
653 typedef any<test_concept, _self&> any_ref;
654
655 // Compile-time check.
656 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
657 any_val v1(test_binding, 1);
658
659 // assignment of same type
660 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
661
662 // different stored type
663 TEST_ASSIGNMENT(any_val&(int), any_val&&(long), id_throw, 0);
664
665 // raw value
666
667 // assignment to a reference
668 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
669 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_fallback, id_rvalue | id_construct | id_copy);
670 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_int);
671 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
672 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
673
674 // reference with a different type
675 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(long), id_throw, 0);
676 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
677 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
678 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
679 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
680
681 // reference with raw value
682 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
683 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
684
685 typedef any<test_concept, _self&&> any_rref;
686
687 // rvalue reference as the rhs
688 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
689 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
690 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
691 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_throw, 0);
692 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_throw, 0);
693 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_throw, 0);
694 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
695 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
696 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
697 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
698 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
699 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
700
701 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
702 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
703 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
704 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
705 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
706
707 // rvalue reference with a different type
708 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
709 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
710 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
711 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
712
713 // rvalue reference with raw value
714 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
715 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
716}
717
718#ifndef BOOST_NO_CXX11_REF_QUALIFIERS
719
720BOOST_AUTO_TEST_CASE(test_move_and_copy_assignable)
721{
722 typedef ::boost::mpl::vector<
723 destructible<>,
724 typeid_<>,
725 assignable<>,
726 move_assignable<>,
727 constructible<_self(int)>
728 > test_concept;
729 typedef test_class<int, false, false, true, true> test_type;
730
731 typedef any<test_concept> any_val;
732 typedef any<test_concept, _self&> any_ref;
733 typedef any<test_concept, const _self&> any_cref;
734
735 // Compile-time check.
736 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
737 any_val v1(test_binding, 1);
738
739 // assignment of same type
740 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
741 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
742 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
743 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
744 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
745 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
746 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
747 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
748 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
749
750 // different stored type (undefined behavior)
751
752 // raw value (compile error)
753
754 // assignment to a reference
755 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
756 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
757 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
758 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
759 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
760 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
761 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
762 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
763 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
764
765 // reference with a different type (undefined behavior)
766
767 // reference with raw value (compile error)
768
769 typedef any<test_concept, _self&&> any_rref;
770
771 // rvalue reference as the rhs
772 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
773 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
774 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
775 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
776 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
777 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
778
779 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
780 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
781 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
782 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
783 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
784 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
785 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
786 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
787 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
788 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
789 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
790 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
791 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
792
793 // rvalue reference with a different type (undefined behavior)
794
795 // rvalue reference with raw value (compile error)
796}
797
798BOOST_AUTO_TEST_CASE(test_move_and_copy_assignable_relaxed)
799{
800 typedef ::boost::mpl::vector<
801 destructible<>,
802 typeid_<>,
803 assignable<>,
804 move_assignable<>,
805 constructible<_self(int)>,
806 relaxed
807 > test_concept;
808 typedef test_class<int, false, false, true, true> test_type;
809
810 typedef any<test_concept> any_val;
811 typedef any<test_concept, _self&> any_ref;
812 typedef any<test_concept, const _self&> any_cref;
813
814 // Compile-time check.
815 binding<test_concept> test_binding = make_binding< ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > >();
816 any_val v1(test_binding, 1);
817
818 // assignment of same type
819 TEST_ASSIGNMENT(any_val&(int), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
820 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
821 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
822 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
823 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
824 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
825 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
826 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
827 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
828
829 // different stored type
830 TEST_ASSIGNMENT(any_val&(int), any_val&&(long), id_throw, 0);
831 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_throw, 0);
832 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_throw, 0);
833 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_throw, 0);
834 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_throw, 0);
835 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_throw, 0);
836 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_throw, 0);
837 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_throw, 0);
838 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_throw, 0);
839
840 // raw value
841 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
842 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
843 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
844 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
845 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
846 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
847
848 // assignment to a reference
849 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
850 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
851 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
852 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
853 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
854 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
855 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
856 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
857 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
858
859 // reference with a different type
860 TEST_ASSIGNMENT(any_ref&(int&), any_val&&(long), id_throw, 0);
861 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
862 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(long), id_throw, 0);
863 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
864 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
865 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
866 TEST_ASSIGNMENT(any_ref&(int&), any_cref(long&), id_throw, 0);
867 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(long&), id_throw, 0);
868 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(long&), id_throw, 0);
869
870 // reference with raw value
871 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
872 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
873
874 typedef any<test_concept, _self&&> any_rref;
875
876 // rvalue reference as the rhs
877 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
878 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
879 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
880 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_throw, 0);
881 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_throw, 0);
882 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_throw, 0);
883 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
884 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
885 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
886 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
887 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
888 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
889
890 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
891 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_dispatch, id_rvalue | id_assign | id_copy);
892 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
893 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
894 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
895 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
896 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
897 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
898 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
899 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
900 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
901 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
902 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
903
904 // rvalue reference with a different type
905 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
906 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(long), id_throw, 0);
907 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(long), id_throw, 0);
908 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(long&), id_throw, 0);
909 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(long&), id_throw, 0);
910 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(long&), id_throw, 0);
911 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(long&), id_throw, 0);
912 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(long&), id_throw, 0);
913 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(long&), id_throw, 0);
914 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
915 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
916 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
917
918 // rvalue reference with raw value
919 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
920 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
921}
922
923#endif // BOOST_NO_CXX11_REF_QUALIFIERS
924
925#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
926
927BOOST_AUTO_TEST_CASE(test_copy_constructible_only)
928{
929 // Nothing to test. Assignment is entirely illegal
930}
931
932BOOST_AUTO_TEST_CASE(test_copy_constructible_only_relaxed)
933{
934 typedef ::boost::mpl::vector<
935 common<>,
936 relaxed
937 > test_concept;
938 typedef test_class<int, true, false, false, false> test_type;
939
940 typedef any<test_concept> any_val;
941 typedef any<test_concept, _self&> any_ref;
942 typedef any<test_concept, const _self&> any_cref;
943
944 // Compile-time check.
945 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
946 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
947
948 // assignment of same type
949 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_fallback, id_const_lvalue | id_construct | id_copy);
950 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
951 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
952 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
953 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
954 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
955 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
956 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
957 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
958
959 // different stored type
960 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_const_lvalue | id_construct | id_copy);
961 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
962 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
963 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
964 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
965 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
966 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
967 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
968 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
969
970 // raw value
971 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
972 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
973 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
974 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
975 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
976 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
977
978 // assignment to a reference
979 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_fallback, id_rvalue | id_construct | id_copy);
980 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_int);
981 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
982 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
983
984 // reference with a different type
985 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
986 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
987 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
988 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
989
990 // reference with raw value
991 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
992 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
993
994#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
995
996 typedef any<test_concept, _self&&> any_rref;
997
998 // rvalue reference as the rhs
999 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1000 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1001 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1002 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1003 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1004 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1005
1006 // assignment to an rvalue reference
1007 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(int), id_fallback, id_rvalue | id_construct | id_copy);
1008 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
1009 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
1010 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_fallback, id_const_lvalue | id_construct | id_int);
1011
1012 // rvalue reference with a different type
1013 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
1014 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1015 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1016 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1017
1018 // rvalue reference with raw value
1019 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
1020 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
1021#endif
1022}
1023
1024BOOST_AUTO_TEST_CASE(test_copy)
1025{
1026 typedef ::boost::mpl::vector<
1027 common<>,
1028 assignable<>
1029 > test_concept;
1030 typedef test_class<int, true, false, true, false> test_type;
1031
1032 typedef any<test_concept> any_val;
1033 typedef any<test_concept, _self&> any_ref;
1034 typedef any<test_concept, const _self&> any_cref;
1035
1036 // Compile-time check.
1037 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1038 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(const test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1039
1040 // assignment of same type
1041 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1042 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1043 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1044 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1045 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1046 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1047 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1048 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1049 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1050
1051 // different stored type (undefined behavior)
1052
1053 // raw value (compile error)
1054
1055 // assignment to a reference
1056 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1057 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1058 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1059 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1060 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1061 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1062 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1063 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1064 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1065
1066 // reference with a different type (undefined behavior)
1067
1068 // reference with raw value (compile error)
1069
1070#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1071
1072 typedef any<test_concept, _self&&> any_rref;
1073
1074 // rvalue reference as the rhs
1075 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1076 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1077 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1078 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1079 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1080 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1081
1082 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1083 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1084 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1085 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1086 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1087 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1088 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1089 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1090 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1091 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1092 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1093 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1094 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1095
1096 // rvalue reference with a different type (undefined behavior)
1097
1098 // rvalue reference with raw value (compile error)
1099#endif
1100}
1101
1102BOOST_AUTO_TEST_CASE(test_copy_relaxed)
1103{
1104 typedef ::boost::mpl::vector<
1105 common<>,
1106 assignable<>,
1107 relaxed
1108 > test_concept;
1109 typedef test_class<int, true, false, true, false> test_type;
1110
1111 typedef any<test_concept> any_val;
1112 typedef any<test_concept, _self&> any_ref;
1113 typedef any<test_concept, const _self&> any_cref;
1114
1115 // Compile-time check.
1116 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
1117 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1118
1119 // assignment of same type
1120 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1121 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1122 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1123 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1124 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1125 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1126 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1127 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1128 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1129
1130 // different stored type
1131 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1132 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1133 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1134 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1135 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1136 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1137 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1138 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1139 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1140
1141 // raw value
1142 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1143 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
1144 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1145 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1146 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_maybe_const_lvalue | id_construct | id_copy);
1147 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1148
1149 // assignment to a reference
1150 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1151 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1152 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1153 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1154 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1155 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1156 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1157 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1158 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1159
1160 // reference with a different type
1161 TEST_ASSIGNMENT(any_ref&(int&), any_val(long), id_throw, 0);
1162 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
1163 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(long), id_throw, 0);
1164 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1165 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1166 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1167 TEST_ASSIGNMENT(any_ref&(int&), any_cref(long&), id_throw, 0);
1168 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(long&), id_throw, 0);
1169 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(long&), id_throw, 0);
1170
1171 // reference with raw value
1172 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
1173 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
1174
1175#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1176
1177 typedef any<test_concept, _self&&> any_rref;
1178
1179 // rvalue reference as the rhs
1180 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1181 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1182 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1183 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1184 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1185 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1186 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1187 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1188 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1189 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
1190 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
1191 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
1192
1193 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1194 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1195 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1196 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1197 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1198 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1199 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1200 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1201 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1202 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1203 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1204 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1205 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1206
1207 // rvalue reference with a different type
1208 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
1209 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(long), id_throw, 0);
1210 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(long), id_throw, 0);
1211 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(long&), id_throw, 0);
1212 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(long&), id_throw, 0);
1213 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(long&), id_throw, 0);
1214 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(long&), id_throw, 0);
1215 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(long&), id_throw, 0);
1216 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(long&), id_throw, 0);
1217 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1218 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1219 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1220
1221 // rvalue reference with raw value
1222 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
1223 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
1224#endif
1225}
1226
1227
1228#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1229
1230BOOST_AUTO_TEST_CASE(test_copy_constructable_move_assignable)
1231{
1232 typedef ::boost::mpl::vector<
1233 common<>,
1234 move_assignable<>
1235 > test_concept;
1236 typedef test_class<int, true, false, false, true> test_type;
1237
1238 typedef any<test_concept> any_val;
1239 typedef any<test_concept, _self&> any_ref;
1240
1241 // Compile-time check.
1242 TEST_ASSIGNMENT(any_val&(test_type&), any_val(test_type&), id_dispatch, id_rvalue | id_assign | id_copy);
1243 TEST_ASSIGNMENT(any_val&(test_type&), any_val(test_type const&), id_dispatch, id_rvalue | id_assign | id_copy);
1244
1245 // assignment of same type
1246 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1247
1248 // different stored type
1249
1250 // raw value
1251
1252 // assignment to a reference
1253 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1254
1255 // reference with a different type
1256
1257 // reference with raw value
1258
1259 typedef any<test_concept, _self&&> any_rref;
1260
1261 // rvalue reference as the rhs
1262 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1263 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1264 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1265 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1266 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1267 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);;
1268
1269 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1270 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1271 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1272 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1273 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1274
1275 // rvalue reference with a different type
1276
1277 // rvalue reference with raw value
1278}
1279
1280BOOST_AUTO_TEST_CASE(test_copy_constructable_move_assignable_relaxed)
1281{
1282 typedef ::boost::mpl::vector<
1283 common<>,
1284 move_assignable<>,
1285 relaxed
1286 > test_concept;
1287 typedef test_class<int, true, false, false, true> test_type;
1288
1289 typedef any<test_concept> any_val;
1290 typedef any<test_concept, _self&> any_ref;
1291 typedef any<test_concept, const _self&> any_cref;
1292
1293 // Compile-time check.
1294 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1295 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1296
1297 // assignment of same type
1298 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1299 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1300 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1301 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1302 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1303 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1304 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1305 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1306 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1307
1308 // different stored type
1309 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1310 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1311 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1312 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1313 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1314 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1315 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1316 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1317 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1318
1319 // raw value
1320 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1321 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1322 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1323 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1324 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1325 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1326
1327 // assignment to a reference
1328 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1329 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_fallback, id_rvalue | id_construct | id_copy);
1330 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_int);
1331 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
1332 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_int);
1333
1334 // reference with a different type
1335 TEST_ASSIGNMENT(any_ref&(int&), any_val(long), id_throw, 0);
1336 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
1337 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1338 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1339 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1340
1341 // reference with raw value
1342 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
1343 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
1344
1345 typedef any<test_concept, _self&&> any_rref;
1346
1347 // rvalue reference as the rhs
1348 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1349 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1350 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1351 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1352 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1353 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1354 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1355 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1356 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1357 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
1358 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
1359 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
1360
1361 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1362 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1363 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1364 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1365 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1366
1367 // rvalue reference with a different type
1368 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
1369 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1370 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1371 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1372
1373 // rvalue reference with raw value
1374 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
1375 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
1376}
1377
1378#ifndef BOOST_NO_CXX11_REF_QUALIFIERS
1379
1380BOOST_AUTO_TEST_CASE(test_copy_constructible_move_and_copy_assignable)
1381{
1382 typedef ::boost::mpl::vector<
1383 common<>,
1384 assignable<>,
1385 move_assignable<>
1386 > test_concept;
1387 typedef test_class<int, true, false, true, true> test_type;
1388
1389 typedef any<test_concept> any_val;
1390 typedef any<test_concept, _self&> any_ref;
1391 typedef any<test_concept, const _self&> any_cref;
1392
1393 // Compile-time check.
1394 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1395 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(const test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1396
1397 // assignment of same type
1398 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1399 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1400 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1401 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1402 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1403 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1404 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1405 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1406 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1407
1408 // different stored type (undefined behavior)
1409
1410 // raw value (compile error)
1411
1412 // assignment to a reference
1413 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1414 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1415 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1416 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1417 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1418 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1419 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1420 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1421 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1422
1423 // reference with a different type (undefined behavior)
1424
1425 // reference with raw value (compile error)
1426
1427 typedef any<test_concept, _self&&> any_rref;
1428
1429 // rvalue reference as the rhs
1430 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1431 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1432 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1433 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1434 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1435 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1436
1437 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1438 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1439 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1440 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1441 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1442 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1443 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1444 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1445 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1446 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1447 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1448 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1449 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1450
1451 // rvalue reference with a different type (undefined behavior)
1452
1453 // rvalue reference with raw value (compile error)
1454}
1455
1456BOOST_AUTO_TEST_CASE(test_copy_constructible_move_and_copy_assignable_relaxed)
1457{
1458 typedef ::boost::mpl::vector<
1459 common<>,
1460 assignable<>,
1461 move_assignable<>,
1462 relaxed
1463 > test_concept;
1464 typedef test_class<int, true, false, true, true> test_type;
1465
1466 typedef any<test_concept> any_val;
1467 typedef any<test_concept, _self&> any_ref;
1468 typedef any<test_concept, const _self&> any_cref;
1469
1470 // Compile-time check.
1471 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1472 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1473
1474 // assignment of same type
1475 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1476 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1477 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1478 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1479 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1480 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1481 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1482 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1483 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1484
1485 // different stored type
1486 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1487 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1488 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1489 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1490 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1491 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1492 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1493 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1494 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1495
1496 // raw value
1497 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1498 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1499 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1500 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1501 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1502 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1503
1504 // assignment to a reference
1505 TEST_ASSIGNMENT(any_ref&(int&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1506 TEST_ASSIGNMENT(any_ref&(int&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1507 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1508 TEST_ASSIGNMENT(any_ref&(int&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1509 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1510 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1511 TEST_ASSIGNMENT(any_ref&(int&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1512 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1513 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1514
1515 // reference with a different type
1516 TEST_ASSIGNMENT(any_ref&(int&), any_val(long), id_throw, 0);
1517 TEST_ASSIGNMENT(any_ref&(int&), any_val&(long), id_fallback, id_rvalue | id_construct | id_copy);
1518 TEST_ASSIGNMENT(any_ref&(int&), any_val const&(long), id_throw, 0);
1519 TEST_ASSIGNMENT(any_ref&(int&), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1520 TEST_ASSIGNMENT(any_ref&(int&), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1521 TEST_ASSIGNMENT(any_ref&(int&), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_int);
1522 TEST_ASSIGNMENT(any_ref&(int&), any_cref(long&), id_throw, 0);
1523 TEST_ASSIGNMENT(any_ref&(int&), any_cref&(long&), id_throw, 0);
1524 TEST_ASSIGNMENT(any_ref&(int&), any_cref const&(long&), id_throw, 0);
1525
1526 // reference with raw value
1527 TEST_ASSIGNMENT(any_ref&(int&), int&, id_fallback, id_const_lvalue | id_construct | id_int);
1528 TEST_ASSIGNMENT(any_ref&(int&), long&, id_fallback, id_const_lvalue | id_construct | id_int);
1529
1530 typedef any<test_concept, _self&&> any_rref;
1531
1532 // rvalue reference as the rhs
1533 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1534 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1535 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1536 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1537 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1538 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_copy);
1539 TEST_ASSIGNMENT(any_ref&(int&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1540 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1541 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1542 TEST_ASSIGNMENT(any_ref&(int&), any_rref(long&&), id_throw, 0);
1543 TEST_ASSIGNMENT(any_ref&(int&), any_rref&(long&&), id_throw, 0);
1544 TEST_ASSIGNMENT(any_ref&(int&), any_rref const&(long&&), id_throw, 0);
1545
1546 // assignment to an rvalue reference (same dispatching behavior as lvalue reference)
1547 TEST_ASSIGNMENT(any_rref&(int&&), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1548 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1549 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1550 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1551 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1552 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1553 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1554 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1555 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1556 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1557 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1558 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1559
1560 // rvalue reference with a different type
1561 TEST_ASSIGNMENT(any_rref&(int&&), any_val&&(long), id_fallback, id_rvalue | id_construct | id_copy);
1562 TEST_ASSIGNMENT(any_rref&(int&&), any_val&(long), id_throw, 0);
1563 TEST_ASSIGNMENT(any_rref&(int&&), any_val const&(long), id_throw, 0);
1564 TEST_ASSIGNMENT(any_rref&(int&&), any_ref(long&), id_throw, 0);
1565 TEST_ASSIGNMENT(any_rref&(int&&), any_ref&(long&), id_throw, 0);
1566 TEST_ASSIGNMENT(any_rref&(int&&), any_ref const&(long&), id_throw, 0);
1567 TEST_ASSIGNMENT(any_rref&(int&&), any_cref(long&), id_throw, 0);
1568 TEST_ASSIGNMENT(any_rref&(int&&), any_cref&(long&), id_throw, 0);
1569 TEST_ASSIGNMENT(any_rref&(int&&), any_cref const&(long&), id_throw, 0);
1570 TEST_ASSIGNMENT(any_rref&(int&&), any_rref(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1571 TEST_ASSIGNMENT(any_rref&(int&&), any_rref&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1572 TEST_ASSIGNMENT(any_rref&(int&&), any_rref const&(long&&), id_fallback, id_const_lvalue | id_construct | id_int);
1573
1574 // rvalue reference with raw value
1575 TEST_ASSIGNMENT(any_rref&(int&&), int&&, id_fallback, id_const_lvalue | id_construct | id_int);
1576 TEST_ASSIGNMENT(any_rref&(int&&), long&&, id_fallback, id_const_lvalue | id_construct | id_int);
1577}
1578
1579#endif // BOOST_NO_CXX11_REF_QUALIFIERS
1580
1581#endif // BOOST_NO_CXX11_RVALUE_REFERENCES
1582
1583#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
1584
1585BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_only)
1586{
1587 // Nothing to test. Assignment is entirely illegal
1588}
1589
1590BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_only_relaxed)
1591{
1592 typedef ::boost::mpl::vector<
1593 common<>,
1594 movable_common<>,
1595 relaxed
1596 > test_concept;
1597 typedef test_class<int, true, true, false, false> test_type;
1598
1599 typedef any<test_concept> any_val;
1600 typedef any<test_concept, _self&> any_ref;
1601 typedef any<test_concept, const _self&> any_cref;
1602 typedef any<test_concept, _self&&> any_rref;
1603
1604 // Compile-time check.
1605 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1606 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1607
1608 // assignment of same type
1609 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_fallback, id_rvalue | id_construct | id_copy);
1610 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1611 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1612 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1613 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1614 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1615 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1616 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1617 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1618 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_fallback, id_rvalue | id_construct | id_copy);
1619 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_fallback, id_rvalue | id_construct | id_copy);
1620 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_fallback, id_rvalue | id_construct | id_copy);
1621
1622 // different stored type
1623 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_rvalue | id_construct | id_copy);
1624 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1625 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1626 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1627 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1628 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1629 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1630 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1631 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1632 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1633 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1634 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1635
1636 // raw value
1637 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1638 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1639 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1640 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1641 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1642 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1643}
1644
1645BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_copy_assignable)
1646{
1647 typedef ::boost::mpl::vector<
1648 common<>,
1649 movable_common<>,
1650 assignable<>
1651 > test_concept;
1652 typedef test_class<int, true, true, true, false> test_type;
1653
1654 typedef any<test_concept> any_val;
1655 typedef any<test_concept, _self&> any_ref;
1656 typedef any<test_concept, const _self&> any_cref;
1657 typedef any<test_concept, _self&&> any_rref;
1658
1659 // Compile-time check.
1660 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1661 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(const test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1662
1663 // assignment of same type
1664 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1665 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1666 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1667 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1668 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1669 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1670 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1671 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1672 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1673 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1674 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1675 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1676
1677 // different stored type (undefined behavior)
1678}
1679
1680BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_copy_assignable_relaxed)
1681{
1682 typedef ::boost::mpl::vector<
1683 common<>,
1684 movable_common<>,
1685 assignable<>,
1686 relaxed
1687 > test_concept;
1688 typedef test_class<int, true, true, true, false> test_type;
1689
1690 typedef any<test_concept> any_val;
1691 typedef any<test_concept, _self&> any_ref;
1692 typedef any<test_concept, const _self&> any_cref;
1693 typedef any<test_concept, _self&&> any_rref;
1694
1695 // Compile-time check.
1696 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1697 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1698
1699 // assignment of same type
1700 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1701 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1702 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1703 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1704 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1705 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1706 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1707 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1708 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1709 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1710 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1711 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1712
1713 // different stored type
1714 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_rvalue | id_construct | id_copy);
1715 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1716 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1717 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1718 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1719 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1720 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1721 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1722 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1723 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1724 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1725 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1726
1727 // raw value
1728 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1729 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1730 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1731 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1732 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1733 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1734}
1735
1736BOOST_AUTO_TEST_CASE(test_move_and_copy_constructable_move_assignable)
1737{
1738 typedef ::boost::mpl::vector<
1739 common<>,
1740 movable_common<>,
1741 move_assignable<>
1742 > test_concept;
1743 typedef test_class<int, true, true, false, true> test_type;
1744
1745 typedef any<test_concept> any_val;
1746 typedef any<test_concept, _self&&> any_rref;
1747
1748 // Compile-time check.
1749 TEST_ASSIGNMENT(any_val&(test_type&), any_val(test_type), id_dispatch, id_rvalue | id_assign | id_copy);
1750 TEST_ASSIGNMENT(any_val&(test_type&), any_val(test_type&), id_dispatch, id_rvalue | id_assign | id_copy);
1751 TEST_ASSIGNMENT(any_val&(test_type&), any_val(test_type const&), id_dispatch, id_rvalue | id_assign | id_copy);
1752
1753 // assignment of same type
1754 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1755 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1756 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1757 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1758
1759 // different stored type
1760
1761 // raw value
1762}
1763
1764BOOST_AUTO_TEST_CASE(test_move_and_copy_constructable_move_assignable_relaxed)
1765{
1766 typedef ::boost::mpl::vector<
1767 common<>,
1768 movable_common<>,
1769 move_assignable<>,
1770 relaxed
1771 > test_concept;
1772 typedef test_class<int, true, true, false, true> test_type;
1773
1774 typedef any<test_concept> any_val;
1775 typedef any<test_concept, _self&> any_ref;
1776 typedef any<test_concept, const _self&> any_cref;
1777 typedef any<test_concept, _self&&> any_rref;
1778
1779 // Compile-time check.
1780 TEST_ASSIGNMENT(any_val&(int), test_type, id_fallback, id_rvalue | id_construct | id_copy);
1781 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1782 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1783
1784 // assignment of same type
1785 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1786 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1787 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_fallback, id_const_lvalue | id_construct | id_copy);
1788 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1789 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1790 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1791 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1792 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1793 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_fallback, id_const_lvalue | id_construct | id_copy);
1794 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1795 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1796 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1797
1798 // different stored type
1799 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_rvalue | id_construct | id_copy);
1800 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1801 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1802 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1803 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1804 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1805 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1806 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1807 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1808 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1809 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1810 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1811
1812 // raw value
1813 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1814 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1815 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1816 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1817 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1818 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1819}
1820
1821BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_move_and_copy_assignable)
1822{
1823 typedef ::boost::mpl::vector<
1824 common<>,
1825 movable_common<>,
1826 assignable<>,
1827 move_assignable<>
1828 > test_concept;
1829 typedef test_class<int, true, true, true, true> test_type;
1830
1831 typedef any<test_concept> any_val;
1832 typedef any<test_concept, _self&> any_ref;
1833 typedef any<test_concept, const _self&> any_cref;
1834 typedef any<test_concept, _self&&> any_rref;
1835
1836 // Compile-time check.
1837 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(test_type), id_dispatch, id_const_lvalue | id_assign | id_copy);
1838 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1839 TEST_ASSIGNMENT(any_val&(test_type&), any_val&(const test_type&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1840
1841 // assignment of same type
1842 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1843 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1844 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1845 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1846 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1847 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1848 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1849 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1850 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1851 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1852 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1853 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1854
1855 // different stored type (undefined behavior)
1856}
1857
1858BOOST_AUTO_TEST_CASE(test_move_and_copy_constructible_move_and_copy_assignable_relaxed)
1859{
1860 typedef ::boost::mpl::vector<
1861 common<>,
1862 movable_common<>,
1863 assignable<>,
1864 move_assignable<>,
1865 relaxed
1866 > test_concept;
1867 typedef test_class<int, true, true, true, true> test_type;
1868
1869 typedef any<test_concept> any_val;
1870 typedef any<test_concept, _self&> any_ref;
1871 typedef any<test_concept, const _self&> any_cref;
1872 typedef any<test_concept, _self&&> any_rref;
1873
1874 // Compile-time check.
1875 TEST_ASSIGNMENT(any_val&(int), test_type, id_fallback, id_rvalue | id_construct | id_copy);
1876 TEST_ASSIGNMENT(any_val&(int), test_type&, id_fallback, id_lvalue | id_construct | id_copy);
1877 TEST_ASSIGNMENT(any_val&(int), test_type const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1878
1879 // assignment of same type
1880 TEST_ASSIGNMENT(any_val&(int), any_val(int), id_dispatch, id_rvalue | id_assign | id_copy);
1881 TEST_ASSIGNMENT(any_val&(int), any_val&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1882 TEST_ASSIGNMENT(any_val&(int), any_val const&(int), id_dispatch, id_const_lvalue | id_assign | id_copy);
1883 TEST_ASSIGNMENT(any_val&(int), any_ref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1884 TEST_ASSIGNMENT(any_val&(int), any_ref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1885 TEST_ASSIGNMENT(any_val&(int), any_ref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1886 TEST_ASSIGNMENT(any_val&(int), any_cref(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1887 TEST_ASSIGNMENT(any_val&(int), any_cref&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1888 TEST_ASSIGNMENT(any_val&(int), any_cref const&(int&), id_dispatch, id_const_lvalue | id_assign | id_copy);
1889 TEST_ASSIGNMENT(any_val&(int), any_rref(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1890 TEST_ASSIGNMENT(any_val&(int), any_rref&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1891 TEST_ASSIGNMENT(any_val&(int), any_rref const&(int&&), id_dispatch, id_rvalue | id_assign | id_copy);
1892
1893 // different stored type
1894 TEST_ASSIGNMENT(any_val&(int), any_val(long), id_fallback, id_rvalue | id_construct | id_copy);
1895 TEST_ASSIGNMENT(any_val&(int), any_val&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1896 TEST_ASSIGNMENT(any_val&(int), any_val const&(long), id_fallback, id_const_lvalue | id_construct | id_copy);
1897 TEST_ASSIGNMENT(any_val&(int), any_ref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1898 TEST_ASSIGNMENT(any_val&(int), any_ref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1899 TEST_ASSIGNMENT(any_val&(int), any_ref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1900 TEST_ASSIGNMENT(any_val&(int), any_cref(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1901 TEST_ASSIGNMENT(any_val&(int), any_cref&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1902 TEST_ASSIGNMENT(any_val&(int), any_cref const&(long&), id_fallback, id_const_lvalue | id_construct | id_copy);
1903 TEST_ASSIGNMENT(any_val&(int), any_rref(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1904 TEST_ASSIGNMENT(any_val&(int), any_rref&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1905 TEST_ASSIGNMENT(any_val&(int), any_rref const&(long&&), id_fallback, id_rvalue | id_construct | id_copy);
1906
1907 // raw value
1908 TEST_ASSIGNMENT(any_val&(int), int, id_fallback, id_rvalue | id_construct | id_copy);
1909 TEST_ASSIGNMENT(any_val&(int), int&, id_fallback, id_lvalue | id_construct | id_copy);
1910 TEST_ASSIGNMENT(any_val&(int), int const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1911 TEST_ASSIGNMENT(any_val&(int), long, id_fallback, id_rvalue | id_construct | id_copy);
1912 TEST_ASSIGNMENT(any_val&(int), long&, id_fallback, id_lvalue | id_construct | id_copy);
1913 TEST_ASSIGNMENT(any_val&(int), long const&, id_fallback, id_const_lvalue | id_construct | id_copy);
1914}
1915
1916#endif // BOOST_NO_RVALUE_REFERENCES || BOOST_NO_CXX11_REF_QUALIFIERS
1917
1918BOOST_AUTO_TEST_CASE(test_basic_int)
1919{
1920 typedef ::boost::mpl::vector<
1921 common<>,
1922 assignable<_self, copy_tracker<int> >
1923 > test_concept;
1924
1925 typedef any<test_concept> any_val;
1926 typedef any<test_concept, _self&> any_ref;
1927
1928 TEST_ASSIGNMENT(any_val&(int), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1929 TEST_ASSIGNMENT(any_val&(int), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1930 TEST_ASSIGNMENT(any_val&(int), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1931
1932 TEST_ASSIGNMENT(any_ref&(int&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1933 TEST_ASSIGNMENT(any_ref&(int&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1934 TEST_ASSIGNMENT(any_ref&(int&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1935
1936#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1937 typedef any<test_concept, _self&&> any_rref;
1938 TEST_ASSIGNMENT(any_rref&(int&&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1939 TEST_ASSIGNMENT(any_rref&(int&&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1940 TEST_ASSIGNMENT(any_rref&(int&&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1941#endif
1942}
1943
1944BOOST_AUTO_TEST_CASE(test_basic_relaxed_int)
1945{
1946 typedef ::boost::mpl::vector<
1947 common<>,
1948 assignable<_self, copy_tracker<int> >,
1949 relaxed
1950 > test_concept;
1951
1952 typedef any<test_concept> any_val;
1953 typedef any<test_concept, _self&> any_ref;
1954
1955 TEST_ASSIGNMENT(any_val&(int), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1956 TEST_ASSIGNMENT(any_val&(int), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1957 TEST_ASSIGNMENT(any_val&(int), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1958
1959 TEST_ASSIGNMENT(any_ref&(int&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1960 TEST_ASSIGNMENT(any_ref&(int&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1961 TEST_ASSIGNMENT(any_ref&(int&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1962
1963#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1964 typedef any<test_concept, _self&&> any_rref;
1965 TEST_ASSIGNMENT(any_rref&(int&&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1966 TEST_ASSIGNMENT(any_rref&(int&&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1967 TEST_ASSIGNMENT(any_rref&(int&&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1968#endif
1969}
1970
1971BOOST_AUTO_TEST_CASE(test_relaxed_no_copy_int)
1972{
1973 typedef ::boost::mpl::vector<
1974 destructible<>,
1975 typeid_<>,
1976 assignable<_self, copy_tracker<int> >,
1977 relaxed
1978 > test_concept;
1979
1980 typedef any<test_concept> any_val;
1981 typedef any<test_concept, _self&> any_ref;
1982
1983 TEST_ASSIGNMENT(any_val&(int), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1984 TEST_ASSIGNMENT(any_val&(int), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1985 TEST_ASSIGNMENT(any_val&(int), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1986
1987 TEST_ASSIGNMENT(any_ref&(int&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1988 TEST_ASSIGNMENT(any_ref&(int&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1989 TEST_ASSIGNMENT(any_ref&(int&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1990
1991#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
1992 typedef any<test_concept, _self&&> any_rref;
1993 TEST_ASSIGNMENT(any_rref&(int&&), int, id_dispatch, id_const_lvalue | id_assign | id_copy);
1994 TEST_ASSIGNMENT(any_rref&(int&&), int&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1995 TEST_ASSIGNMENT(any_rref&(int&&), int const&, id_dispatch, id_const_lvalue | id_assign | id_copy);
1996#endif
1997}
1998
1999BOOST_AUTO_TEST_CASE(test_relaxed_no_assign_int)
2000{
2001 typedef ::boost::mpl::vector<
2002 common<>,
2003 relaxed
2004 > test_concept;
2005 any<test_concept> x(1);
2006 x = 2;
2007 BOOST_CHECK_EQUAL(any_cast<int>(x), 2);
2008}
2009
2010#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
2011
2012struct move_only_assign_int
2013{
2014 explicit move_only_assign_int(int i)
2015 : value(i) {}
2016 move_only_assign_int(move_only_assign_int&& other)
2017 : value(other.value) { other.value = 0; }
2018 move_only_assign_int& operator=(move_only_assign_int&& other)
2019 { value = other.value; other.value = 0; return *this; }
2020 move_only_assign_int& operator=(int&& i)
2021 { value = i; return *this; }
2022 int value;
2023private:
2024 move_only_assign_int(const move_only_assign_int&);
2025 move_only_assign_int& operator=(const move_only_assign_int&);
2026};
2027
2028struct only_assign_int
2029{
2030 explicit only_assign_int(int i)
2031 : value(i) {}
2032 only_assign_int& operator=(int&& i)
2033 { value = i; return *this; }
2034 int value;
2035private:
2036 only_assign_int(only_assign_int&&);
2037 only_assign_int(const only_assign_int&);
2038 only_assign_int& operator=(only_assign_int&&);
2039 only_assign_int& operator=(const only_assign_int&);
2040};
2041
2042struct move_and_copy_assign_int
2043{
2044 explicit move_and_copy_assign_int(int i)
2045 : value(i) {}
2046 move_and_copy_assign_int& operator=(move_and_copy_assign_int&& other)
2047 { value = other.value; other = 0; return *this; }
2048 move_and_copy_assign_int& operator=(const move_and_copy_assign_int& other)
2049 { value = other.value; return *this; }
2050 move_and_copy_assign_int& operator=(int&& i)
2051 { value = i; return *this; }
2052 move_and_copy_assign_int& operator=(const int& i)
2053 { value = i; return *this; }
2054 int value;
2055private:
2056 move_and_copy_assign_int(move_and_copy_assign_int&&);
2057 move_and_copy_assign_int(const move_and_copy_assign_int&);
2058};
2059
2060struct move_and_copy_construct_assign_int
2061{
2062 explicit move_and_copy_construct_assign_int(int i)
2063 : value(i) {}
2064 move_and_copy_construct_assign_int(move_and_copy_construct_assign_int&& other)
2065 : value(other.value) { other.value = 0; }
2066 move_and_copy_construct_assign_int(const move_and_copy_construct_assign_int& other)
2067 : value(other.value) {}
2068 move_and_copy_construct_assign_int& operator=(move_and_copy_construct_assign_int&& other)
2069 { value = other.value; other = 0; return *this; }
2070 move_and_copy_construct_assign_int& operator=(const move_and_copy_construct_assign_int& other)
2071 { value = other.value; return *this; }
2072 move_and_copy_construct_assign_int& operator=(int&& i)
2073 { value = i; return *this; }
2074 move_and_copy_construct_assign_int& operator=(const int& i)
2075 { value = i; return *this; }
2076 int value;
2077};
2078
2079struct copy_only_assign_int
2080{
2081 explicit copy_only_assign_int(int i)
2082 : value(i) {}
2083 copy_only_assign_int(const copy_only_assign_int& other)
2084 : value(other.value) {}
2085 copy_only_assign_int& operator=(const copy_only_assign_int& other)
2086 { value = other.value; return *this; }
2087 copy_only_assign_int& operator=(int&& i)
2088 { value = i; return *this; }
2089 copy_only_assign_int& operator=(const int& i)
2090 { value = i; return *this; }
2091 int value;
2092private:
2093 copy_only_assign_int(copy_only_assign_int&&);
2094 copy_only_assign_int& operator=(copy_only_assign_int&&);
2095};
2096
2097struct copy_only_assign_double
2098{
2099 explicit copy_only_assign_double(double i)
2100 : value(i) {}
2101 copy_only_assign_double(const copy_only_assign_double& other)
2102 : value(other.value) {}
2103 copy_only_assign_double& operator=(const copy_only_assign_double& other)
2104 { value = other.value; return *this; }
2105 copy_only_assign_double& operator=(double&& i)
2106 { value = i; return *this; }
2107 copy_only_assign_double& operator=(const double& i)
2108 { value = i; return *this; }
2109 double value;
2110private:
2111 copy_only_assign_double(copy_only_assign_double&&);
2112 copy_only_assign_double& operator=(copy_only_assign_double&&);
2113};
2114
2115BOOST_AUTO_TEST_CASE(test_movable_basic_int)
2116{
2117 typedef ::boost::mpl::vector<
2118 movable_common<>,
2119 move_assignable<_self, int>
2120 > test_concept;
2121 typedef move_only_assign_int test_type;
2122 test_type source_x(1);
2123
2124 any<test_concept> x(std::move(source_x));
2125 test_type* ip = any_cast<test_type*>(arg: &x);
2126 x = std::move(2);
2127 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2128 // make sure that we're actually using assignment
2129 // of the underlying object, not copy and swap.
2130 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2131}
2132
2133BOOST_AUTO_TEST_CASE(test_movable_basic_relaxed_int)
2134{
2135 typedef ::boost::mpl::vector<
2136 movable_common<>,
2137 move_assignable<_self, int>,
2138 relaxed
2139 > test_concept;
2140 typedef move_only_assign_int test_type;
2141 test_type source_x(1);
2142
2143 any<test_concept> x(std::move(source_x));
2144 test_type* ip = any_cast<test_type*>(arg: &x);
2145 x = std::move(2);
2146 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2147 // make sure that we're actually using assignment
2148 // of the underlying object, not copy and swap.
2149 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2150}
2151
2152BOOST_AUTO_TEST_CASE(test_relaxed_no_constructible_int)
2153{
2154 typedef ::boost::mpl::vector<
2155 destructible<>,
2156 typeid_<>,
2157 constructible<_self(int)>,
2158 move_assignable<_self, int>,
2159 relaxed
2160 > test_concept;
2161 typedef only_assign_int test_type;
2162
2163 typedef ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > type;
2164 any<test_concept> x(binding<test_concept>(make_binding<type>()), 1);
2165 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 1);
2166 test_type* ip = any_cast<test_type*>(arg: &x);
2167 x = std::move(2);
2168 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2169 // make sure that we're actually using assignment
2170 // of the underlying object, not copy and swap.
2171 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2172}
2173
2174BOOST_AUTO_TEST_CASE(test_movable_relaxed_no_assign_int)
2175{
2176 typedef ::boost::mpl::vector<
2177 movable_common<>,
2178 relaxed
2179 > test_concept;
2180 typedef move_only_assign_int test_type;
2181 test_type source_x(1);
2182
2183 any<test_concept> x(std::move(source_x));
2184 x = test_type(2);
2185 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2186}
2187
2188#ifndef BOOST_NO_CXX11_REF_QUALIFIERS
2189
2190BOOST_AUTO_TEST_CASE(test_move_and_copy_assignable_int)
2191{
2192 typedef ::boost::mpl::vector<
2193 destructible<>,
2194 typeid_<>,
2195 constructible<_self(int)>,
2196 assignable<_self, _self>,
2197 move_assignable<_self, _self>,
2198 assignable<_self, int>,
2199 move_assignable<_self, int>,
2200 relaxed
2201 > test_concept;
2202 typedef move_and_copy_assign_int test_type;
2203 typedef ::boost::mpl::map< ::boost::mpl::pair<_self, test_type> > type;
2204
2205 any<test_concept> x(binding<test_concept>(make_binding<type>()), 1);
2206 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 1);
2207
2208 any<test_concept> y(binding<test_concept>(make_binding<type>()), 2);
2209 x = y;
2210 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2211
2212 any<test_concept> z(binding<test_concept>(make_binding<type>()), 3);
2213 x = std::move(z);
2214 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 3);
2215
2216 x = 4;
2217 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 4);
2218
2219 x = std::move(5);
2220 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 5);
2221}
2222
2223BOOST_AUTO_TEST_CASE(test_move_and_copy_assignable_copy_construct_int)
2224{
2225 typedef ::boost::mpl::vector<
2226 common<>,
2227 assignable<_self, _self>,
2228 move_assignable<_self, _self>,
2229 assignable<_self, int>,
2230 move_assignable<_self, int>,
2231 relaxed
2232 > test_concept;
2233 typedef move_and_copy_construct_assign_int test_type;
2234 test_type source_x(1);
2235 test_type source_y(2);
2236 test_type source_z(3);
2237
2238 any<test_concept> x(source_x);
2239 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 1);
2240 test_type* ip = any_cast<test_type*>(arg: &x);
2241
2242 any<test_concept> y(source_y);
2243 x = y;
2244 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 2);
2245 // make sure that we're actually using assignment
2246 // of the underlying object, not copy and swap.
2247 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2248
2249 any<test_concept> z(source_z);
2250 x = std::move(z);
2251 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 3);
2252 // make sure that we're actually using move-assignment
2253 // of the underlying object, not copy and swap.
2254 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2255
2256 x = 4;
2257 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 4);
2258 // make sure that we're actually using assignment
2259 // of the underlying object, not copy and swap.
2260 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2261
2262 x = std::move(5);
2263 BOOST_CHECK_EQUAL(any_cast<const test_type&>(x).value, 5);
2264 // make sure that we're actually using move-assignment
2265 // of the underlying object, not copy and swap.
2266 BOOST_CHECK_EQUAL(any_cast<test_type*>(&x), ip);
2267}
2268
2269#endif // BOOST_NO_CXX11_REF_QUALIFIERS
2270
2271BOOST_AUTO_TEST_CASE(test_assignable_with_conversion)
2272{
2273 typedef ::boost::mpl::vector<
2274 destructible<>,
2275 typeid_<>,
2276 assignable<_self, int>,
2277 relaxed
2278 > test_concept;
2279 typedef move_and_copy_construct_assign_int test_type1;
2280 typedef copy_only_assign_int test_type2;
2281 typedef copy_only_assign_double test_type3;
2282
2283 test_type1 source_x(1);
2284 any<test_concept> x(source_x);
2285 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 1);
2286
2287 // assigning raw values is supported because "relaxed" is in concept.
2288 test_type2 source_y(2);
2289 x = source_y;
2290 BOOST_CHECK_EQUAL(any_cast<const test_type2&>(x).value, 2);
2291
2292 // move-assigning raw values is supported because "relaxed" is in concept.
2293 x = test_type1(3);
2294 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 3);
2295
2296 // assigning int is supported because appropriate "assignable" is in concept.
2297 int int4 = 4;
2298 x = int4;
2299 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 4);
2300 int int5 = 5;
2301 x = std::move(int5);
2302 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 5);
2303
2304 // assigning double (which is implicitly convertible to int) is supported
2305 // because appropriate "assignable" is in concept.
2306 double double6 = 6.5;
2307 x = double6; // truncates value
2308 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 6);
2309 double double7 = 7.5;
2310 x = std::move(double7); // truncates value
2311 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 7);
2312
2313 // assigning raw values is supported because "relaxed" is in concept.
2314 test_type3 source_z(8.5);
2315 x = source_z;
2316 BOOST_CHECK_EQUAL(any_cast<const test_type3&>(x).value, 8.5);
2317
2318 // assigning double (which is implicitly convertible to int) is supported
2319 // because appropriate "assignable" is in concept.
2320 double double9 = 9.5;
2321 x = double9; // truncates value
2322 BOOST_CHECK_EQUAL(any_cast<const test_type3&>(x).value, 9.0);
2323 double double10 = 10.5;
2324 x = std::move(double10); // truncates value
2325 BOOST_CHECK_EQUAL(any_cast<const test_type3&>(x).value, 10.0);
2326}
2327
2328BOOST_AUTO_TEST_CASE(test_move_assignable_with_conversion)
2329{
2330 typedef ::boost::mpl::vector<
2331 destructible<>,
2332 typeid_<>,
2333 move_assignable<_self, int>,
2334 relaxed
2335 > test_concept;
2336 typedef move_and_copy_construct_assign_int test_type1;
2337 typedef copy_only_assign_int test_type2;
2338 typedef copy_only_assign_double test_type3;
2339
2340 test_type1 source_x(1);
2341 any<test_concept> x(source_x);
2342 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 1);
2343
2344 // assigning raw values is supported because "relaxed" is in concept.
2345 test_type2 source_y(2);
2346 x = source_y;
2347 BOOST_CHECK_EQUAL(any_cast<const test_type2&>(x).value, 2);
2348
2349 // move-assigning raw values is supported because "relaxed" is in concept.
2350 x = test_type1(3);
2351 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 3);
2352
2353 // move-assigning int is supported because appropriate "move_assignable" is in concept.
2354 int int4 = 4;
2355 x = std::move(int4);
2356 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 4);
2357 // copy-assigning int is assigning a raw_value.
2358 int int5 = 5;
2359 x = int5;
2360 BOOST_CHECK_EQUAL(any_cast<const int&>(x), 5);
2361 x = source_x; // reset.
2362
2363 // move-assigning double (which is implicitly convertible to int) is supported
2364 // because appropriate "move_assignable" is in concept.
2365 double double6 = 6.5;
2366 x = std::move(double6); // truncates value
2367 BOOST_CHECK_EQUAL(any_cast<const test_type1&>(x).value, 6);
2368
2369 // assigning raw values is supported because "relaxed" is in concept.
2370 test_type3 source_z(8.5);
2371 x = source_z;
2372 BOOST_CHECK_EQUAL(any_cast<const test_type3&>(x).value, 8.5);
2373
2374 // move-assigning double (which is implicitly convertible to int) is supported
2375 // because appropriate "move_assignable" is in concept.
2376 double double9 = 9.5;
2377 x = std::move(double9); // truncates value
2378 BOOST_CHECK_EQUAL(any_cast<const test_type3&>(x).value, 9.0);
2379}
2380
2381#endif
2382

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