00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __smartpointer__
00026 #define __smartpointer__
00027
00028 #include <cassert>
00029 #include "exports.h"
00030
00038 class EXP smartable {
00039 private:
00040 unsigned refCount;
00041 public:
00043 unsigned refs() const { return refCount; }
00045 void addReference() { refCount++; assert(refCount != 0); }
00047 void removeReference();
00048
00049 protected:
00050 smartable() : refCount(0) {}
00051 smartable(const smartable&): refCount(0) {}
00053 virtual ~smartable() { assert (refCount == 0); }
00054 smartable& operator=(const smartable&) { return *this; }
00055 };
00056
00067 template<class T> class EXP SMARTP {
00068 private:
00070 T* fSmartPtr;
00071
00072 public:
00074 SMARTP() : fSmartPtr(0) {}
00076 SMARTP(T* rawptr) : fSmartPtr(rawptr) { if (fSmartPtr) fSmartPtr->addReference(); }
00078 template<class T2>
00079 SMARTP(const SMARTP<T2>& ptr) : fSmartPtr((T*)ptr) { if (fSmartPtr) fSmartPtr->addReference(); }
00081 SMARTP(const SMARTP& ptr) : fSmartPtr((T*)ptr) { if (fSmartPtr) fSmartPtr->addReference(); }
00082
00084 ~SMARTP() { if (fSmartPtr) fSmartPtr->removeReference(); }
00085
00087 operator T*() const { return fSmartPtr; }
00088
00090 T& operator*() const {
00091
00092 assert (fSmartPtr != 0);
00093 return *fSmartPtr;
00094 }
00095
00097 T* operator->() const {
00098
00099 assert (fSmartPtr != 0);
00100 return fSmartPtr;
00101 }
00102
00104 template <class T2>
00105 SMARTP& operator=(T2 p1_) { *this=(T*)p1_; return *this; }
00106
00108 SMARTP& operator=(T* p_) {
00109
00110 if (fSmartPtr != p_) {
00111
00112 if (p_ != 0) p_->addReference();
00113
00114 if (fSmartPtr != 0) fSmartPtr->removeReference();
00115
00116 fSmartPtr = p_;
00117 }
00118 return *this;
00119 }
00121 SMARTP& operator=(const SMARTP<T>& p_) { return operator=((T *) p_); }
00123 template<class T2> SMARTP& cast(T2* p_) { return operator=(dynamic_cast<T*>(p_)); }
00125 template<class T2> SMARTP& cast(const SMARTP<T2>& p_) { return operator=(dynamic_cast<T*>(p_)); }
00126 };
00127
00128
00129 #endif