#ifndef _OS_SMART_POINTER_H #define _OS_SMART_POINTER_H #include "os_object_base.h" namespace os { template 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 */