00001 #ifndef _REF_COUNT_H_ 00002 #define _REF_COUNT_H_ 00003 00004 class GRefCount 00005 { 00006 int _Count; 00007 00008 public: 00009 GRefCount() 00010 { 00011 _Count = 0; 00012 } 00013 00014 virtual ~GRefCount() 00015 { 00016 LgiAssert(_Count == 0); 00017 } 00018 00019 void AddRef() 00020 { 00021 _Count++; 00022 } 00023 00024 bool DelRef() 00025 { 00026 if (--_Count == 0) 00027 { 00028 delete this; 00029 return true; 00030 } 00031 return false; 00032 } 00033 }; 00034 00035 template <typename T> 00036 class GAutoRefPtr 00037 { 00038 T *Ptr; 00039 00040 public: 00041 GAutoRefPtr(T *ptr = 0) 00042 { 00043 Ptr = ptr; 00044 if (Ptr) 00045 Ptr->AddRef(); 00046 } 00047 00048 ~GAutoRefPtr() 00049 { 00050 Empty(); 00051 } 00052 00053 operator T*() 00054 { 00055 return Ptr; 00056 } 00057 00058 T *operator->() const 00059 { 00060 LgiAssert(Ptr); 00061 return Ptr; 00062 } 00063 00064 void Empty() 00065 { 00066 if (Ptr) 00067 { 00068 Ptr->DelRef(); 00069 Ptr = 0; 00070 } 00071 } 00072 00073 GAutoRefPtr<T> &operator =(T *p) 00074 { 00075 Empty(); 00076 Ptr = p; 00077 if (Ptr) 00078 Ptr->AddRef(); 00079 return *this; 00080 } 00081 00082 GAutoRefPtr &operator =(const GAutoRefPtr<T> &refptr) 00083 { 00084 Empty(); 00085 Ptr = refptr.Ptr; 00086 if (Ptr) 00087 Ptr->AddRef(); 00088 return *this; 00089 } 00090 00091 }; 00092 00093 #endif