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 = 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 return (*m_ContainerPointer)[m_Slice.start()
00123 + n * m_Slice.stride()];
00124 }
00125
00127 TContainer *m_ContainerPointer;
00128
00130 unsigned long m_Pos;
00131
00133 std::slice m_Slice;
00134 };
00135
00136 }
00137
00138 #endif