10#ifndef LIBCWD_LOCKABLE_AUTO_PTR_H
11#define LIBCWD_LOCKABLE_AUTO_PTR_H
17#define LIBCWD_ASSERT(...)
40template <
class X,
bool array = false>
41class lockable_auto_ptr
43 using element_type = X;
46 template <
class Y,
bool ARRAY>
47 friend class lockable_auto_ptr;
58 explicit lockable_auto_ptr(X* p = 0) : ptr_(p), locked_(false), owner_(p) { }
61 lockable_auto_ptr(lockable_auto_ptr
const& r) : ptr_(r.ptr_), locked_(false), owner_(r.owner_ && !r.locked_)
69 lockable_auto_ptr(lockable_auto_ptr<Y, array>
const& r) : ptr_(r.ptr_), locked_(false), owner_(r.owner_ && !r.locked_)
81 lockable_auto_ptr& operator=(lockable_auto_ptr<Y, array>
const& r);
83 lockable_auto_ptr& operator=(lockable_auto_ptr
const& r) {
return operator= <X>(r); }
105 X& operator*()
const {
return *ptr_; }
108 X* operator->()
const {
return ptr_; }
111 X* get()
const {
return ptr_; }
114 bool strict_owner()
const
116 LIBCWD_ASSERT(is_owner());
123 bool is_owner()
const {
return owner_; }
148 LIBCWD_ASSERT(is_owner());
157 LIBCWD_ASSERT(is_owner());
163 void unlock() { locked_ =
false; }
167template <
class X,
bool array>
169lockable_auto_ptr<X, array>& lockable_auto_ptr<X, array>::operator=(lockable_auto_ptr<Y, array>
const& r)
171 if ((
void*)&r != (
void*)
this)