swap.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// <memory>
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unique_ptr
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test swap
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <memory>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "../deleter.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct A
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int state_;
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    static int count;
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A() : state_(0) {++count;}
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    explicit A(int i) : state_(i) {++count;}
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A(const A& a) : state_(a.state_) {++count;}
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A& operator=(const A& a) {state_ = a.state_; return *this;}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~A() {--count;}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    friend bool operator==(const A& x, const A& y)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {return x.state_ == y.state_;}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int A::count = 0;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    {
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    A* p1 = new A(1);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::unique_ptr<A, Deleter<A> > s1(p1, Deleter<A>(1));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A* p2 = new A(2);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::unique_ptr<A, Deleter<A> > s2(p2, Deleter<A>(2));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get() == p1);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(*s1 == A(1));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get_deleter().state() == 1);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get() == p2);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(*s2 == A(2));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get_deleter().state() == 2);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swap(s1, s2);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get() == p2);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(*s1 == A(2));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get_deleter().state() == 2);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get() == p1);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(*s2 == A(1));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get_deleter().state() == 1);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 2);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 0);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A* p1 = new A[3];
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::unique_ptr<A[], Deleter<A[]> > s1(p1, Deleter<A[]>(1));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    A* p2 = new A[3];
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::unique_ptr<A[], Deleter<A[]> > s2(p2, Deleter<A[]>(2));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get() == p1);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get_deleter().state() == 1);
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    assert(s2.get() == p2);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get_deleter().state() == 2);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    swap(s1, s2);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get() == p2);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s1.get_deleter().state() == 2);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get() == p1);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(s2.get_deleter().state() == 1);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 6);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(A::count == 0);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)