00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkListSample_h
00018 #define __itkListSample_h
00019
00020 #include "itkObjectFactory.h"
00021 #include "itkMacro.h"
00022 #include "itkListSampleBase.h"
00023 #include "itkFixedArray.h"
00024 #include "itkSmartPointer.h"
00025
00026 #include <vector>
00027
00028 namespace itk{
00029 namespace Statistics{
00030
00041 template< class TMeasurementVector >
00042 class ITK_EXPORT ListSample : public ListSampleBase< TMeasurementVector >
00043 {
00044 public:
00046 typedef ListSample Self;
00047 typedef ListSampleBase< TMeasurementVector > Superclass;
00048 typedef SmartPointer< Self > Pointer;
00049 typedef SmartPointer<const Self> ConstPointer;
00050
00052 itkTypeMacro(ListSample, ListSampleBase);
00053
00055 itkNewMacro(Self) ;
00056
00061 typedef typename Superclass::MeasurementVectorType MeasurementVectorType;
00062 typedef typename Superclass::MeasurementType MeasurementType;
00063 typedef typename Superclass::FrequencyType FrequencyType ;
00064 typedef typename Superclass::InstanceIdentifier InstanceIdentifier;
00065 typedef typename Superclass::SearchResultVectorType SearchResultVectorType ;
00066
00067 typedef MeasurementVectorType ValueType ;
00068
00070 itkStaticConstMacro(MeasurementVectorSize, unsigned int,
00071 Superclass::MeasurementVectorSize);
00072
00074 typedef std::vector< MeasurementVectorType > InternalDataContainerType ;
00075
00080 void Resize( unsigned int n )
00081 { m_InternalContainer.resize(n) ; }
00082
00084 void Clear()
00085 { m_InternalContainer.clear() ; }
00086
00088 void PushBack( MeasurementVectorType mv )
00089 { m_InternalContainer.push_back( mv ) ; }
00090
00092 unsigned int Size() const
00093 { return static_cast<unsigned int>( m_InternalContainer.size() ); }
00094
00097 const MeasurementVectorType & GetMeasurementVector(const InstanceIdentifier &id) const;
00098
00101 void SetMeasurement(const InstanceIdentifier &id,
00102 const unsigned int &dim,
00103 const MeasurementType &value) ;
00104
00107 void SetMeasurementVector(const InstanceIdentifier &id,
00108 const MeasurementVectorType &mv) ;
00109
00111 FrequencyType GetFrequency(const InstanceIdentifier &id) const ;
00112
00114 FrequencyType GetTotalFrequency() const
00115 { return static_cast<FrequencyType>( m_InternalContainer.size() ); }
00116
00117
00118
00119 class Iterator
00120 {
00121 public:
00122
00123 Iterator(){}
00124
00125 Iterator(typename InternalDataContainerType::iterator iter,
00126 InstanceIdentifier iid)
00127 :m_Iter(iter), m_InstanceIdentifier(iid)
00128 {}
00129
00130 FrequencyType GetFrequency() const
00131 { return 1 ;}
00132
00133 const MeasurementVectorType & GetMeasurementVector() const
00134 { return (MeasurementVectorType&) *m_Iter ;}
00135
00136 InstanceIdentifier GetInstanceIdentifier() const
00137 { return m_InstanceIdentifier ;}
00138
00139 Iterator& operator++()
00140 { ++m_Iter ; ++m_InstanceIdentifier ; return *this ;}
00141
00142 Iterator& operator--()
00143 {
00144 --m_Iter ;
00145
00146 if ( m_InstanceIdentifier > 1 )
00147 m_InstanceIdentifier;
00148
00149 return *this ;
00150 }
00151
00152 bool operator!=(const Iterator &it)
00153 { return (m_Iter != it.m_Iter) ;}
00154
00155 bool operator==(const Iterator &it)
00156 { return (m_Iter == it.m_Iter) ;}
00157
00158 Iterator& operator = (const Iterator iter)
00159 {
00160 m_Iter = iter.m_Iter;
00161 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00162 return *this ;
00163 }
00164
00165 Iterator(const Iterator &iter)
00166 {
00167 m_Iter = iter.m_Iter;
00168 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00169 }
00170
00171 private:
00172 typename InternalDataContainerType::iterator m_Iter ;
00173 InstanceIdentifier m_InstanceIdentifier ;
00174 } ;
00175
00176
00177 class ConstIterator
00178 {
00179 public:
00180
00181 ConstIterator(){}
00182
00183 ConstIterator(typename InternalDataContainerType::const_iterator iter,
00184 InstanceIdentifier iid)
00185 :m_Iter(iter), m_InstanceIdentifier(iid)
00186 {}
00187
00188 FrequencyType GetFrequency() const
00189 { return 1 ;}
00190
00191 const MeasurementVectorType & GetMeasurementVector() const
00192 { return (MeasurementVectorType&) *m_Iter ;}
00193
00194 InstanceIdentifier GetInstanceIdentifier() const
00195 { return m_InstanceIdentifier ;}
00196
00197 ConstIterator& operator++()
00198 { ++m_Iter ; ++m_InstanceIdentifier ; return *this ;}
00199
00200 ConstIterator& operator--()
00201 {
00202 --m_Iter ;
00203
00204 if ( m_InstanceIdentifier > 1 )
00205 m_InstanceIdentifier;
00206
00207 return *this ;
00208 }
00209
00210 bool operator!=(const ConstIterator &it)
00211 { return (m_Iter != it.m_Iter) ;}
00212
00213 bool operator==(const ConstIterator &it)
00214 { return (m_Iter == it.m_Iter) ;}
00215
00216 ConstIterator& operator = (const ConstIterator iter)
00217 {
00218 m_Iter = iter.m_Iter;
00219 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00220 return *this ;
00221 }
00222
00223 ConstIterator(const ConstIterator &iter)
00224 {
00225 m_Iter = iter.m_Iter;
00226 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00227 }
00228
00229 private:
00230 typename InternalDataContainerType::const_iterator m_Iter ;
00231 InstanceIdentifier m_InstanceIdentifier ;
00232 } ;
00233
00235 Iterator Begin()
00236 {
00237 Iterator iter(m_InternalContainer.begin(), 0);
00238 return iter;
00239 }
00240
00242 Iterator End()
00243 {
00244 Iterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00245 return iter;
00246 }
00247
00249 ConstIterator Begin() const
00250 {
00251 ConstIterator iter(m_InternalContainer.begin(), 0);
00252 return iter;
00253 }
00254
00256 ConstIterator End() const
00257 {
00258 ConstIterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00259 return iter;
00260 }
00261
00262 protected:
00263 ListSample() ;
00264 virtual ~ListSample() {}
00265 void PrintSelf(std::ostream& os, Indent indent) const;
00266
00267 private:
00268 ListSample(const Self&) ;
00269 void operator=(const Self&) ;
00270
00271 InternalDataContainerType m_InternalContainer ;
00272 };
00273
00274 }
00275 }
00276
00277 #ifndef ITK_MANUAL_INSTANTIATION
00278 #include "itkListSample.txx"
00279 #endif
00280
00281 #endif