1
//===----------------------------------------------------------------------===//
3
// The LLVM Compiler Infrastructure
5
// This file is dual licensed under the MIT and the University of Illinois Open
6
// Source Licenses. See LICENSE.TXT for details.
8
//===----------------------------------------------------------------------===//
14
// Test unique_ptr converting move ctor
19
// test converting move ctor. Should only require a MoveConstructible deleter, or if
20
// deleter is a reference, not even that.
27
A(const A&) {++count;}
28
virtual ~A() {--count;}
38
B(const B&) {++count;}
39
virtual ~B() {--count;}
49
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
50
Deleter(const Deleter&);
51
Deleter& operator=(const Deleter&);
52
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
54
Deleter& operator=(Deleter&);
55
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
58
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
59
Deleter(Deleter&& r) : state_(r.state_) {r.state_ = 0;}
60
Deleter& operator=(Deleter&& r)
66
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
67
operator std::__rv<Deleter>() {return std::__rv<Deleter>(*this);}
68
Deleter(std::__rv<Deleter> r) : state_(r->state_) {r->state_ = 0;}
69
Deleter& operator=(std::__rv<Deleter> r)
75
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
77
Deleter() : state_(5) {}
79
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
81
Deleter(Deleter<U>&& d,
82
typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
83
: state_(d.state()) {d.set_state(0);}
87
Deleter(const Deleter<U>& d,
88
typename std::enable_if<!std::is_same<U, T>::value>::type* = 0);
89
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
92
typename std::enable_if<!std::is_same<U, T>::value>::type* = 0)
93
: state_(d.state()) {}
94
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
96
int state() const {return state_;}
97
void set_state(int i) {state_ = i;}
99
void operator()(T* p) {delete p;}
105
const std::unique_ptr<B, Deleter<B> > s(new B);
107
std::unique_ptr<A, Deleter<A> > s2 = s;
108
assert(s2.get() == p);
109
assert(s.get() == 0);
110
assert(A::count == 1);
111
assert(B::count == 1);
112
assert(s2.get_deleter().state() == 5);
113
assert(s.get_deleter().state() == 0);
115
assert(A::count == 0);
116
assert(B::count == 0);