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 // <memory>
10 
11 // shared_ptr
12 
13 // void swap(shared_ptr& r);
14 
15 #include <memory>
16 #include <cassert>
17 
18 struct A
19 {
20     static int count;
21 
22     A() {++count;}
23     A(const A&) {++count;}
24     ~A() {--count;}
25 };
26 
27 int A::count = 0;
28 
29 int main(int, char**)
30 {
31     {
32         A* ptr1 = new A;
33         A* ptr2 = new A;
34         std::shared_ptr<A> p1(ptr1);
35         {
36             std::shared_ptr<A> p2(ptr2);
37             p1.swap(p2);
38             assert(p1.use_count() == 1);
39             assert(p1.get() == ptr2);
40             assert(p2.use_count() == 1);
41             assert(p2.get() == ptr1);
42             assert(A::count == 2);
43         }
44         assert(p1.use_count() == 1);
45         assert(p1.get() == ptr2);
46         assert(A::count == 1);
47     }
48     assert(A::count == 0);
49     {
50         A* ptr1 = new A;
51         A* ptr2 = 0;
52         std::shared_ptr<A> p1(ptr1);
53         {
54             std::shared_ptr<A> p2;
55             p1.swap(p2);
56             assert(p1.use_count() == 0);
57             assert(p1.get() == ptr2);
58             assert(p2.use_count() == 1);
59             assert(p2.get() == ptr1);
60             assert(A::count == 1);
61         }
62         assert(p1.use_count() == 0);
63         assert(p1.get() == ptr2);
64         assert(A::count == 0);
65     }
66     assert(A::count == 0);
67     {
68         A* ptr1 = 0;
69         A* ptr2 = new A;
70         std::shared_ptr<A> p1;
71         {
72             std::shared_ptr<A> p2(ptr2);
73             p1.swap(p2);
74             assert(p1.use_count() == 1);
75             assert(p1.get() == ptr2);
76             assert(p2.use_count() == 0);
77             assert(p2.get() == ptr1);
78             assert(A::count == 1);
79         }
80         assert(p1.use_count() == 1);
81         assert(p1.get() == ptr2);
82         assert(A::count == 1);
83     }
84     assert(A::count == 0);
85     {
86         A* ptr1 = 0;
87         A* ptr2 = 0;
88         std::shared_ptr<A> p1;
89         {
90             std::shared_ptr<A> p2;
91             p1.swap(p2);
92             assert(p1.use_count() == 0);
93             assert(p1.get() == ptr2);
94             assert(p2.use_count() == 0);
95             assert(p2.get() == ptr1);
96             assert(A::count == 0);
97         }
98         assert(p1.use_count() == 0);
99         assert(p1.get() == ptr2);
100         assert(A::count == 0);
101     }
102     assert(A::count == 0);
103 
104   return 0;
105 }
106