1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // UNSUPPORTED: c++98, c++03, c++11
11 
12 // <experimental/any>
13 
14 // any(any const &);
15 
16 #include <experimental/any>
17 #include <cassert>
18 
19 #include "any_helpers.h"
20 #include "count_new.hpp"
21 #include "test_macros.h"
22 
23 using std::experimental::any;
24 using std::experimental::any_cast;
25 
26 template <class Type>
test_copy_throws()27 void test_copy_throws() {
28 #if !defined(TEST_HAS_NO_EXCEPTIONS)
29     assert(Type::count == 0);
30     {
31         any const a((Type(42)));
32         assert(Type::count == 1);
33         try {
34             any const a2(a);
35             assert(false);
36         } catch (my_any_exception const &) {
37             // do nothing
38         } catch (...) {
39             assert(false);
40         }
41         assert(Type::count == 1);
42         assertContains<Type>(a, 42);
43     }
44     assert(Type::count == 0);
45 #endif
46 }
47 
test_copy_empty()48 void test_copy_empty() {
49     DisableAllocationGuard g; ((void)g); // No allocations should occur.
50     any a1;
51     any a2(a1);
52 
53     assertEmpty(a1);
54     assertEmpty(a2);
55 }
56 
57 template <class Type>
test_copy()58 void test_copy()
59 {
60     // Copying small types should not perform any allocations.
61     DisableAllocationGuard g(isSmallType<Type>()); ((void)g);
62     assert(Type::count == 0);
63     Type::reset();
64     {
65         any a((Type(42)));
66         assert(Type::count == 1);
67         assert(Type::copied == 0);
68 
69         any a2(a);
70 
71         assert(Type::copied == 1);
72         assert(Type::count == 2);
73         assertContains<Type>(a, 42);
74         assertContains<Type>(a, 42);
75 
76         // Modify a and check that a2 is unchanged
77         modifyValue<Type>(a, -1);
78         assertContains<Type>(a, -1);
79         assertContains<Type>(a2, 42);
80 
81         // modify a2 and check that a is unchanged
82         modifyValue<Type>(a2, 999);
83         assertContains<Type>(a, -1);
84         assertContains<Type>(a2, 999);
85 
86         // clear a and check that a2 is unchanged
87         a.clear();
88         assertEmpty(a);
89         assertContains<Type>(a2, 999);
90     }
91     assert(Type::count == 0);
92 }
93 
main()94 int main() {
95     test_copy<small>();
96     test_copy<large>();
97     test_copy_empty();
98     test_copy_throws<small_throws_on_copy>();
99     test_copy_throws<large_throws_on_copy>();
100 }
101