ITK 6.0.0
Insight Toolkit
 
Loading...
Searching...
No Matches
itkImageRegionReverseConstIterator.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef itkImageRegionReverseConstIterator_h
19#define itkImageRegionReverseConstIterator_h
20
23
24namespace itk
25{
102template <typename TImage>
103class ITK_TEMPLATE_EXPORT ImageRegionReverseConstIterator : public ImageReverseConstIterator<TImage>
104{
105public:
109
112 using typename Superclass::IndexType;
113
116 using typename Superclass::SizeType;
117
120 using typename Superclass::OffsetType;
121
123 using typename Superclass::RegionType;
124
127 using typename Superclass::ImageType;
128
132 using typename Superclass::PixelContainer;
133 using PixelContainerPointer = typename PixelContainer::Pointer;
134
136 using typename Superclass::InternalPixelType;
137
139 using typename Superclass::PixelType;
140
143 using typename Superclass::AccessorType;
144
146 itkOverrideGetNameOfClassMacro(ImageRegionReverseConstIterator);
147
152
156 : Superclass(ptr, region)
158 , m_SpanEndOffset(this->m_BeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]))
159 {}
160
169 : Superclass(it)
170 , m_SpanEndOffset(m_SpanBeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]))
171 {
172 IndexType ind = this->GetIndex();
173
174 m_SpanBeginOffset = this->m_Offset + static_cast<OffsetValueType>(this->m_Region.GetSize()[0]) -
175 (ind[0] - this->m_Region.GetIndex()[0]);
176 }
177
181 : Superclass(it)
182 , m_SpanEndOffset(m_SpanBeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]))
183 {
184 IndexType ind = this->GetIndex();
185
186 m_SpanBeginOffset = this->m_Offset + static_cast<OffsetValueType>(this->m_Region.GetSize()[0]) -
187 (ind[0] - this->m_Region.GetIndex()[0]);
188 }
189
193 : Superclass(it)
194 , m_SpanEndOffset(m_SpanBeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]))
195 {
196 IndexType ind = this->GetIndex();
197
198 m_SpanBeginOffset = this->m_Offset + static_cast<OffsetValueType>(this->m_Region.GetSize()[0]) -
199 (ind[0] - this->m_Region.GetIndex()[0]);
200 }
201
204 void
206 {
208
209 // reset the span offsets
211 m_SpanEndOffset = this->m_BeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]);
212 }
213
216 void
218 {
220
221 // reset the span offsets
223 m_SpanBeginOffset = m_SpanEndOffset + static_cast<OffsetValueType>(this->m_Region.GetSize()[0]);
224 }
225
229 void
230 SetIndex(const IndexType & ind) override
231 {
233 m_SpanBeginOffset = this->m_Offset + static_cast<OffsetValueType>(this->m_Region.GetSize()[0]) -
234 (ind[0] - this->m_Region.GetIndex()[0]);
235 m_SpanEndOffset = m_SpanBeginOffset - static_cast<OffsetValueType>(this->m_Region.GetSize()[0]);
236 }
237
246 Self &
248 {
249 if (--this->m_Offset <= m_SpanEndOffset)
250 {
251 // We have past the beginning of the span (row), need to wrap around.
252
253 // First move forward one pixel, because we are going to use a different
254 // algorithm to compute the next pixel
255 this->m_Offset++;
256
257 // Get the index of the first pixel on the span (row)
259 this->m_Image->ComputeIndex(static_cast<OffsetValueType>(this->m_Offset));
260
261 const typename ImageConstIterator<TImage>::IndexType & startIndex = this->m_Region.GetIndex();
262 const typename ImageConstIterator<TImage>::SizeType & size = this->m_Region.GetSize();
263
264 // Decrement along a row, then wrap at the beginning of the region row.
265
266 // Check to see if we are past the first pixel in the region
267 // Note that --ind[0] moves to the previous pixel along the row.
268 bool done = (--ind[0] == startIndex[0] - 1);
269 for (unsigned int i = 1; done && i < this->ImageIteratorDimension; ++i)
270 {
271 done = (ind[i] == startIndex[i]);
272 }
273
274 // if the iterator is outside the region (but not past region begin) then
275 // we need to wrap around the region
276 unsigned int dim = 0;
277 if (!done)
278 {
279 while ((dim < this->ImageIteratorDimension - 1) && (ind[dim] < startIndex[dim]))
280 {
281 ind[dim] = startIndex[dim] + static_cast<OffsetValueType>(size[dim]) - 1;
282 ind[++dim]--;
283 }
284 }
285 this->m_Offset = this->m_Image->ComputeOffset(ind);
287 m_SpanEndOffset = m_SpanBeginOffset - static_cast<OffsetValueType>(size[0]);
288 }
289 return *this;
290 }
291
300 Self &
302 {
303 if (++this->m_Offset >= m_SpanBeginOffset)
304 {
305 // We have reached the end of the span (row), need to wrap around.
306
307 // First back up one pixel, because we are going to use a different
308 // algorithm to compute the next pixel
309 --this->m_Offset;
310
311 // Get the index of the last pixel on the span (row)
313 this->m_Image->ComputeIndex(static_cast<OffsetValueType>(this->m_Offset));
314
315 const typename ImageIterator<TImage>::IndexType & startIndex = this->m_Region.GetIndex();
316 const typename ImageIterator<TImage>::SizeType & size = this->m_Region.GetSize();
317
318 // Increment along a row, then wrap at the end of the region row.
319 // Check to see if we are past the last pixel in the region
320 // Note that ++ind[0] moves to the next pixel along the row.
321 bool done = (++ind[0] == startIndex[0] + static_cast<OffsetValueType>(size[0]));
322 for (unsigned int i = 1; done && i < this->ImageIteratorDimension; ++i)
323 {
324 done = (ind[i] == startIndex[i] + static_cast<OffsetValueType>(size[i]) - 1);
325 }
326
327 // if the iterator is outside the region (but not past region end) then
328 // we need to wrap around the region
329 unsigned int dim = 0;
330 if (!done)
331 {
332 while ((dim < this->ImageIteratorDimension - 1) &&
333 (ind[dim] > startIndex[dim] + static_cast<OffsetValueType>(size[dim]) - 1))
334 {
335 ind[dim] = startIndex[dim];
336 ind[++dim]++;
337 }
338 }
339 this->m_Offset = this->m_Image->ComputeOffset(ind);
341 m_SpanEndOffset = this->m_Offset - static_cast<OffsetValueType>(size[0]);
342 }
343 return *this;
344 }
345
346protected:
347 SizeValueType m_SpanBeginOffset{}; // offset to last pixel in the row
348 SizeValueType m_SpanEndOffset{}; // offset to one pixel before the row
349};
350} // end namespace itk
351
352#endif
A multi-dimensional image iterator templated over image type.
typename TImage::IndexType IndexType
typename TImage::SizeType SizeType
typename TImage::IndexType IndexType
typename TImage::SizeType SizeType
A multi-dimensional iterator templated over image type that walks a region of pixels.
ImageRegionReverseConstIterator(const ImageRegionIterator< TImage > &it)
ImageRegionReverseConstIterator(const ImageReverseConstIterator< TImage > &it)
ImageRegionReverseConstIterator(const ImageType *ptr, const RegionType &region)
ImageRegionReverseConstIterator(const ImageConstIterator< TImage > &it)
virtual void SetIndex(const IndexType &ind)
static constexpr unsigned int ImageIteratorDimension
typename TImage::AccessorType AccessorType
typename TImage::PixelContainer PixelContainer
typename TImage::InternalPixelType InternalPixelType
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
unsigned long SizeValueType
Definition itkIntTypes.h:86
long OffsetValueType
Definition itkIntTypes.h:97