00001 #ifndef CAFE_PTR_HPP 00002 #define CAFE_PTR_HPP 00003 00004 namespace cafe { 00005 00006 // 00007 // template smart pointer for intrusive reference counted objects 00008 // using TRefCount. 00009 // 00010 template<class T> 00011 class Ptr { 00012 public: 00013 Ptr(T *p) 00014 : fRef(p) 00015 { 00016 if(fRef) fRef->AddReference(); 00017 } 00018 00019 template<class Y> 00020 Ptr(Y *p) 00021 : fRef(p) 00022 { 00023 if(fRef) fRef->AddReference(); 00024 } 00025 00026 ~Ptr() 00027 { 00028 decrement(); 00029 } 00030 00031 Ptr(const Ptr<T>& other) 00032 { 00033 if(fRef = other.fRef) { 00034 fRef->AddReference(); 00035 } 00036 } 00037 00038 template<class Y> 00039 Ptr(const Ptr<Y>& other) 00040 { 00041 if(fRef = other.fRef) { 00042 fRef->AddReference(); 00043 } 00044 } 00045 00046 Ptr<T>& operator=(const Ptr<T>& other) 00047 { 00048 if(this != &other) { 00049 decrement(); 00050 if((fRef = other.fRef) != 0) { 00051 fRef->AddReference(); 00052 } 00053 } 00054 return *this; 00055 } 00056 00057 template<class Y> 00058 Ptr<T>& operator=(const Ptr<Y>& other) 00059 { 00060 if(this != &other) { 00061 decrement(); 00062 if(fRef = other.fRef) { 00063 fRef->AddReference(); 00064 } 00065 } 00066 return *this; 00067 } 00068 00069 template<class Y> 00070 void reset(Y *p) 00071 { 00072 decrement(); 00073 if(fRef = p) 00074 fRef->AddReference(); 00075 } 00076 00077 T *operator->() { return fRef; } 00078 T& operator*() { return *fRef; } 00079 const T& operator*() const { return *fRef; } 00080 T *get() { return fRef; } 00081 private: 00082 void decrement() 00083 { 00084 if(fRef && fRef->RemoveReference() == 0) { 00085 delete fRef; 00086 } 00087 } 00088 T *fRef; 00089 }; 00090 00091 } 00092 00093 #endif // CAFE_PTR_HPP
1.3.4