00001 #ifndef _CARRAYSELFDESTROYPOINTER 00002 #define _CARRAYSELFDESTROYPOINTER 00003 #include "../include/uses-declarations.h"/*A pointer which stores along with itself, if it 00004 destroys the element it points to 00005 */ 00006 00007 template<class T> 00008 class CArraySelfDestroyPointer{ 00010 mutable bool mIsSelfDestroyer; 00012 protected: 00013 T* mPointer; 00015 public: 00017 void resetWithoutDeleting(); 00019 inline bool isSelfDestroyer()const; 00021 inline void setIsSelfDestroyer(bool inisSelfDestroyer=true)const; 00023 void unsetIsSelfDestroyer()const; 00025 T* operator= (T* inPointer); 00027 T& operator*(); 00029 T const& operator*()const; 00031 T* operator -> (); 00033 T const* operator -> ()const; 00035 ~CArraySelfDestroyPointer(); 00037 CArraySelfDestroyPointer(T*, 00038 bool = true); 00040 CArraySelfDestroyPointer(const CArraySelfDestroyPointer<T>& 00041 inSelfDestroyPointer); 00043 CArraySelfDestroyPointer(); 00045 operator bool()const; 00047 operator T*()const; 00048 }; 00049 00050 00052 template<class T> 00053 void CArraySelfDestroyPointer<T>::resetWithoutDeleting(){ 00054 mPointer=0; 00055 } 00056 00057 template<class T> 00058 T* CArraySelfDestroyPointer<T>::operator=(T* inPointer){ 00059 00060 if(mIsSelfDestroyer){ 00061 delete[] mPointer; 00062 } 00063 return mPointer=inPointer; 00064 } 00065 00066 template<class T> 00067 T const& CArraySelfDestroyPointer<T>::operator *()const{ 00068 return *mPointer; 00069 } 00070 00071 template<class T> 00072 T const* CArraySelfDestroyPointer<T>::operator ->()const{ 00073 return mPointer; 00074 } 00075 00076 template<class T> 00077 T& CArraySelfDestroyPointer<T>::operator *(){ 00078 return *mPointer; 00079 } 00080 00081 template<class T> 00082 T* CArraySelfDestroyPointer<T>::operator ->(){ 00083 return mPointer; 00084 } 00085 00086 template<class T> 00087 CArraySelfDestroyPointer<T>::CArraySelfDestroyPointer(T* inPointer, 00088 bool inIsSelfDestroyer): 00089 mPointer(inPointer), 00090 mIsSelfDestroyer(inIsSelfDestroyer) 00091 { 00092 } 00094 template<class T> 00095 CArraySelfDestroyPointer<T>::CArraySelfDestroyPointer(const CArraySelfDestroyPointer<T>& in): 00096 mPointer(in.mPointer), 00097 mIsSelfDestroyer(in.mIsSelfDestroyer) 00098 { 00099 }; 00100 00101 template<class T> 00102 CArraySelfDestroyPointer<T>::CArraySelfDestroyPointer(): 00103 mPointer(0), 00104 mIsSelfDestroyer(true) 00105 { 00106 } 00107 00108 template<class T> 00109 CArraySelfDestroyPointer<T>::~CArraySelfDestroyPointer() 00110 { 00111 if(mIsSelfDestroyer){ 00112 00113 delete[] mPointer; 00114 } 00115 } 00116 00117 00118 template<class T> 00119 void CArraySelfDestroyPointer<T>::setIsSelfDestroyer(bool inIsSelfDestroyer)const{ 00120 mIsSelfDestroyer= inIsSelfDestroyer; 00121 }; 00122 00123 template<class T> 00124 bool CArraySelfDestroyPointer<T>::isSelfDestroyer()const{ 00125 return mIsSelfDestroyer; 00126 }; 00127 00128 template<class T> 00129 void CArraySelfDestroyPointer<T>::unsetIsSelfDestroyer()const{ 00130 mIsSelfDestroyer=0; 00131 }; 00132 00133 template<class T> 00134 CArraySelfDestroyPointer<T>::operator bool()const{ 00135 return mPointer; 00136 }; 00137 00138 template<class T> 00139 CArraySelfDestroyPointer<T>::operator T*()const{ 00140 return mPointer; 00141 }; 00142 #endif
1.5.6