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