1 #ifndef _OS_SMART_POINTER_H
2 #define _OS_SMART_POINTER_H
3 
4 #include "os_object_base.h"
5 
6 namespace os {
7 
8 template<class T>
9 struct smart_ptr {
smart_ptrsmart_ptr10   smart_ptr() : pointer(nullptr) {}
11 
smart_ptrsmart_ptr12   explicit smart_ptr(T *&p) : pointer(p) {
13     if (pointer) {
14       _retain(pointer);
15     }
16   }
17 
smart_ptrsmart_ptr18   smart_ptr(smart_ptr const &rhs) : pointer(rhs.pointer) {
19     if (pointer) {
20       _retain(pointer);
21     }
22   }
23 
24   smart_ptr & operator=(T *&rhs) {
25     smart_ptr(rhs).swap(*this);
26     return *this;
27   }
28 
29   smart_ptr & operator=(smart_ptr &rhs) {
30     smart_ptr(rhs).swap(*this);
31     return *this;
32   }
33 
~smart_ptrsmart_ptr34   ~smart_ptr() {
35     if (pointer) {
36       _release(pointer);
37     }
38   }
39 
resetsmart_ptr40   void reset() {
41     smart_ptr().swap(*this);
42   }
43 
getsmart_ptr44   T *get() const {
45     return pointer;
46   }
47 
get_for_out_paramsmart_ptr48   T ** get_for_out_param() {
49     reset();
50     return &pointer;
51   }
52 
53   T * operator->() const {
54     return pointer;
55   }
56 
57   explicit
58   operator bool() const {
59     return pointer != nullptr;
60   }
61 
62   inline void
swapsmart_ptr63   swap(smart_ptr &p) {
64     T *temp = pointer;
65     pointer = p.pointer;
66     p.pointer = temp;
67   }
68 
69   static inline void
_retainsmart_ptr70   _retain(T *obj) {
71     obj->retain();
72   }
73 
74   static inline void
_releasesmart_ptr75   _release(T *obj) {
76     obj->release();
77   }
78 
79   static inline T *
_allocsmart_ptr80   _alloc() {
81     return new T;
82   }
83 
84   T *pointer;
85 };
86 } // namespace os
87 
88 #endif /* _OS_SMART_POINTER_H */
89