Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

Review/Statistics/itkListSample.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkListSample.h,v $
00005   Language:  C++
00006   Date:      $Date: 2009-05-22 12:55:02 $
00007   Version:   $Revision: 1.2 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notices for more information.
00015 
00016 =========================================================================*/
00017 #ifndef __itkListSample_h
00018 #define __itkListSample_h
00019 
00020 #include "itkObjectFactory.h"
00021 #include "itkFixedArray.h"
00022 #include "itkSample.h"
00023 
00024 #include <vector>
00025 
00026 namespace itk {
00027 namespace Statistics {
00028 
00043 template< class TMeasurementVector >
00044 class ITK_EXPORT ListSample : public Sample< TMeasurementVector >
00045 {
00046 public:
00048   typedef ListSample                     Self;
00049   typedef Sample< TMeasurementVector >   Superclass;
00050   typedef SmartPointer< Self >           Pointer;
00051   typedef SmartPointer<const Self>       ConstPointer;
00052 
00054   itkTypeMacro(ListSample, Sample);
00055 
00057   itkNewMacro(Self);
00058 
00060   itkSuperclassTraitMacro( MeasurementVectorType )
00061   itkSuperclassTraitMacro( MeasurementVectorSizeType )
00062   itkSuperclassTraitMacro( MeasurementType )
00063   itkSuperclassTraitMacro( AbsoluteFrequencyType )
00064   itkSuperclassTraitMacro( TotalAbsoluteFrequencyType )
00065   itkSuperclassTraitMacro( InstanceIdentifier )
00066 
00069   typedef MeasurementVectorType ValueType;
00070 
00071 
00073   typedef std::vector< MeasurementVectorType > InternalDataContainerType;
00074 
00082   void Resize( InstanceIdentifier newsize );
00083 
00085   void Clear();
00086 
00088   void PushBack( const MeasurementVectorType & mv );
00089 
00091   InstanceIdentifier Size() const;
00092 
00095   const MeasurementVectorType & GetMeasurementVector(InstanceIdentifier id) const;
00096 
00098   void SetMeasurement(InstanceIdentifier id,
00099                       unsigned int dim,
00100                       const MeasurementType &value);
00101 
00103   void SetMeasurementVector( InstanceIdentifier id,
00104                             const MeasurementVectorType &mv);
00105 
00108   AbsoluteFrequencyType GetFrequency( InstanceIdentifier id ) const;
00109 
00112   TotalAbsoluteFrequencyType GetTotalFrequency() const;
00113 
00115   virtual void Graft( const DataObject *thatObject );
00116 
00118   class ConstIterator
00119     {
00120     friend class ListSample;
00121 
00122     public:
00123 
00124     ConstIterator( const ListSample * sample )
00125       {
00126       *this = sample->Begin();
00127       }
00128 
00129     ConstIterator(const ConstIterator &iter)
00130       {
00131       m_Iter = iter.m_Iter;
00132       m_InstanceIdentifier = iter.m_InstanceIdentifier;
00133       }
00134 
00135     ConstIterator& operator=( const ConstIterator & iter )
00136       {
00137       m_Iter = iter.m_Iter;
00138       m_InstanceIdentifier = iter.m_InstanceIdentifier;
00139       return *this;
00140       }
00141 
00142 
00143     AbsoluteFrequencyType GetFrequency() const
00144       {
00145       return 1;
00146       }
00147 
00148     const MeasurementVectorType & GetMeasurementVector() const
00149       {
00150       return static_cast<const MeasurementVectorType&>(*m_Iter);
00151       }
00152 
00153     InstanceIdentifier GetInstanceIdentifier() const
00154       {
00155       return m_InstanceIdentifier;
00156       }
00157 
00158     ConstIterator& operator++()
00159       {
00160       ++m_Iter;
00161       ++m_InstanceIdentifier;
00162       return *this;
00163       }
00164 
00165     bool operator!=(const ConstIterator &it)
00166       {
00167       return (m_Iter != it.m_Iter);
00168       }
00169 
00170     bool operator==(const ConstIterator &it)
00171       {
00172       return (m_Iter == it.m_Iter);
00173       }
00174 
00175 #if !(defined(_MSC_VER) && (_MSC_VER <= 1200))
00176   protected:
00177 #endif
00178     // This method should only be available to the ListSample class
00179     ConstIterator(
00180       typename InternalDataContainerType::const_iterator iter,
00181       InstanceIdentifier iid)
00182       {
00183       m_Iter = iter;
00184       m_InstanceIdentifier = iid;
00185       }
00186 
00187     // This method is purposely not implemented
00188     ConstIterator();
00189 
00190   private:
00191     typedef typename InternalDataContainerType::const_iterator InternalIterator;
00192     InternalIterator     m_Iter;
00193     InstanceIdentifier   m_InstanceIdentifier;
00194 
00195     };
00196 
00198   class Iterator : public ConstIterator
00199   {
00200 
00201   friend class ListSample;
00202 
00203   public:
00204 
00205     Iterator(Self * sample):ConstIterator(sample)
00206       {
00207       }
00208 
00209     Iterator(const Iterator &iter):ConstIterator( iter )
00210       {
00211       }
00212 
00213     Iterator& operator =(const Iterator & iter)
00214       {
00215       this->ConstIterator::operator=( iter );
00216       return *this;
00217       }
00218 
00219 #if !(defined(_MSC_VER) && (_MSC_VER <= 1200))
00220   protected:
00221 #endif
00222     // To ensure const-correctness these method must not be in the public API.
00223     // The are purposly not implemented, since they should never be called.
00224     Iterator();
00225     Iterator(const Self * sample);
00226     Iterator( typename InternalDataContainerType::const_iterator iter, InstanceIdentifier iid);
00227     Iterator(const ConstIterator & it);
00228     ConstIterator& operator=(const ConstIterator& it);
00229     Iterator(
00230       typename InternalDataContainerType::iterator iter,
00231       InstanceIdentifier iid):ConstIterator( iter, iid )
00232       {
00233       }
00234 
00235   private:
00236   };
00237 
00238 
00240   Iterator Begin()
00241     {
00242     Iterator iter(m_InternalContainer.begin(), 0);
00243     return iter;
00244     }
00246 
00248   Iterator End()
00249     {
00250     Iterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00251     return iter;
00252     }
00254 
00256   ConstIterator Begin() const
00257     {
00258     ConstIterator iter(m_InternalContainer.begin(), 0);
00259     return iter;
00260     }
00262 
00264   ConstIterator End() const
00265     {
00266     ConstIterator iter(m_InternalContainer.end(), m_InternalContainer.size());
00267     return iter;
00268     }
00270 
00271 protected:
00272 
00273   ListSample();
00274   virtual ~ListSample() {}
00275   void PrintSelf(std::ostream& os, Indent indent) const;
00276 
00277 
00278 private:
00279   ListSample(const Self&); //purposely not implemented
00280   void operator=(const Self&); //purposely not implemented
00281 
00282   InternalDataContainerType m_InternalContainer;
00283 
00284 };
00285 
00286 } // end of namespace Statistics
00287 } // end of namespace itk
00288 
00289 #ifndef ITK_MANUAL_INSTANTIATION
00290 #include "itkListSample.txx"
00291 #endif
00292 
00293 #endif
00294 

Generated at Thu May 28 10:42:06 2009 for ITK by doxygen 1.5.5 written by Dimitri van Heesch, © 1997-2000