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