00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkSliceIterator_h
00018 #define __itkSliceIterator_h
00019
00020 #include "itkMacro.h"
00021 #include "itkExceptionObject.h"
00022 #include <valarray>
00023 namespace itk {
00024
00044 template<class TPixel, class TContainer>
00045 class ITK_EXPORT SliceIterator
00046 {
00047 public:
00049 SliceIterator(TContainer *n, std::slice s)
00050 : m_ContainerPointer(n), m_Pos(0), m_Slice(s) {}
00051
00053 SliceIterator Begin()
00054 {
00055 SliceIterator ans = *this;
00056 ans.m_Pos = 0;
00057 return ans;
00058 }
00059
00061 SliceIterator End()
00062 {
00063 SliceIterator ans = *this;
00064 ans.m_Pos = static_cast<unsigned long>(m_Slice.size());
00065 return ans;
00066 }
00067
00069 SliceIterator operator++()
00070 {
00071 m_Pos++;
00072 return *this;
00073 }
00074
00076 SliceIterator operator++(int)
00077 {
00078 SliceIterator ans = *this;
00079 m_Pos++;
00080 return ans;
00081 }
00082
00085 TPixel& operator[](unsigned long n)
00086 { return this->Loc(m_Pos=n); }
00087
00090 TPixel& operator*()
00091 { return Loc(m_Pos); }
00092
00095 bool operator==(const SliceIterator &orig)
00096 {
00097 return orig.m_Pos==this->m_Pos
00098 && orig.m_Slice.stride()==this->m_Slice.stride()
00099 && orig.m_Slice.start() ==this->m_Slice.start();
00100 }
00101
00103 bool operator!=(const SliceIterator &orig)
00104 {
00105 return ! operator==(orig);
00106 }
00107
00111 bool operator<(const SliceIterator &orig)
00112 {
00113 return this->m_Pos < orig.m_Pos
00114 && this->m_Slice.stride()==orig.m_Slice.stride()
00115 && this->m_Slice.start()==orig.m_Slice.start();
00116 }
00117
00118 private:
00120 TPixel& Loc(unsigned long n) const
00121 {
00122 const unsigned long start = static_cast<unsigned long>( m_Slice.start() );
00123 const unsigned long stride = static_cast<unsigned long>( m_Slice.stride() );
00124 return (*m_ContainerPointer)[ start + n * stride ];
00125 }
00126
00128 TContainer *m_ContainerPointer;
00129
00131 unsigned long m_Pos;
00132
00134 std::slice m_Slice;
00135 };
00136
00137 }
00138
00139 #endif