ITK
4.1.0
Insight Segmentation and Registration Toolkit
|
00001 /*========================================================================= 00002 * 00003 * Copyright Insight Software Consortium 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0.txt 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 * 00017 *=========================================================================*/ 00018 00019 #ifndef __itkLevelSetEquationTermContainerBase_h 00020 #define __itkLevelSetEquationTermContainerBase_h 00021 00022 #include "itkLevelSetEquationTermBase.h" 00023 #include "itkObject.h" 00024 00025 #include "itksys/hash_map.hxx" 00026 00027 #include <map> 00028 #include <string> 00029 00030 namespace itk 00031 { 00041 template< class TInputImage, 00042 class TLevelSetContainer > 00043 class LevelSetEquationTermContainerBase : public Object 00044 { 00045 public: 00046 typedef LevelSetEquationTermContainerBase Self; 00047 typedef SmartPointer< Self > Pointer; 00048 typedef SmartPointer< const Self > ConstPointer; 00049 typedef Object Superclass; 00050 00052 itkNewMacro( Self ); 00053 00055 itkTypeMacro( LevelSetEquationTermContainerBase, 00056 Object ); 00057 00058 typedef unsigned int TermIdType; 00059 00060 typedef TInputImage InputImageType; 00061 typedef typename InputImageType::Pointer InputImagePointer; 00062 00063 typedef TLevelSetContainer LevelSetContainerType; 00064 typedef typename LevelSetContainerType::Pointer LevelSetContainerPointer; 00065 00066 typedef typename LevelSetContainerType::LevelSetType LevelSetType; 00067 typedef typename LevelSetContainerType::LevelSetPointer LevelSetPointer; 00068 00069 typedef typename LevelSetContainerType::LevelSetIdentifierType 00070 LevelSetIdentifierType; 00071 typedef typename LevelSetContainerType::OutputType LevelSetOutputPixelType; 00072 typedef typename LevelSetContainerType::OutputRealType LevelSetOutputRealType; 00073 typedef typename LevelSetContainerType::LevelSetDataType LevelSetDataType; 00074 typedef typename LevelSetContainerType::InputIndexType LevelSetInputIndexType; 00075 typedef typename LevelSetContainerType::GradientType LevelSetGradientType; 00076 typedef typename LevelSetContainerType::HessianType LevelSetHessianType; 00077 00078 typedef LevelSetEquationTermBase< InputImageType, LevelSetContainerType > 00079 TermType; 00080 typedef typename TermType::Pointer TermPointer; 00081 00083 itkSetObjectMacro( Input, InputImageType ); 00084 itkGetObjectMacro( Input, InputImageType ); 00086 00087 itkSetMacro( CurrentLevelSetId, LevelSetIdentifierType ); 00088 itkGetMacro( CurrentLevelSetId, LevelSetIdentifierType ); 00089 00090 itkSetObjectMacro( LevelSetContainer, LevelSetContainerType ); 00091 itkGetObjectMacro( LevelSetContainer, LevelSetContainerType ); 00092 00094 void PushTerm( TermType* iTerm ); 00095 00097 void AddTerm( const TermIdType& iId, TermType* iTerm ); 00098 00100 TermType* GetTerm( const TermIdType& iId ); 00101 00103 TermType* GetTerm( const std::string& iName ); 00104 00106 void Initialize( const LevelSetInputIndexType& iP ); 00107 00109 void UpdatePixel( const LevelSetInputIndexType& iP, 00110 const LevelSetOutputRealType & oldValue, 00111 const LevelSetOutputRealType & newValue ); 00112 00114 void InitializeParameters(); 00115 00117 LevelSetOutputRealType Evaluate( const LevelSetInputIndexType& iP ); 00118 00119 LevelSetOutputRealType Evaluate( const LevelSetInputIndexType& iP, 00120 const LevelSetDataType& iData ); 00121 00123 void Update(); 00124 00126 LevelSetOutputRealType ComputeCFLContribution() const; 00127 00128 void ComputeRequiredData( const LevelSetInputIndexType& iP, 00129 LevelSetDataType& ioData ); 00130 00131 protected: 00132 00133 typedef std::map< TermIdType, TermPointer > MapTermContainerType; 00134 typedef typename MapTermContainerType::iterator MapTermContainerIteratorType; 00135 typedef typename MapTermContainerType::const_iterator MapTermContainerConstIteratorType; 00136 00137 public: 00138 class Iterator; 00139 friend class Iterator; 00140 00141 class ConstIterator 00142 { 00143 public: 00144 ConstIterator() {} 00145 ConstIterator( const MapTermContainerConstIteratorType& it ) : m_Iterator( it ) {} 00146 ~ConstIterator() {} 00147 ConstIterator( const Iterator& it ) : m_Iterator( it.m_Iterator ) {} 00148 ConstIterator & operator * () { return *this; } 00149 ConstIterator * operator->() { return this; } 00150 ConstIterator & operator++() 00151 { 00152 ++m_Iterator; 00153 return *this; 00154 } 00155 ConstIterator operator++(int) 00156 { 00157 ConstIterator tmp( *this ); 00158 ++(*this); 00159 return tmp; 00160 } 00161 ConstIterator & operator--() 00162 { 00163 --m_Iterator; 00164 return *this; 00165 } 00166 ConstIterator operator--(int) 00167 { 00168 ConstIterator tmp( *this ); 00169 --(*this); 00170 return tmp; 00171 } 00172 bool operator == (const Iterator& it) const 00173 { 00174 return (m_Iterator == it.m_Iterator); 00175 } 00176 bool operator != (const Iterator& it) const 00177 { 00178 return (m_Iterator != it.m_Iterator); 00179 } 00180 bool operator == (const ConstIterator& it) const 00181 { 00182 return (m_Iterator == it.m_Iterator); 00183 } 00184 bool operator != (const ConstIterator& it) const 00185 { 00186 return (m_Iterator != it.m_Iterator); 00187 } 00188 TermIdType GetIdentifier() const 00189 { 00190 return m_Iterator->first; 00191 } 00192 00193 TermType * GetTerm() const 00194 { 00195 return m_Iterator->second; 00196 } 00197 private: 00198 MapTermContainerConstIteratorType m_Iterator; 00199 friend class Iterator; 00200 }; 00201 00202 class Iterator 00203 { 00204 public: 00205 Iterator() {} 00206 Iterator( const MapTermContainerIteratorType& it ) : m_Iterator( it ) {} 00207 Iterator( const ConstIterator& it ) : m_Iterator( it.m_Iterator ) {} 00208 ~Iterator() {} 00209 00210 Iterator & operator * () { return *this; } 00211 Iterator * operator ->() { return this; } 00212 00213 Iterator & operator++() 00214 { 00215 ++m_Iterator; 00216 return *this; 00217 } 00218 Iterator operator++(int) 00219 { 00220 Iterator tmp( *this ); 00221 ++(*this); 00222 return tmp; 00223 } 00224 Iterator & operator--() 00225 { 00226 --m_Iterator; 00227 return *this; 00228 } 00229 Iterator operator--(int) 00230 { 00231 Iterator tmp( *this ); 00232 --(*this); 00233 return tmp; 00234 } 00235 00236 bool operator==(const Iterator& it) const 00237 { 00238 return (m_Iterator==it.m_Iterator); 00239 } 00240 bool operator!=(const Iterator& it) const 00241 { 00242 return (m_Iterator!=it.m_Iterator); 00243 } 00244 bool operator==(const ConstIterator& it)const 00245 { 00246 return (m_Iterator == it.m_Iterator); 00247 } 00248 bool operator!=(const ConstIterator& it)const 00249 { 00250 return (m_Iterator != it.m_Iterator); 00251 } 00252 TermIdType GetIdentifier() const 00253 { 00254 return m_Iterator->first; 00255 } 00256 00257 TermType * GetTerm() const 00258 { 00259 return m_Iterator->second; 00260 } 00261 private: 00262 MapTermContainerIteratorType m_Iterator; 00263 friend class ConstIterator; 00264 }; 00265 00266 Iterator Begin(); 00267 Iterator End(); 00268 00269 ConstIterator Begin() const; 00270 ConstIterator End() const; 00271 00272 protected: 00273 LevelSetEquationTermContainerBase(); 00274 00275 virtual ~LevelSetEquationTermContainerBase(); 00276 00277 LevelSetIdentifierType m_CurrentLevelSetId; 00278 LevelSetContainerPointer m_LevelSetContainer; 00279 00280 InputImagePointer m_Input; 00281 00282 typedef itksys::hash_map< std::string, TermPointer > HashMapStringTermContainerType; 00283 00284 HashMapStringTermContainerType m_NameContainer; 00285 00286 typedef typename TermType::RequiredDataType RequiredDataType; 00287 RequiredDataType m_RequiredData; 00288 00289 MapTermContainerType m_Container; 00290 00291 typedef std::map< TermIdType, LevelSetOutputRealType > MapCFLContainerType; 00292 typedef typename MapCFLContainerType::iterator MapCFLContainerIterator; 00293 typedef typename MapCFLContainerType::const_iterator MapCFLContainerConstIterator; 00294 00295 MapCFLContainerType m_TermContribution; 00296 00297 private: 00298 LevelSetEquationTermContainerBase( const Self& ); 00299 void operator = ( const Self& ); 00300 }; 00301 00302 } 00303 #ifndef ITK_MANUAL_INSTANTIATION 00304 #include "itkLevelSetEquationTermContainerBase.hxx" 00305 #endif 00306 00307 #endif // __itkLevelSetEquationTermContainerBase_h 00308