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_