//===----------------------------------------------------------------------===//
//
// 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 unique_ptr move ctor
#include<memory>#include<cassert>// test move ctor. Should only require a MoveConstructible deleter, or if
// deleter is a reference, not even that.
structA{staticintcount;A(){++count;}A(constA&){++count;}~A(){--count;}};intA::count=0;template<classT>classDeleter{intstate_;#ifdef _LIBCPP_MOVEDeleter(constDeleter&);Deleter&operator=(constDeleter&);#elseDeleter(Deleter&);Deleter&operator=(Deleter&);#endifpublic:#ifdef _LIBCPP_MOVEDeleter(Deleter&&r):state_(r.state_){r.state_=0;}Deleter&operator=(Deleter&&r){state_=r.state_;r.state_=0;return*this;}#elseoperatorstd::__rv<Deleter>(){returnstd::__rv<Deleter>(*this);}Deleter(std::__rv<Deleter>r):state_(r->state_){r->state_=0;}Deleter&operator=(std::__rv<Deleter>r){state_=r->state_;r->state_=0;return*this;}#endifDeleter():state_(5){}#ifdef _LIBCPP_MOVEtemplate<classU>Deleter(Deleter<U>&&d,typenamestd::enable_if<!std::is_same<U,T>::value>::type*=0):state_(d.state()){d.set_state(0);}private:template<classU>Deleter(constDeleter<U>&d,typenamestd::enable_if<!std::is_same<U,T>::value>::type*=0);#elsetemplate<classU>Deleter(Deleter<U>d,typenamestd::enable_if<!std::is_same<U,T>::value>::type*=0):state_(d.state()){}#endifpublic:intstate()const{returnstate_;}voidset_state(inti){state_=i;}voidoperator()(T*p){deletep;}};classCDeleter{intstate_;CDeleter(CDeleter&);CDeleter&operator=(CDeleter&);public:CDeleter():state_(5){}intstate()const{returnstate_;}voidset_state(ints){state_=s;}voidoperator()(A*p){deletep;}};std::unique_ptr<A>source1(){returnstd::unique_ptr<A>(newA);}voidsink1(std::unique_ptr<A>p){}std::unique_ptr<A,Deleter<A>>source2(){returnstd::unique_ptr<A,Deleter<A>>(newA);}voidsink2(std::unique_ptr<A,Deleter<A>>p){}std::unique_ptr<A,CDeleter&>source3(){staticCDeleterd;returnstd::unique_ptr<A,CDeleter&>(newA,d);}voidsink3(std::unique_ptr<A,CDeleter&>p){}intmain(){sink1(source1());sink2(source2());sink3(source3());assert(A::count==0);}