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