ITK 6.0.0
Insight Toolkit
 
Loading...
Searching...
No Matches
itkImageReverseConstIterator.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 itkImageReverseConstIterator_h
19#define itkImageReverseConstIterator_h
20
21#include "itkSize.h"
23#include <memory>
24#include <type_traits> // For remove_const_t.
25
26namespace itk
27{
87template <typename TImage>
88class ITK_TEMPLATE_EXPORT ImageReverseConstIterator
89{
90public:
93
98 static constexpr unsigned int ImageIteratorDimension = TImage::ImageDimension;
99
101 itkVirtualGetNameOfClassMacro(ImageReverseConstIterator);
102
104 using IndexType = typename TImage::IndexType;
105
107 using SizeType = typename TImage::SizeType;
108
110 using OffsetType = typename TImage::OffsetType;
111
113 using RegionType = typename TImage::RegionType;
114
116 using ImageType = TImage;
121 using PixelContainer = typename TImage::PixelContainer;
122 using PixelContainerPointer = typename PixelContainer::Pointer;
123
125 using InternalPixelType = typename TImage::InternalPixelType;
126
128 using PixelType = typename TImage::PixelType;
129
132 using AccessorType = typename TImage::AccessorType;
135 using AccessorFunctorType = typename TImage::AccessorFunctorType;
136
146
148 virtual ~ImageReverseConstIterator() = default;
149
153 : m_Image(it.m_Image)
154 , m_Region(it.m_Region)
155 , m_Offset(it.m_Offset)
158 , m_Buffer(it.m_Buffer)
161 {
162 // copy the smart pointer
163
164
166 }
167
170 ImageReverseConstIterator(const TImage * ptr, const RegionType & region)
171 : m_Image(ptr)
172 , m_Region(region)
173 , m_Buffer(m_Image->GetBufferPointer())
174 {
175
176
177 // Compute the end offset, one pixel before the first pixel
178 SizeValueType offset = m_Image->ComputeOffset(m_Region.GetIndex());
179 m_EndOffset = offset - 1;
180
181 // Compute the begin offset, the last pixel in the region
182 IndexType ind(m_Region.GetIndex());
183 SizeType size(m_Region.GetSize());
184 for (unsigned int i = 0; i < TImage::ImageDimension; ++i)
185 {
186 ind[i] += (size[i] - 1);
187 }
188 m_BeginOffset = m_Image->ComputeOffset(ind);
190
191 m_PixelAccessor = ptr->GetPixelAccessor();
192 m_PixelAccessorFunctor.SetPixelAccessor(m_PixelAccessor);
194 }
195
204 : m_Image(it.GetImage())
205 , m_Region(it.GetRegion())
206 , m_EndOffset(m_Image->ComputeOffset(m_Region.GetIndex()) - 1)
207 , m_Buffer(m_Image->GetBufferPointer())
208 {
209
210
211 const IndexType ind = it.ComputeIndex();
212
213 m_Offset = m_Image->ComputeOffset(ind);
214
215 // Compute the end offset, one pixel before the first pixel
216
217
218 // Compute the begin offset, the last pixel in the region
219 IndexType regInd(m_Region.GetIndex());
220 SizeType regSize(m_Region.GetSize());
221 for (unsigned int i = 0; i < TImage::ImageDimension; ++i)
222 {
223 regInd[i] += (regSize[i] - 1);
224 }
225 m_BeginOffset = m_Image->ComputeOffset(regInd);
226
227 m_PixelAccessor = m_Image->GetPixelAccessor();
228 m_PixelAccessorFunctor.SetPixelAccessor(m_PixelAccessor);
230 }
231
234 Self &
235 operator=(const Self & it)
236 {
237 if (this != &it)
238 {
239 m_Image = it.m_Image; // copy the smart pointer
240 m_Region = it.m_Region;
241
242 m_Buffer = it.m_Buffer;
243 m_Offset = it.m_Offset;
247 m_PixelAccessorFunctor.SetPixelAccessor(m_PixelAccessor);
249 }
250 return *this;
251 }
252
255 Self &
257 {
258 m_Image = it.GetImage();
259 m_Region = it.GetRegion();
260 m_Buffer = m_Image->GetBufferPointer();
261
262 IndexType ind = it.GetIndex();
263
264 m_Offset = m_Image->ComputeOffset(ind);
265
266 // Compute the end offset, one pixel before the first pixel
267 m_EndOffset = m_Image->ComputeOffset(m_Region.GetIndex()) - 1;
268
269 // Compute the begin offset, the last pixel in the region
270 IndexType regInd(m_Region.GetIndex());
271 SizeType regSize(m_Region.GetSize());
272 for (unsigned int i = 0; i < TImage::ImageDimension; ++i)
273 {
274 regInd[i] += (regSize[i] - 1);
275 }
276 m_BeginOffset = m_Image->ComputeOffset(regInd);
277
278 m_PixelAccessor = m_Image->GetPixelAccessor();
279 m_PixelAccessorFunctor.SetPixelAccessor(m_PixelAccessor);
281 return *this;
282 }
283
285 static unsigned int
287 {
288 return TImage::ImageDimension;
289 }
290
293 bool
294 operator==(const Self & it) const
295 {
296 // two iterators are the same if they "point to" the same memory location
297 return (m_Buffer + m_Offset) == (it.m_Buffer + it.m_Offset);
298 }
299
301
302
307 const IndexType
309 {
310 return m_Image->ComputeIndex(m_Offset);
311 }
312
315 virtual void
316 SetIndex(const IndexType & ind)
317 {
318 m_Offset = m_Image->ComputeOffset(ind);
319 }
320
323 [[nodiscard]] const RegionType &
324 GetRegion() const
325 {
326 return m_Region;
327 }
328
330 [[nodiscard]] const PixelType
331 Get() const
332 {
334 }
335
337 void
338 Set(const PixelType & value) const
339 {
340 this->m_PixelAccessorFunctor.Set(*(const_cast<InternalPixelType *>(this->m_Buffer + this->m_Offset)), value);
341 }
342
346 [[nodiscard]] const PixelType &
347 Value() const
348 {
349 return *(m_Buffer + m_Offset);
350 }
351
355 const PixelType &
357 {
358 return *(m_Buffer + m_Offset);
359 }
360
363 void
365 {
367 }
368
371 void
373 {
375 }
376
379 [[nodiscard]] bool
380 IsAtBegin() const
381 {
382 return m_Offset == m_BeginOffset;
383 }
384
387 [[nodiscard]] bool
388 IsAtEnd() const
389 {
390 return m_Offset == m_EndOffset;
391 }
392
393protected: // made protected so other iterators can access
394 typename ImageType::ConstWeakPointer m_Image{};
395
396 RegionType m_Region{}; // region to iterate over
397
399 SizeValueType m_BeginOffset{}; // offset to last pixel in region
400 SizeValueType m_EndOffset{}; // offset to one pixel before first pixel
401
403
406};
407
408// Deduction guide for class template argument deduction (CTAD).
409template <typename TImage>
410ImageReverseConstIterator(SmartPointer<TImage>, const typename TImage::RegionType &)
412
413} // end namespace itk
414
415#endif
A multi-dimensional image iterator templated over image type.
const RegionType & GetRegion() const
const ImageType * GetImage() const
typename TImage::PixelContainer PixelContainer
Multi-dimensional image iterator.
virtual void SetIndex(const IndexType &ind)
ImageReverseConstIterator(const ImageConstIterator< TImage > &it)
static constexpr unsigned int ImageIteratorDimension
ImageReverseConstIterator(const TImage *ptr, const RegionType &region)
typename TImage::AccessorFunctorType AccessorFunctorType
Self & operator=(const ImageConstIterator< TImage > &it)
virtual ~ImageReverseConstIterator()=default
typename TImage::AccessorType AccessorType
typename PixelContainer::Pointer PixelContainerPointer
typename TImage::InternalPixelType InternalPixelType
void Set(const PixelType &value) const
Implements transparent reference counting.
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
unsigned long SizeValueType
Definition itkIntTypes.h:86
ImageReverseConstIterator(SmartPointer< TImage >, const typename TImage::RegionType &) -> ImageReverseConstIterator< std::remove_const_t< TImage > >