cmtkSmartPtr.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 1997-2009 Torsten Rohlfing
00004 //
00005 //  Copyright 2004-2010 SRI International
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2523 $
00026 //
00027 //  $LastChangedDate: 2010-11-01 15:41:02 -0700 (Mon, 01 Nov 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #ifndef __cmtkSmartPtr_h_included_
00034 #define __cmtkSmartPtr_h_included_
00035 
00036 #include <cmtkconfig.h>
00037 
00038 #ifndef NULL
00039 #  define NULL 0
00040 #endif
00041 
00042 #include <algorithm>
00043 #include <cassert>
00044 
00045 #include <System/cmtkSmartConstPtr.h>
00046 
00047 namespace
00048 cmtk
00049 {
00050 
00053 
00056 template<class T>
00057 class SmartPointer :
00059   public SmartConstPointer<T>
00060 {
00061 public:
00063   typedef SmartPointer<T> Self;
00064 
00066   typedef SmartConstPointer<T> Superclass;
00067 
00069   using Superclass::operator*;
00070   using Superclass::operator->;
00071   using Superclass::ReleasePtr;
00072 
00074   typedef T* PointerType;
00075 
00077   static Self Null;
00078   
00081   SmartPointer() {}
00082   
00087   explicit SmartPointer( T *const object ) : SmartConstPointer<T>( object ) {}
00088 
00091   template<class T2>
00092   SmartPointer( const SmartPointer<T2>& ptr ) : SmartConstPointer<T>( ptr ) {}
00093   
00096   SmartPointer( const Self& ptr ) : SmartConstPointer<T>( ptr ) {}
00097   
00099   T& operator*() { return *this->m_Object.ptr; }
00100 
00102   T* operator->() { return this->m_Object.ptr; }
00103 
00105   T* GetPtr() const { return this->m_Object.ptr; }
00106 
00110   T* ReleasePtr() 
00111   { 
00112     T* object = this->m_Object.ptr; 
00113     this->m_Object.ptr = NULL; 
00114     return object; 
00115   }
00116 
00118   template<class T2> 
00119   static Self DynamicCastFrom( const T2& from_P )
00120   {
00121     return Self( dynamic_cast<typename Self::PointerType>( from_P.GetPtr() ), from_P.m_ReferenceCount );
00122   }
00123 
00124 private:
00128   SmartPointer( T *const object, SafeCounter *const counter ) : Superclass( object, counter ) {}
00129   
00131   template<class T2> friend class SmartPointer;
00132 };
00133 
00134 template<typename T> SmartPointer<T> SmartPointer<T>::Null;
00135 
00137 
00138 } // namespace cmtk
00139 
00140 #endif // define __cmtkSmartPtr_h_included_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines