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
00045 template< class TMeasurementVector >
00046 class ITK_EXPORT ListSample : public ListSampleBase< TMeasurementVector >
00047 {
00048 public:
00050 typedef ListSample Self;
00051 typedef ListSampleBase< TMeasurementVector > Superclass;
00052 typedef SmartPointer< Self > Pointer;
00053 typedef SmartPointer<const Self> ConstPointer;
00054
00056 itkTypeMacro(ListSample, ListSampleBase);
00057
00059 itkNewMacro(Self) ;
00060
00062 typedef typename Superclass::MeasurementVectorType MeasurementVectorType;
00063 typedef typename Superclass::MeasurementType MeasurementType;
00064 typedef typename Superclass::FrequencyType FrequencyType ;
00065 typedef typename Superclass::TotalFrequencyType TotalFrequencyType ;
00066 typedef typename Superclass::InstanceIdentifier InstanceIdentifier;
00067 typedef typename Superclass::SearchResultVectorType SearchResultVectorType ;
00068
00071 typedef MeasurementVectorType ValueType ;
00072
00073
00075 typedef std::vector< MeasurementVectorType > InternalDataContainerType ;
00076
00082 void Resize( unsigned int n )
00083 { m_InternalContainer.resize(n) ; }
00084
00086 void Clear()
00087 { m_InternalContainer.clear() ; }
00088
00090 void PushBack( MeasurementVectorType mv )
00091 { m_InternalContainer.push_back( mv ) ; }
00092
00094 unsigned int Size() const
00095 { return static_cast<unsigned int>( m_InternalContainer.size() ); }
00096
00099 const MeasurementVectorType & GetMeasurementVector(const InstanceIdentifier &id) const;
00100
00102 void SetMeasurement(const InstanceIdentifier &id,
00103 const unsigned int &dim,
00104 const MeasurementType &value) ;
00105
00107 void SetMeasurementVector(const InstanceIdentifier &id,
00108 const MeasurementVectorType &mv) ;
00109
00112 FrequencyType GetFrequency(const InstanceIdentifier &id) const ;
00113
00116 TotalFrequencyType GetTotalFrequency() const
00117 { return static_cast<TotalFrequencyType>( m_InternalContainer.size() ); }
00118
00119 class ConstIterator;
00120
00121 class Iterator
00122 {
00123
00124 friend class ConstIterator;
00125
00126 public:
00127
00128 Iterator(){}
00129
00130 Iterator(typename InternalDataContainerType::iterator iter,
00131 InstanceIdentifier iid)
00132 :m_Iter(iter), m_InstanceIdentifier(iid)
00133 {}
00134
00135 FrequencyType GetFrequency() const
00136 { return 1 ;}
00137
00138 const MeasurementVectorType & GetMeasurementVector() const
00139 { return (MeasurementVectorType&) *m_Iter ;}
00140
00141 InstanceIdentifier GetInstanceIdentifier() const
00142 { return m_InstanceIdentifier ;}
00143
00144 Iterator& operator++()
00145 { ++m_Iter ; ++m_InstanceIdentifier ; return *this ;}
00146
00147 Iterator& operator--()
00148 {
00149 --m_Iter ;
00150
00151 if ( m_InstanceIdentifier > 1 )
00152 m_InstanceIdentifier;
00153
00154 return *this ;
00155 }
00156
00157 bool operator!=(const Iterator &it)
00158 { return (m_Iter != it.m_Iter) ;}
00159
00160 bool operator==(const Iterator &it)
00161 { return (m_Iter == it.m_Iter) ;}
00162
00163 Iterator& operator = (const Iterator & iter)
00164 {
00165 m_Iter = iter.m_Iter;
00166 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00167 return *this ;
00168 }
00169
00170 Iterator(const Iterator &iter)
00171 {
00172 m_Iter = iter.m_Iter;
00173 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00174 }
00175
00176 private:
00177 typename InternalDataContainerType::iterator m_Iter ;
00178 InstanceIdentifier m_InstanceIdentifier ;
00179 } ;
00180
00181
00182 class ConstIterator
00183 {
00184 public:
00185
00186 ConstIterator(){}
00187
00188 ConstIterator(typename InternalDataContainerType::const_iterator iter,
00189 InstanceIdentifier iid)
00190 :m_Iter(iter), m_InstanceIdentifier(iid)
00191 {}
00192
00193 FrequencyType GetFrequency() const
00194 { return 1 ;}
00195
00196 const MeasurementVectorType & GetMeasurementVector() const
00197 { return (MeasurementVectorType&) *m_Iter ;}
00198
00199 InstanceIdentifier GetInstanceIdentifier() const
00200 { return m_InstanceIdentifier ;}
00201
00202 ConstIterator& operator++()
00203 { ++m_Iter ; ++m_InstanceIdentifier ; return *this ;}
00204
00205 ConstIterator& operator--()
00206 {
00207 --m_Iter ;
00208
00209 if ( m_InstanceIdentifier > 1 )
00210 m_InstanceIdentifier;
00211
00212 return *this ;
00213 }
00214
00215 bool operator!=(const ConstIterator &it)
00216 { return (m_Iter != it.m_Iter) ;}
00217
00218 bool operator==(const ConstIterator &it)
00219 { return (m_Iter == it.m_Iter) ;}
00220
00221 ConstIterator& operator = (const ConstIterator iter)
00222 {
00223 m_Iter = iter.m_Iter;
00224 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00225 return *this ;
00226 }
00227
00228 ConstIterator& operator = (const Iterator & iter)
00229 {
00230 m_Iter = iter.m_Iter;
00231 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00232 return *this ;
00233 }
00234
00235
00236 ConstIterator(const ConstIterator &iter)
00237 {
00238 m_Iter = iter.m_Iter;
00239 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00240 }
00241
00242 ConstIterator(const Iterator &iter)
00243 {
00244 m_Iter = iter.m_Iter;
00245 m_InstanceIdentifier = iter.m_InstanceIdentifier ;
00246 }
00247
00248 private:
00249 typename InternalDataContainerType::const_iterator m_Iter ;
00250 InstanceIdentifier m_InstanceIdentifier ;
00251 } ;
00252
00254 Iterator Begin()
00255 {
00256 Iterator iter(m_InternalContainer.begin(), 0);
00257 return iter;
00258 }
00259
00261 Iterator End()
00262 {
00263 Iterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00264 return iter;
00265 }
00266
00268 ConstIterator Begin() const
00269 {
00270 ConstIterator iter(m_InternalContainer.begin(), 0);
00271 return iter;
00272 }
00273
00275 ConstIterator End() const
00276 {
00277 ConstIterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00278 return iter;
00279 }
00280
00281 protected:
00282 ListSample() ;
00283 virtual ~ListSample() {}
00284 void PrintSelf(std::ostream& os, Indent indent) const;
00285
00286
00287 private:
00288 ListSample(const Self&) ;
00289 void operator=(const Self&) ;
00290
00291 InternalDataContainerType m_InternalContainer ;
00292
00293 };
00294
00295 }
00296 }
00297
00298 #ifndef ITK_MANUAL_INSTANTIATION
00299 #include "itkListSample.txx"
00300 #endif
00301
00302 #endif