00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef zz_handle_h
00010 #define zz_handle_h
00011
00012 #include <zz_use_counter.h>
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 template< class T > class CzzHandle
00033 {
00034 public:
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 CzzHandle( T* obj,
00059 bool vector
00060 )
00061 : m_Object( obj ), m_Counter( new CzzUseCounter() ),
00062 m_Vector( vector )
00063 {
00064 m_Counter->addRef();
00065 };
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 CzzHandle( void )
00076 : m_Object( 0 ), m_Counter( 0 ), m_Vector( false )
00077 {
00078
00079 };
00080
00081
00082
00083
00084
00085
00086
00087
00088 CzzHandle( const CzzHandle& handle
00089 )
00090 : m_Object( handle.m_Object ), m_Counter( handle.m_Counter ),
00091 m_Vector( handle.m_Vector )
00092 {
00093 m_Counter->addRef();
00094 };
00095
00096
00097
00098
00099
00100
00101
00102
00103 CzzHandle( T* handle
00104 )
00105 : m_Object( handle ), m_Counter( new CzzUseCounter() ),
00106 m_Vector( false )
00107 {
00108 m_Counter->addRef();
00109 };
00110
00111
00112 virtual ~CzzHandle()
00113 {
00114 if( m_Counter && m_Counter->release() == 0 )
00115 {
00116 if( m_Vector )
00117 delete [] m_Object;
00118 else
00119 delete m_Object;
00120
00121 delete m_Counter;
00122 }
00123 };
00124
00125
00126
00127 T* operator->()
00128 {
00129 return m_Object;
00130 };
00131
00132
00133
00134 operator T*( void )
00135 {
00136 return m_Object;
00137 };
00138
00139
00140
00141 T* object( void )
00142 {
00143 return m_Object;
00144 };
00145
00146
00147 T value( void )
00148 {
00149 return *m_Object;
00150 };
00151
00152
00153 T& ref( void )
00154 {
00155 return *m_Object;
00156 };
00157
00158
00159 const CzzHandle& operator=( const CzzHandle& handle )
00160 {
00161 m_Object = handle.m_Object;
00162 m_Counter = handle.m_Counter;
00163 m_Vector = handle.m_Vector;
00164 m_Counter->addRef();
00165 return *this;
00166 };
00167
00168 protected:
00169
00170
00171 CzzUseCounter* m_Counter;
00172
00173
00174 T* m_Object;
00175
00176
00177 bool m_Vector;
00178
00179 private:
00180
00181
00182 void* operator new( size_t n ) { return 0; };
00183
00184
00185 void* operator new[]( size_t n ) { return 0; };
00186
00187
00188 void operator delete( void*, size_t n ) { };
00189
00190
00191 void operator delete[]( void*, size_t n ) { };
00192 };
00193
00194 #endif // zz_handle_h
00195
00196
00197