cmtkRegionIndexIterator.h

Go to the documentation of this file.
00001 /*
00002 //
00003 //  Copyright 2010 SRI International
00004 //
00005 //  Copyright 2010 Torsten Rohlfing
00006 //
00007 //  This file is part of the Computational Morphometry Toolkit.
00008 //
00009 //  http://www.nitrc.org/projects/cmtk/
00010 //
00011 //  The Computational Morphometry Toolkit is free software: you can
00012 //  redistribute it and/or modify it under the terms of the GNU General Public
00013 //  License as published by the Free Software Foundation, either version 3 of
00014 //  the License, or (at your option) any later version.
00015 //
00016 //  The Computational Morphometry Toolkit is distributed in the hope that it
00017 //  will be useful, but WITHOUT ANY WARRANTY; without even the implied
00018 //  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 //  GNU General Public License for more details.
00020 //
00021 //  You should have received a copy of the GNU General Public License along
00022 //  with the Computational Morphometry Toolkit.  If not, see
00023 //  <http://www.gnu.org/licenses/>.
00024 //
00025 //  $Revision: 2455 $
00026 //
00027 //  $LastChangedDate: 2010-10-18 13:35:29 -0700 (Mon, 18 Oct 2010) $
00028 //
00029 //  $LastChangedBy: torstenrohlfing $
00030 //
00031 */
00032 
00033 #ifndef __cmtkRegionIndexIterator_h_included_
00034 #define __cmtkRegionIndexIterator_h_included_
00035 
00036 #include <cmtkconfig.h>
00037 
00038 #include <Base/cmtkRegion.h>
00039 #include <Base/cmtkFixedVector.h>
00040 
00041 #include <System/cmtkSmartPtr.h>
00042 #include <System/cmtkSmartConstPtr.h>
00043 
00044 namespace
00045 cmtk
00046 {
00048 template<size_t NDIM,typename T=int>
00049 class RegionIndexIterator
00050 {
00051 public:
00053   typedef RegionIndexIterator<NDIM,T> Self;
00054 
00056   typedef Region<NDIM,T> RegionType;
00057 
00059   typedef FixedVector<NDIM,T> IndexType;
00060 
00062   typedef SmartPointer<Self> SmartPtr;
00063 
00065   typedef SmartConstPointer<Self> SmartConstPtr;
00066 
00068   RegionIndexIterator( const typename Self::RegionType& region )
00069     : m_Region( region ),
00070       m_Index( region.begin() )
00071   {}
00072 
00074   Self& operator++()
00075   {
00076     for ( size_t idx = NDIM; idx > 0; )
00077       {
00078       --idx;
00079       if ( (++this->m_Index[idx]) >= this->m_Region.To()[idx] )
00080         {
00081         this->m_Index[idx] = this->m_Region.From()[idx];
00082         }
00083       else
00084         break;
00085       }
00086   }
00087   
00089   const typename Self::IndexType& Index() const
00090   {
00091     return this->m_Index;
00092   }
00093 
00095   Self& operator=( const typename Self::IndexType& index )
00096   {
00097     this->m_Index = index;
00098     return *this;
00099   }
00100 
00102   bool operator==( const typename Self::IndexType& index )
00103   {
00104     return (this->m_Index == index);
00105   }
00106 
00108   bool operator!=( const typename Self::IndexType& index )
00109   {
00110     return (this->m_Index != index);
00111   }
00112 
00113 private:
00115   typename Self::RegionType m_Region;
00116 
00118   typename Self::IndexType m_Index;
00119 };
00120 
00121 } // namespace cmtk
00122 
00123 #endif // #ifndef __cmtkRegionIndexIterator_h_included_
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines