00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImageReverseConstIterator_h
00018 #define __itkImageReverseConstIterator_h
00019
00020 #include "itkIndex.h"
00021 #include "itkSize.h"
00022 #include "itkImage.h"
00023 #include "itkImageConstIterator.h"
00024 #include <memory>
00025
00026 namespace itk
00027 {
00028
00059 template<typename TImage>
00060 class ITK_EXPORT ImageReverseConstIterator
00061 {
00062 public:
00064 typedef ImageReverseConstIterator Self;
00065
00070 itkStaticConstMacro(ImageIteratorDimension, unsigned int,
00071 TImage::ImageDimension);
00072
00074 typedef typename TImage::IndexType IndexType;
00075 typedef typename TImage::IndexValueType IndexValueType;
00076
00078 typedef typename TImage::SizeType SizeType;
00079 typedef typename TImage::SizeValueType SizeValueType;
00080
00082 typedef typename TImage::OffsetType OffsetType;
00083 typedef typename TImage::OffsetValueType OffsetValueType;
00084
00086 typedef typename TImage::RegionType RegionType;
00087
00089 typedef TImage ImageType;
00090
00094 typedef typename TImage::PixelContainer PixelContainer;
00095 typedef typename PixelContainer::Pointer PixelContainerPointer;
00096
00098 typedef typename TImage::InternalPixelType InternalPixelType;
00099
00101 typedef typename TImage::PixelType PixelType;
00102
00105 typedef typename TImage::AccessorType AccessorType;
00106
00109 ImageReverseConstIterator()
00110 :m_PixelAccessor()
00111 {
00112 m_Buffer = 0;
00113 m_Offset = 0;
00114 m_BeginOffset = 0;
00115 m_EndOffset = 0;
00116 }
00117
00119 virtual ~ImageReverseConstIterator() {};
00120
00123 ImageReverseConstIterator(const Self& it)
00124 {
00125 m_Image = it.m_Image;
00126
00127 m_Region = it.m_Region;
00128
00129 m_Buffer = it.m_Buffer;
00130 m_Offset = it.m_Offset;
00131 m_BeginOffset = it.m_BeginOffset;
00132 m_EndOffset = it.m_EndOffset;
00133 m_PixelAccessor = it.m_PixelAccessor;
00134 }
00135
00138 ImageReverseConstIterator(ImageType *ptr,
00139 const RegionType ®ion)
00140 {
00141 unsigned long offset;
00142 m_Image = ptr;
00143 m_Buffer = m_Image->GetBufferPointer();
00144 m_Region = region;
00145
00146
00147 offset = m_Image->ComputeOffset( m_Region.GetIndex() );
00148 m_EndOffset = offset-1;
00149
00150
00151 IndexType ind(m_Region.GetIndex());
00152 SizeType size(m_Region.GetSize());
00153 for (unsigned int i=0; i < TImage::ImageDimension; ++i)
00154 {
00155 ind[i] += (size[i] - 1);
00156 }
00157 m_BeginOffset = m_Image->ComputeOffset( ind );
00158 m_Offset = m_BeginOffset;
00159
00160 m_PixelAccessor = ptr->GetPixelAccessor();
00161 }
00162
00170 ImageReverseConstIterator( const ImageConstIterator<TImage> &it)
00171 {
00172 m_Image = it.GetImage();
00173 m_Region = it.GetRegion();
00174 m_Buffer = m_Image->GetBufferPointer();
00175
00176 IndexType ind = it.GetIndex();
00177
00178 m_Offset = m_Image->ComputeOffset( ind );
00179
00180
00181 m_EndOffset = m_Image->ComputeOffset( m_Region.GetIndex() ) - 1;
00182
00183
00184 IndexType regInd(m_Region.GetIndex());
00185 SizeType regSize(m_Region.GetSize());
00186 for (unsigned int i=0; i < TImage::ImageDimension; ++i)
00187 {
00188 regInd[i] += (regSize[i] - 1);
00189 }
00190 m_BeginOffset = m_Image->ComputeOffset( regInd );
00191
00192 m_PixelAccessor = m_Image->GetPixelAccessor();
00193 }
00194
00197 Self &operator=(const Self& it)
00198 {
00199 m_Image = it.m_Image;
00200 m_Region = it.m_Region;
00201
00202 m_Buffer = it.m_Buffer;
00203 m_Offset = it.m_Offset;
00204 m_BeginOffset = it.m_BeginOffset;
00205 m_EndOffset = it.m_EndOffset;
00206 m_PixelAccessor = it.m_PixelAccessor;
00207 return *this;
00208 }
00209
00212 Self &operator=(const ImageConstIterator<TImage>& it)
00213 {
00214 m_Image = it.GetImage();
00215 m_Region = it.GetRegion();
00216 m_Buffer = m_Image->GetBufferPointer();
00217
00218 IndexType ind = it.GetIndex();
00219
00220 m_Offset = m_Image->ComputeOffset( ind );
00221
00222
00223 m_EndOffset = m_Image->ComputeOffset( m_Region.GetIndex() ) - 1;
00224
00225
00226 IndexType regInd(m_Region.GetIndex());
00227 SizeType regSize(m_Region.GetSize());
00228 for (unsigned int i=0; i < TImage::ImageDimension; ++i)
00229 {
00230 regInd[i] += (regSize[i] - 1);
00231 }
00232 m_BeginOffset = m_Image->ComputeOffset( regInd );
00233
00234 m_PixelAccessor = m_Image->GetPixelAccessor();
00235
00236 return *this;
00237 }
00238
00240 static unsigned int GetImageIteratorDimension()
00241 {return TImage::ImageDimension;}
00242
00245 bool
00246 operator!=(const Self &it) const
00247 {
00248
00249 return (m_Buffer + m_Offset) != (it.m_Buffer + it.m_Offset);
00250 };
00251
00254 bool
00255 operator==(const Self &it) const
00256 {
00257
00258 return (m_Buffer + m_Offset) == (it.m_Buffer + it.m_Offset);
00259 };
00260
00261 #if 0
00262
00268 bool
00269 operator<=(const Self &it) const
00270 {
00271
00272
00273 return (m_Buffer + m_Offset) <= (it.m_Buffer + it.m_Offset);
00274 };
00275
00278 bool
00279 operator<(const Self &it) const
00280 {
00281
00282
00283 return (m_Buffer + m_Offset) < (it.m_Buffer + it.m_Offset);
00284 };
00285
00288 bool
00289 operator>=(const Self &it) const
00290 {
00291
00292
00293 return (m_Buffer + m_Offset) >= (it.m_Buffer + it.m_Offset);
00294 };
00295
00298 bool
00299 operator>(const Self &it) const
00300 {
00301
00302
00303 return (m_Buffer + m_Offset) > (it.m_Buffer + it.m_Offset);
00304 };
00305 #endif
00306
00307
00312 const IndexType GetIndex()
00313 { return m_Image->ComputeIndex( m_Offset ); }
00314
00317 virtual void SetIndex(const IndexType &ind)
00318 { m_Offset = m_Image->ComputeOffset( ind ); }
00319
00320
00323 const RegionType& GetRegion() const
00324 { return m_Region; };
00325
00327 const PixelType & Get(void) const
00328 { return m_PixelAccessor.Get(*(m_Buffer+m_Offset)); }
00329
00331 void Set( const PixelType & value) const
00332 { m_PixelAccessor.Set(*(m_Buffer+m_Offset),value); }
00333
00337 const PixelType & Value(void) const
00338 { return *(m_Buffer+m_Offset); }
00339
00343 PixelType & Value(void)
00344 { return *(m_Buffer+m_Offset); }
00345
00349 Self Begin() const;
00350
00353 void GoToBegin()
00354 {
00355 m_Offset = m_BeginOffset;
00356 };
00357
00361 Self End() const;
00362
00365 void GoToEnd()
00366 {
00367 m_Offset = m_EndOffset;
00368 };
00369
00372 bool IsAtBegin()
00373 {
00374 return (m_Offset == m_BeginOffset);
00375 }
00376
00379 bool IsAtEnd()
00380 {
00381 return (m_Offset == m_EndOffset);
00382 }
00383
00384 protected:
00385 typename ImageType::ConstPointer m_Image;
00386 RegionType m_Region;
00387
00388 unsigned long m_Offset;
00389 unsigned long m_BeginOffset;
00390 unsigned long m_EndOffset;
00391
00392 const InternalPixelType *m_Buffer;
00393
00394 AccessorType m_PixelAccessor;
00395 };
00396
00397 }
00398
00399 #ifndef ITK_MANUAL_INSTANTIATION
00400 #include "itkImageReverseConstIterator.txx"
00401 #endif
00402
00403 #endif