Phoenix
Object-oriented orthogonally persistent operating system
|
00001 /* 00002 * /phoenix/include/triton/ptr.h 00003 * 00004 * This file is a part of Phoenix operating system. 00005 * Copyright (c) 2011-2012, Artyom Lebedev <artyom.lebedev@gmail.com> 00006 * All rights reserved. 00007 * See COPYING file for copyright details. 00008 */ 00009 00014 #ifndef PTR_H_ 00015 #define PTR_H_ 00016 00017 namespace triton { 00018 00022 template <class T> 00023 class Ptr { 00024 private: 00026 T *_obj; 00030 bool _canDelete; 00031 00033 inline void 00034 _ReleaseObj() 00035 { 00036 if (_obj && !_obj->Release() && _canDelete) { 00037 delete _obj; 00038 } 00039 _obj = nullptr; 00040 } 00041 public: 00042 00044 inline 00045 Ptr() { 00046 _obj = nullptr; 00047 } 00048 00054 inline 00055 Ptr(T *objPtr) { 00056 if (objPtr) { 00057 objPtr->AddRef(); 00058 } 00059 _obj = objPtr; 00060 _canDelete = true; 00061 } 00062 00069 inline 00070 Ptr(T &obj) { 00071 obj.AddRef(); 00072 _obj = &obj; 00073 _canDelete = false; 00074 } 00075 00080 inline 00081 Ptr(Ptr<T> &ptr) { 00082 if (ptr._obj) { 00083 ptr._obj->AddRef(); 00084 _obj = ptr._obj; 00085 _canDelete = ptr._canDelete; 00086 } else { 00087 _obj = nullptr; 00088 } 00089 } 00090 00095 inline 00096 Ptr(Ptr<T> &&ptr) { 00097 _obj = ptr._obj; 00098 _canDelete = ptr._canDelete; 00099 ptr._obj = nullptr; 00100 } 00101 00105 inline 00106 ~Ptr() { 00107 _ReleaseObj(); 00108 } 00109 00115 inline Ptr<T> & 00116 operator =(Ptr<T> &ptr) 00117 { 00118 _ReleaseObj(); 00119 if (ptr._obj) { 00120 ptr._obj->AddRef(); 00121 _obj = ptr._obj; 00122 _canDelete = ptr._canDelete; 00123 } else { 00124 _obj = nullptr; 00125 } 00126 return *this; 00127 } 00128 00134 inline Ptr<T> & 00135 operator =(Ptr<T> &&ptr) 00136 { 00137 _ReleaseObj(); 00138 _obj = ptr._obj; 00139 _canDelete = ptr._canDelete; 00140 ptr._obj = nullptr; 00141 return *this; 00142 } 00143 00145 inline Ptr<T> & 00146 operator =(T *objPtr) 00147 { 00148 _ReleaseObj(); 00149 if (objPtr) { 00150 objPtr->AddRef(); 00151 } 00152 _obj = objPtr; 00153 _canDelete = true; 00154 return *this; 00155 } 00156 00158 inline Ptr<T> & 00159 operator =(T &obj) 00160 { 00161 _ReleaseObj(); 00162 obj.AddRef(); 00163 _obj = &obj; 00164 _canDelete = false; 00165 return *this; 00166 } 00167 00172 inline bool 00173 operator ==(const Ptr<T> &ptr) const 00174 { 00175 return _obj == ptr._obj; 00176 } 00177 00182 inline bool 00183 operator !=(const Ptr<T> &ptr) const 00184 { 00185 return _obj != ptr._obj; 00186 } 00187 00189 inline 00190 operator bool() const 00191 { 00192 return _obj != nullptr; 00193 } 00194 00200 inline T & 00201 operator *() const 00202 { 00203 if (UNLIKELY(!_obj)) { 00204 throw NullPtrError(); 00205 } 00206 return *_obj; 00207 } 00208 00214 inline T * 00215 operator ->() const 00216 { 00217 if (UNLIKELY(!_obj)) { 00218 throw NullPtrError(); 00219 } 00220 return _obj; 00221 } 00222 }; 00223 00224 template <class T> 00225 inline size_t 00226 len(Ptr<T> &objPtr) 00227 { 00228 return objPtr->__len__(); 00229 } 00230 00231 template <class T> 00232 inline size_t 00233 len(Ptr<T> &&objPtr) 00234 { 00235 return objPtr->__len__(); 00236 } 00237 00238 template <class T> 00239 inline Object::hash_t 00240 hash(Ptr<T> &objPtr) 00241 { 00242 return objPtr->__hash__(); 00243 } 00244 00245 template <class T> 00246 inline Object::hash_t 00247 hash(Ptr<T> &&objPtr) 00248 { 00249 return objPtr->__hash__(); 00250 } 00251 00252 } /* namespace triton */ 00253 00254 #endif /* PTR_H_ */