swap.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// <memory> 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// shared_ptr 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// void swap(shared_ptr& r); 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <memory> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <cassert> 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstruct A 20cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton{ 21a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman static int count; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A() {++count;} 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A(const A&) {++count;} 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~A() {--count;} 265a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham}; 275a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham 285a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Inghamint A::count = 0; 295a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham 305a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Inghamint main() 315a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham{ 325a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham { 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr1 = new A; 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr2 = new A; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::shared_ptr<A> p1(ptr1); 36eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton { 375a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham std::shared_ptr<A> p2(ptr2); 38427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton p1.swap(p2); 390a164a1664bce107a4049b838485863320c8292aEli Friedman assert(p1.use_count() == 1); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.get() == ptr2); 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.use_count() == 1); 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.get() == ptr1); 43db2bab463047edba4b01da1fcaf70f15e778095eGreg Clayton assert(A::count == 2); 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 459ac497bc11512d221b3962e4f883eeac07db188aCaroline Tice assert(p1.use_count() == 1); 46eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton assert(p1.get() == ptr2); 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 1); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr1 = new A; 52ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton A* ptr2 = 0; 53ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton std::shared_ptr<A> p1(ptr1); 54ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton { 55ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton std::shared_ptr<A> p2; 56ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton p1.swap(p2); 57ff39f746ebaa3710c44ba49bd9b0a6cf05f60a3fGreg Clayton assert(p1.use_count() == 0); 585a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham assert(p1.get() == ptr2); 595a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham assert(p2.use_count() == 1); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.get() == ptr1); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 1); 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.use_count() == 0); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.get() == ptr2); 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr1 = 0; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr2 = new A; 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::shared_ptr<A> p1; 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::shared_ptr<A> p2(ptr2); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner p1.swap(p2); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.use_count() == 1); 76b3558281b767607590d56ae74d15c3cfa55819d9Greg Clayton assert(p1.get() == ptr2); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.use_count() == 0); 78db9d6f47ab38e25c3efcbfa05780bf9a127fd259Greg Clayton assert(p2.get() == ptr1); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 1); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.use_count() == 1); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.get() == ptr2); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 1); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner A* ptr1 = 0; 88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton A* ptr2 = 0; 89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton std::shared_ptr<A> p1; 90427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::shared_ptr<A> p2; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner p1.swap(p2); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.use_count() == 0); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.get() == ptr2); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.use_count() == 0); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p2.get() == ptr1); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.use_count() == 0); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(p1.get() == ptr2); 101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert(A::count == 0); 102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(A::count == 0); 104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton} 105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton