00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkImageRegionReverseConstIterator_h
00018 #define __itkImageRegionReverseConstIterator_h
00019
00020 #include "itkImageReverseConstIterator.h"
00021
00022 namespace itk
00023 {
00024
00099 template<typename TImage>
00100 class ITK_EXPORT ImageRegionReverseConstIterator : public ImageReverseConstIterator<TImage>
00101 {
00102 public:
00103
00105 typedef ImageRegionReverseConstIterator Self;
00106 typedef ImageReverseConstIterator<TImage> Superclass;
00107
00112 enum { ImageIteratorDimension = Superclass::ImageIteratorDimension };
00113
00116 typedef typename Superclass::IndexType IndexType;
00117 typedef typename Superclass::IndexValueType IndexValueType;
00118
00121 typedef typename Superclass::SizeType SizeType;
00122 typedef typename Superclass::SizeValueType SizeValueType;
00123
00126 typedef typename Superclass::OffsetType OffsetType;
00127 typedef typename Superclass::OffsetValueType OffsetValueType;
00128
00130 typedef typename Superclass::RegionType RegionType;
00131
00134 typedef typename Superclass::ImageType ImageType;
00135
00139 typedef typename Superclass::PixelContainer PixelContainer;
00140 typedef typename PixelContainer::Pointer PixelContainerPointer;
00141
00143 typedef typename Superclass::InternalPixelType InternalPixelType;
00144
00146 typedef typename Superclass::PixelType PixelType;
00147
00150 typedef typename Superclass::AccessorType AccessorType;
00151
00153 itkTypeMacro(ImageRegionReverseConstIterator, ImageReverseConstIterator);
00154
00156 ImageRegionReverseConstIterator() : Superclass()
00157 {
00158 m_SpanBeginOffset = 0;
00159 m_SpanEndOffset = 0;
00160 }
00161
00164 ImageRegionReverseConstIterator(ImageType *ptr,
00165 const RegionType ®ion)
00166 : Superclass(ptr, region)
00167 {
00168 m_SpanBeginOffset = this->m_BeginOffset;
00169 m_SpanEndOffset = this->m_BeginOffset - static_cast<long>(this->m_Region.GetSize()[0]);
00170 }
00172
00180 ImageRegionReverseConstIterator( const ImageConstIterator<TImage> &it):Superclass(it)
00181 {
00182 IndexType ind = this->GetIndex();
00183 m_SpanBeginOffset = this->m_Offset + static_cast<long>(this->m_Region.GetSize()[0])
00184 - (ind[0] - this->m_Region.GetIndex()[0]);
00185 m_SpanEndOffset = m_SpanBeginOffset - static_cast<long>(this->m_Region.GetSize()[0]);
00186 }
00188
00191 ImageRegionReverseConstIterator( const ImageReverseConstIterator<TImage> &it):Superclass(it)
00192 {
00193 IndexType ind = this->GetIndex();
00194 m_SpanBeginOffset = this->m_Offset + static_cast<long>(this->m_Region.GetSize()[0])
00195 - (ind[0] - this->m_Region.GetIndex()[0]);
00196 m_SpanEndOffset = m_SpanBeginOffset - static_cast<long>(this->m_Region.GetSize()[0]);
00197 }
00199
00202 ImageRegionReverseConstIterator( const ImageRegionIterator<TImage> &it):Superclass(it)
00203 {
00204 IndexType ind = this->GetIndex();
00205 m_SpanBeginOffset = this->m_Offset + static_cast<long>(this->m_Region.GetSize()[0])
00206 - (ind[0] - this->m_Region.GetIndex()[0]);
00207 m_SpanEndOffset = m_SpanBeginOffset - static_cast<long>(this->m_Region.GetSize()[0]);
00208 }
00210
00213 void GoToBegin()
00214 {
00215 Superclass::GoToBegin();
00216
00217
00218 m_SpanBeginOffset = this->m_BeginOffset;
00219 m_SpanEndOffset = this->m_BeginOffset
00220 - static_cast<long>(this->m_Region.GetSize()[0]);
00221 };
00222
00225 void GoToEnd()
00226 {
00227 Superclass::GoToEnd();
00228
00229
00230 m_SpanEndOffset = this->m_EndOffset;
00231 m_SpanBeginOffset = m_SpanEndOffset
00232 + static_cast<long>(this->m_Region.GetSize()[0]);
00233 };
00234
00238 Self Begin(void) const;
00239
00244 Self End(void) const;
00245
00246
00250 void SetIndex(const IndexType &ind)
00251 { Superclass::SetIndex(ind);
00252 m_SpanBeginOffset = this->m_Offset + static_cast<long>(this->m_Region.GetSize()[0])
00253 - (ind[0] - this->m_Region.GetIndex()[0]);
00254 m_SpanEndOffset = m_SpanBeginOffset - static_cast<long>(this->m_Region.GetSize()[0]);
00255 }
00257
00266 Self &
00267 operator++()
00268 {
00269 if (--this->m_Offset <= m_SpanEndOffset)
00270 {
00271
00272
00273
00274
00275 this->m_Offset++;
00276
00277
00278 typename ImageConstIterator<TImage>::IndexType
00279 ind = this->m_Image->ComputeIndex( static_cast<OffsetValueType>(this->m_Offset) );
00280
00281 const typename ImageConstIterator<TImage>::IndexType&
00282 startIndex = this->m_Region.GetIndex();
00283 const typename ImageConstIterator<TImage>::SizeType&
00284 size = this->m_Region.GetSize();
00285
00286
00287 bool done;
00288 unsigned int dim;
00289
00290
00291
00292 done = (--ind[0] == startIndex[0] - 1);
00293 for (unsigned int i=1; done && i < ImageIteratorDimension; i++)
00294 {
00295 done = (ind[i] == startIndex[i]);
00296 }
00297
00298
00299
00300 dim = 0;
00301 if (!done)
00302 {
00303 while ( (dim < ImageIteratorDimension - 1)
00304 && (ind[dim] < startIndex[dim]) )
00305 {
00306 ind[dim] = startIndex[dim] + static_cast<long>(size[dim]) - 1;
00307 ind[++dim]--;
00308 }
00309 }
00310 this->m_Offset = this->m_Image->ComputeOffset( ind );
00311 m_SpanBeginOffset = this->m_Offset;
00312 m_SpanEndOffset = m_SpanBeginOffset - static_cast<long>(size[0]);
00313 }
00314 return *this;
00315 }
00316
00325 Self & operator--()
00326 {
00327 if (++this->m_Offset >= m_SpanBeginOffset)
00328 {
00329
00330
00331
00332
00333 --this->m_Offset;
00334
00335
00336 typename ImageConstIterator<TImage>::IndexType
00337 ind = this->m_Image->ComputeIndex( static_cast<OffsetValueType>(this->m_Offset) );
00338
00339 const typename ImageIterator<TImage>::IndexType&
00340 startIndex = this->m_Region.GetIndex();
00341 const typename ImageIterator<TImage>::SizeType&
00342 size = this->m_Region.GetSize();
00343
00344
00345 bool done;
00346 unsigned int dim;
00347
00348
00349
00350 done = (++ind[0] == startIndex[0] + static_cast<long>(size[0]));
00351 for (unsigned int i=1; done && i < ImageIteratorDimension; i++)
00352 {
00353 done = (ind[i] == startIndex[i] + static_cast<long>(size[i]) - 1);
00354 }
00355
00356
00357
00358 dim = 0;
00359 if (!done)
00360 {
00361 while ( (dim < ImageIteratorDimension - 1)
00362 && (ind[dim] > startIndex[dim] + static_cast<long>(size[dim]) - 1) )
00363 {
00364 ind[dim] = startIndex[dim];
00365 ind[++dim]++;
00366 }
00367 }
00368 this->m_Offset = this->m_Image->ComputeOffset( ind );
00369 m_SpanBeginOffset = this->m_Offset;
00370 m_SpanEndOffset = this->m_Offset - static_cast<long>(size[0]);
00371 }
00372 return *this;
00373 }
00374
00375 protected:
00376 unsigned long m_SpanBeginOffset;
00377 unsigned long m_SpanEndOffset;
00378
00379 };
00380
00381 }
00382
00383 #ifndef ITK_MANUAL_INSTANTIATION
00384 #include "itkImageRegionReverseConstIterator.txx"
00385 #endif
00386
00387 #endif
00388