1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14
10
11 // <any>
12
13 // any::swap(any &) noexcept
14
15 // Test swap(large, small) and swap(small, large)
16
17 #include <any>
18 #include <cassert>
19
20 #include "test_macros.h"
21 #include "any_helpers.h"
22
23 template <class LHS, class RHS>
test_swap()24 void test_swap() {
25 assert(LHS::count == 0);
26 assert(RHS::count == 0);
27 {
28 std::any a1 = LHS(1);
29 std::any a2 = RHS(2);
30 assert(LHS::count == 1);
31 assert(RHS::count == 1);
32
33 a1.swap(a2);
34
35 assert(LHS::count == 1);
36 assert(RHS::count == 1);
37
38 assertContains<RHS>(a1, 2);
39 assertContains<LHS>(a2, 1);
40 }
41 assert(LHS::count == 0);
42 assert(RHS::count == 0);
43 assert(LHS::copied == 0);
44 assert(RHS::copied == 0);
45 }
46
47 template <class Tp>
test_swap_empty()48 void test_swap_empty() {
49 assert(Tp::count == 0);
50 {
51 std::any a1 = Tp(1);
52 std::any a2;
53 assert(Tp::count == 1);
54
55 a1.swap(a2);
56
57 assert(Tp::count == 1);
58
59 assertContains<Tp>(a2, 1);
60 assertEmpty(a1);
61 }
62 assert(Tp::count == 0);
63 {
64 std::any a1 = Tp(1);
65 std::any a2;
66 assert(Tp::count == 1);
67
68 a2.swap(a1);
69
70 assert(Tp::count == 1);
71
72 assertContains<Tp>(a2, 1);
73 assertEmpty(a1);
74 }
75 assert(Tp::count == 0);
76 assert(Tp::copied == 0);
77 }
78
test_noexcept()79 void test_noexcept()
80 {
81 std::any a1;
82 std::any a2;
83 ASSERT_NOEXCEPT(a1.swap(a2));
84 }
85
test_self_swap()86 void test_self_swap() {
87 {
88 // empty
89 std::any a;
90 a.swap(a);
91 assertEmpty(a);
92 }
93 { // small
94 using T = small;
95 std::any a = T(42);
96 T::reset();
97 a.swap(a);
98 assertContains<T>(a, 42);
99 assert(T::count == 1);
100 assert(T::copied == 0);
101 LIBCPP_ASSERT(T::moved == 0);
102 }
103 assert(small::count == 0);
104 { // large
105 using T = large;
106 std::any a = T(42);
107 T::reset();
108 a.swap(a);
109 assertContains<T>(a, 42);
110 assert(T::count == 1);
111 assert(T::copied == 0);
112 LIBCPP_ASSERT(T::moved == 0);
113 }
114 assert(large::count == 0);
115 }
116
main(int,char **)117 int main(int, char**)
118 {
119 test_noexcept();
120 test_swap_empty<small>();
121 test_swap_empty<large>();
122 test_swap<small1, small2>();
123 test_swap<large1, large2>();
124 test_swap<small, large>();
125 test_swap<large, small>();
126 test_self_swap();
127
128 return 0;
129 }
130