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