//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <memory>
// unique_ptr
// Test swap
#include<memory>#include<cassert>#include"../deleter.h"structA{intstate_;staticintcount;A():state_(0){++count;}explicitA(inti):state_(i){++count;}A(constA&a):state_(a.state_){++count;}A&operator=(constA&a){state_=a.state_;return*this;}~A(){--count;}friendbooloperator==(constA&x,constA&y){returnx.state_==y.state_;}};intA::count=0;intmain(){{A*p1=newA(1);std::unique_ptr<A,Deleter<A>>s1(p1,Deleter<A>(1));A*p2=newA(2);std::unique_ptr<A,Deleter<A>>s2(p2,Deleter<A>(2));assert(s1.get()==p1);assert(*s1==A(1));assert(s1.get_deleter().state()==1);assert(s2.get()==p2);assert(*s2==A(2));assert(s2.get_deleter().state()==2);swap(s1,s2);assert(s1.get()==p2);assert(*s1==A(2));assert(s1.get_deleter().state()==2);assert(s2.get()==p1);assert(*s2==A(1));assert(s2.get_deleter().state()==1);assert(A::count==2);}assert(A::count==0);{A*p1=newA[3];std::unique_ptr<A[],Deleter<A[]>>s1(p1,Deleter<A[]>(1));A*p2=newA[3];std::unique_ptr<A[],Deleter<A[]>>s2(p2,Deleter<A[]>(2));assert(s1.get()==p1);assert(s1.get_deleter().state()==1);assert(s2.get()==p2);assert(s2.get_deleter().state()==2);swap(s1,s2);assert(s1.get()==p2);assert(s1.get_deleter().state()==2);assert(s2.get()==p1);assert(s2.get_deleter().state()==1);assert(A::count==6);}assert(A::count==0);}