Phoenix
Object-oriented orthogonally persistent operating system
ptr.h
Go to the documentation of this file.
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_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines