base/zz_handle.h

Go to the documentation of this file.
00001 /* libzz
00002  *
00003  * This program is distributed under the GNU General Public License, version 2.
00004  * A copy of this license is included with this source.
00005  *
00006  * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
00007 */
00008 
00009 #ifndef zz_handle_h
00010 #define zz_handle_h
00011 
00012 #include <zz_use_counter.h>
00013 
00014 /*
00015     Description:
00016     Template klass för objekt som allokeras på heapen
00017     Frigör automatiskt minnet när variabeln går ur scope
00018     
00019     Remarks:
00020     Tillåter inte att allokera sig själv på heapen, skall alltid
00021     värdekopieras
00022 
00023     Author:  
00024     Toni Thomsson, toni@tonjac.org
00025 
00026     Library:
00027     libzz.a (HPUX) libzz.lib (win32)
00028 
00029     Platform:
00030         HPUX, win32
00031 */
00032 template< class T > class CzzHandle
00033 {
00034 public:
00035 
00036     /*
00037         Description: 
00038         Skapar ett handle objekt
00039 
00040         Remarks:
00041         Skapar ett handle objekt som kapslar in ett objekt
00042         som allokerats på heapen
00043 
00044         Example:
00045         CzzHandle<CxxObject> handle( new CxxObject[ 10 ], true );
00046         CzzHandle<CxxFoo> foo = new CxxFoo( 1, "kalle" );
00047         CzzHandle<CxxObject> tmp;
00048 
00049         tmp = handle;
00050         tmp->callMethod( foo );
00051 
00052         doSomething( tmp );
00053 
00054         // Vi behöver inte frigöra minnet, det sköts automatiskt
00055         // när variablerna går ur scope
00056 
00057     */
00058     CzzHandle( T* obj,      // IN, pekare till objekt
00059                 bool vector // IN, vektor eller ej
00060                 ) 
00061      : m_Object( obj ), m_Counter( new CzzUseCounter() ), 
00062        m_Vector( vector ) 
00063     { 
00064         m_Counter->addRef(); 
00065     };
00066 
00067 
00068     /*
00069         Description: 
00070         Skapar ett handle objekt
00071 
00072         Remarks:
00073         Skapar ett "tomt" objekt, att användas tex. som tmp-variabel
00074     */
00075     CzzHandle( void )
00076      : m_Object( 0 ), m_Counter( 0 ), m_Vector( false ) 
00077     { 
00078 
00079     };
00080 
00081     /*
00082         Description: 
00083         Skapar ett handle objekt
00084 
00085         Remarks:
00086         Kopieringskonstruktor
00087     */
00088     CzzHandle( const CzzHandle& handle  // IN, objekt som skall kopieras
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         Description: 
00098         Skapar ett handle objekt
00099 
00100         Remarks:
00101         Initierar handle från en pekare
00102     */
00103     CzzHandle( T* handle  // IN, pekare som skall hanteras
00104                 )
00105      : m_Object( handle ), m_Counter( new CzzUseCounter() ), 
00106        m_Vector( false ) 
00107     { 
00108         m_Counter->addRef(); 
00109     };
00110 
00111     // Description: Frigör kapslat objekt om antalet referenser är noll
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     // Description: Pekare till kapslat objekt
00126     // Remarks: samma som object()
00127     T* operator->()
00128     { 
00129         return m_Object; 
00130     };
00131 
00132     // Description: Pekare till kapslat objekt
00133     // Remarks: samma som operator-> och object()
00134     operator T*( void )
00135     {
00136         return m_Object;
00137     };
00138 
00139     // Description: Pekare till kapslat objekt
00140     // Remarks: samma som operator->
00141     T* object( void )
00142     {
00143         return m_Object;
00144     };
00145 
00146     // Description: Värdet av kapslat objekt
00147     T value( void )
00148     { 
00149         return *m_Object; 
00150     };
00151 
00152     // Description: Referens till kapslat objekt
00153     T& ref( void )
00154     { 
00155         return *m_Object; 
00156     };
00157 
00158     // Description: Tilldelningsoperator
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     // Description: Referensräknare
00171     CzzUseCounter* m_Counter;
00172     
00173     // Description: Kapslat objekt
00174     T* m_Object;
00175 
00176     // Description: Vektor eller ej ?
00177     bool m_Vector;
00178 
00179 private:
00180     
00181     // Description: ej tillåtet
00182     void* operator new( size_t n ) { return 0; };
00183 
00184     // Description: ej tillåtet
00185         void* operator new[]( size_t n ) { return 0; };
00186 
00187     // Description: ej tillåtet
00188     void operator delete( void*, size_t n ) { };
00189 
00190     // Description: ej tillåtet
00191     void operator delete[]( void*, size_t n ) { };
00192 };
00193 
00194 #endif // zz_handle_h
00195 
00196 
00197 

Generated on Thu Sep 21 21:45:41 2006 for tonjac.org MINI/C++ library by  doxygen 1.4.6-NO