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 #ifndef __itkVectorContainerToListSampleAdaptor_h 00019 #define __itkVectorContainerToListSampleAdaptor_h 00020 00021 #include <typeinfo> 00022 00023 #include "itkListSample.h" 00024 #include "itkSmartPointer.h" 00025 #include "itkVectorContainer.h" 00026 00027 namespace itk 00028 { 00029 namespace Statistics 00030 { 00045 template< class TVectorContainer > 00046 class ITK_EXPORT VectorContainerToListSampleAdaptor: 00047 public ListSample< typename TVectorContainer::Element > 00048 { 00049 public: 00051 typedef VectorContainerToListSampleAdaptor Self; 00052 typedef ListSample<typename TVectorContainer::Element> Superclass; 00053 typedef SmartPointer< Self > Pointer; 00054 typedef SmartPointer< const Self > ConstPointer; 00055 00057 itkTypeMacro( VectorContainerToListSampleAdaptor, ListSample ); 00058 00060 itkNewMacro( Self ); 00061 00063 itkStaticConstMacro( MeasurementVectorSize, unsigned int, 00064 TVectorContainer::Element::Dimension ); 00065 00067 typedef TVectorContainer VectorContainerType; 00068 typedef typename TVectorContainer::Pointer VectorContainerPointer; 00069 typedef typename TVectorContainer::ConstPointer VectorContainerConstPointer; 00070 typedef typename TVectorContainer::Iterator VectorContainerIterator; 00071 typedef typename TVectorContainer::ConstIterator VectorContainerConstIterator; 00072 00075 typedef typename Superclass::MeasurementType MeasurementType; 00076 typedef typename Superclass::MeasurementVectorType MeasurementVectorType; 00077 typedef typename Superclass::AbsoluteFrequencyType AbsoluteFrequencyType; 00078 typedef typename Superclass::TotalAbsoluteFrequencyType TotalAbsoluteFrequencyType; 00079 typedef typename Superclass::MeasurementVectorSizeType MeasurementVectorSizeType; 00080 typedef typename Superclass::InstanceIdentifier InstanceIdentifier; 00081 00082 typedef MeasurementVectorType ValueType; 00083 00085 itkSetObjectMacro( VectorContainer, VectorContainerType ); 00086 00088 itkGetConstObjectMacro( VectorContainer, VectorContainerType ); 00089 00091 InstanceIdentifier Size() const; 00092 00095 const MeasurementVectorType & GetMeasurementVector( InstanceIdentifier ) const; 00096 00098 AbsoluteFrequencyType GetFrequency( InstanceIdentifier ) const; 00099 00101 TotalAbsoluteFrequencyType GetTotalFrequency() const; 00102 00106 class ConstIterator 00107 { 00108 friend class VectorContainerToListSampleAdaptor; 00109 public: 00110 00111 ConstIterator(const VectorContainerToListSampleAdaptor *adaptor) 00112 { 00113 *this = adaptor->Begin(); 00114 } 00115 00116 ConstIterator(const ConstIterator & iter) 00117 { 00118 this->m_Iter = iter.m_Iter; 00119 this->m_InstanceIdentifier = iter.m_InstanceIdentifier; 00120 } 00121 00122 ConstIterator & operator=(const ConstIterator & iter) 00123 { 00124 this->m_Iter = iter.m_Iter; 00125 this->m_InstanceIdentifier = iter.m_InstanceIdentifier; 00126 return *this; 00127 } 00128 00129 AbsoluteFrequencyType GetFrequency() const 00130 { 00131 return 1; 00132 } 00133 00134 const MeasurementVectorType & GetMeasurementVector() const 00135 { 00136 return ( const MeasurementVectorType & )m_Iter.Value(); 00137 } 00138 00139 InstanceIdentifier GetInstanceIdentifier() const 00140 { 00141 return this->m_InstanceIdentifier; 00142 } 00143 00144 ConstIterator & operator++() 00145 { 00146 ++m_Iter; 00147 ++m_InstanceIdentifier; 00148 return *this; 00149 } 00150 00151 bool operator!=( const ConstIterator & it ) 00152 { 00153 return ( this->m_Iter != it.m_Iter ); 00154 } 00155 00156 bool operator==( const ConstIterator & it ) 00157 { 00158 return ( this->m_Iter == it.m_Iter ); 00159 } 00160 00161 protected: 00162 // This method should only be available to the ListSample class 00163 ConstIterator( VectorContainerConstIterator iter, 00164 InstanceIdentifier iid ) 00165 { 00166 this->m_Iter = iter; 00167 this->m_InstanceIdentifier = iid; 00168 } 00169 00170 // This method is purposely not implemented 00171 ConstIterator(); 00172 private: 00173 VectorContainerConstIterator m_Iter; 00174 InstanceIdentifier m_InstanceIdentifier; 00175 }; 00176 00180 class Iterator:public ConstIterator 00181 { 00182 friend class VectorContainerToListSampleAdaptor; 00183 public: 00184 00185 Iterator(Self *adaptor):ConstIterator(adaptor) 00186 {} 00187 00188 Iterator(const Iterator & iter):ConstIterator(iter) 00189 {} 00190 00191 Iterator & operator=(const Iterator & iter) 00192 { 00193 this->ConstIterator::operator=(iter); 00194 return *this; 00195 } 00196 00197 protected: 00198 // To ensure const-correctness these method must not be in the public API. 00199 // The are purposly not implemented, since they should never be called. 00200 Iterator(); 00201 Iterator( const Self *adaptor ); 00202 Iterator( VectorContainerConstIterator iter, InstanceIdentifier iid ); 00203 Iterator( const ConstIterator & it); 00204 ConstIterator & operator=( const ConstIterator & it ); 00205 00206 Iterator( VectorContainerIterator iter, InstanceIdentifier iid ) 00207 :ConstIterator( iter, iid ) 00208 {} 00209 00210 private: 00211 }; 00212 00214 Iterator Begin() 00215 { 00216 VectorContainerPointer nonConstVectorDataContainer = 00217 const_cast< VectorContainerType * >( this->m_VectorContainer.GetPointer() ); 00218 Iterator iter( nonConstVectorDataContainer->Begin(), 0 ); 00220 00221 return iter; 00222 } 00223 00225 Iterator End() 00226 { 00227 VectorContainerPointer nonConstVectorDataContainer = 00228 const_cast<VectorContainerType *>( this->m_VectorContainer.GetPointer() ); 00229 00230 Iterator iter( nonConstVectorDataContainer->End(), 00231 this->m_VectorContainer->Size() ); 00232 00233 return iter; 00234 } 00235 00237 ConstIterator Begin() const 00238 { 00239 ConstIterator iter( this->m_VectorContainer->Begin(), 0 ); 00240 00241 return iter; 00242 } 00243 00245 ConstIterator End() const 00246 { 00247 ConstIterator iter( this->m_VectorContainer->End(), 00248 this->m_VectorContainer->Size() ); 00249 return iter; 00250 } 00252 00253 protected: 00254 VectorContainerToListSampleAdaptor(); 00255 00256 virtual ~VectorContainerToListSampleAdaptor() {} 00257 void PrintSelf( std::ostream & os, Indent indent ) const; 00258 00259 private: 00260 VectorContainerToListSampleAdaptor( const Self & ); //purposely not implemented 00261 void operator=( const Self & ); //purposely not implemented 00262 00265 VectorContainerConstPointer m_VectorContainer; 00266 00268 mutable typename VectorContainerType::Element m_TempPoint; 00269 }; // end of class VectorContainerToListSampleAdaptor 00270 } // end of namespace Statistics 00271 } // end of namespace itk 00272 00273 #ifndef ITK_MANUAL_INSTANTIATION 00274 #include "itkVectorContainerToListSampleAdaptor.hxx" 00275 #endif 00276 00277 #endif 00278