#ifndef _OS_SMART_POINTER_H | |
#define _OS_SMART_POINTER_H | |
#include "os_object_base.h" | |
namespace os { | |
template<class T> | |
struct smart_ptr { | |
smart_ptr() : pointer(nullptr) {} | |
explicit smart_ptr(T *&p) : pointer(p) { | |
if (pointer) { | |
_retain(pointer); | |
} | |
} | |
smart_ptr(smart_ptr const &rhs) : pointer(rhs.pointer) { | |
if (pointer) { | |
_retain(pointer); | |
} | |
} | |
smart_ptr & operator=(T *&rhs) { | |
smart_ptr(rhs).swap(*this); | |
return *this; | |
} | |
smart_ptr & operator=(smart_ptr &rhs) { | |
smart_ptr(rhs).swap(*this); | |
return *this; | |
} | |
~smart_ptr() { | |
if (pointer) { | |
_release(pointer); | |
} | |
} | |
void reset() { | |
smart_ptr().swap(*this); | |
} | |
T *get() const { | |
return pointer; | |
} | |
T ** get_for_out_param() { | |
reset(); | |
return &pointer; | |
} | |
T * operator->() const { | |
return pointer; | |
} | |
explicit | |
operator bool() const { | |
return pointer != nullptr; | |
} | |
inline void | |
swap(smart_ptr &p) { | |
T *temp = pointer; | |
pointer = p.pointer; | |
p.pointer = temp; | |
} | |
static inline void | |
_retain(T *obj) { | |
obj->retain(); | |
} | |
static inline void | |
_release(T *obj) { | |
obj->release(); | |
} | |
static inline T * | |
_alloc() { | |
return new T; | |
} | |
T *pointer; | |
}; | |
} // namespace os | |
#endif /* _OS_SMART_POINTER_H */ |