ITK  5.0.0
Insight Segmentation and Registration Toolkit
itkShapedImageNeighborhoodRange.h
Go to the documentation of this file.
1 /*=========================================================================
2 *
3 * Copyright Insight Software Consortium
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 * http://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 
19 #ifndef itkShapedImageNeighborhoodRange_h
20 #define itkShapedImageNeighborhoodRange_h
21 
22 #include <algorithm> // For copy_n.
23 #include <cassert>
24 #include <cstddef> // For ptrdiff_t.
25 #include <iterator> // For random_access_iterator_tag.
26 #include <limits>
27 #include <type_traits> // For conditional and is_const.
28 
29 #include "itkIndex.h"
30 #include "itkSize.h"
32 
33 namespace itk
34 {
35 namespace Experimental
36 {
37 
92 template<typename TImage,
93  typename TImageNeighborhoodPixelAccessPolicy = ZeroFluxNeumannImageNeighborhoodPixelAccessPolicy<TImage>>
95 {
96 private:
97 
98  // Empty struct, used internally to denote that there is no pixel access parameter specified.
100 
101 
102  // Helper class to estimate whether the policy has nested type PixelAccessParameterType.
104  {
105  private:
106  // The Test function has two overloads whose return type is different.
107  // One of the overloads is only available for overload resolution when
108  // the policy T has a nested type PixelAccessParameterType (using SFINAE).
109 
110  template <typename T>
111  static int Test(typename T::PixelAccessParameterType*);
112 
113  template <typename T>
114  static void Test(...);
115 
116  public:
117  // This constant tells whether the policy has a PixelAccessParameterType:
118  static constexpr bool HasPixelAccessParameterType = ! std::is_same<
119  decltype(Test<TImageNeighborhoodPixelAccessPolicy>(nullptr)),
120  decltype(Test<TImageNeighborhoodPixelAccessPolicy>())>::value;
121  };
122 
123 
124  template <typename TPolicy, bool VPolicyHasPixelAccessParameterType = CheckPolicy::HasPixelAccessParameterType>
126  {
127  using Type = typename TPolicy::PixelAccessParameterType;
128  };
129 
130  // Specialization for when the policy does not have PixelAccessParameterType.
131  template <typename TPolicy>
132  struct OptionalPixelAccessParameter<TPolicy, false>
133  {
135  };
136 
137 
138  using ImageType = TImage;
139  using ImageDimensionType = typename TImage::ImageDimensionType;
140  using ImageSizeType = typename TImage::SizeType;
143  using PixelType = typename TImage::PixelType;
144  using InternalPixelType = typename TImage::InternalPixelType;
145  using NeighborhoodAccessorFunctorType = typename TImage::NeighborhoodAccessorFunctorType;
146  static constexpr ImageDimensionType ImageDimension = TImage::ImageDimension;
147  using IndexType = typename TImage::IndexType;
152 
153 
154  // PixelProxy: internal class that aims to act like a reference to a pixel:
155  // It acts either like 'PixelType &' or like 'const PixelType &', depending
156  // on its boolean template argument, VIsConst.
157  // The proxy retrieves the pixel value using a ImageNeighborhoodPixelAccessPolicy.
158  // Note: the extra TDummy argument aims to fix AppleClang 6.0.0.6000056 error
159  // "explicit specialization of 'PixelProxy'"and GCC 5.4.0 error "explicit
160  // specialization in non-namespace scope".
161  template <bool VIsConst, typename TDummy = void> class PixelProxy {};
162 
163  // PixelProxy specialization for const pixel types:
164  // acts like 'const PixelType &'
165  template <typename TDummy>
166  class PixelProxy<true, TDummy> final
167  {
168  private:
169  // Pointer to the buffer of the image. Should not be null.
171 
172  // Pixel access policy.
173  const TImageNeighborhoodPixelAccessPolicy m_PixelAccessPolicy;
174 
175  public:
176  // Deleted member functions:
177  PixelProxy() = delete;
178  PixelProxy& operator=(const PixelProxy&) = delete;
179 
180  // Explicitly-defaulted member functions:
181  PixelProxy(const PixelProxy&) ITK_NOEXCEPT = default;
182  ~PixelProxy() = default;
183 
184  // Constructor, called directly by operator*() of the iterator class.
186  const InternalPixelType* const imageBufferPointer,
187  const TImageNeighborhoodPixelAccessPolicy& pixelAccessPolicy) ITK_NOEXCEPT
188  :
189  m_ImageBufferPointer{imageBufferPointer},
190  m_PixelAccessPolicy{pixelAccessPolicy}
191  {
192  }
193 
194  // Allows implicit conversion from non-const to const proxy.
195  PixelProxy(const PixelProxy<false>& pixelProxy) ITK_NOEXCEPT
196  :
197  m_ImageBufferPointer{ pixelProxy.m_ImageBufferPointer },
198  m_PixelAccessPolicy{ pixelProxy.m_PixelAccessPolicy}
199  {
200  }
201 
202  // Conversion operator.
203  operator PixelType() const ITK_NOEXCEPT
204  {
205  return m_PixelAccessPolicy.GetPixelValue(m_ImageBufferPointer);
206  }
207  };
208 
209 
210  // PixelProxy specialization for non-const pixel types:
211  // acts like 'PixelType &'.
212  template <typename TDummy>
213  class PixelProxy<false, TDummy> final
214  {
215  private:
216  // The const proxy is a friend, to ease implementing conversion from
217  // a non-const proxy to a const proxy.
218  friend class PixelProxy<true>;
219 
220  // Pointer to the buffer of the image. Should not be null.
222 
223  // Pixel access policy.
224  const TImageNeighborhoodPixelAccessPolicy m_PixelAccessPolicy;
225 
226  public:
227  // Deleted member functions:
228  PixelProxy() = delete;
229 
230  // Explicitly-defaulted member functions:
231  ~PixelProxy() = default;
232  PixelProxy(const PixelProxy&) ITK_NOEXCEPT = default;
233 
234  // Constructor, called directly by operator*() of the iterator class.
236  InternalPixelType* const imageBufferPointer,
237  const TImageNeighborhoodPixelAccessPolicy& pixelAccessPolicy) ITK_NOEXCEPT
238  :
239  m_ImageBufferPointer{imageBufferPointer},
240  m_PixelAccessPolicy{pixelAccessPolicy}
241  {
242  }
243 
244  // Conversion operator.
245  operator PixelType() const ITK_NOEXCEPT
246  {
247  return m_PixelAccessPolicy.GetPixelValue(m_ImageBufferPointer);
248  }
249 
250  // Operator to assign a pixel value to the proxy.
251  PixelProxy& operator=(const PixelType& pixelValue) ITK_NOEXCEPT
252  {
253  m_PixelAccessPolicy.SetPixelValue(m_ImageBufferPointer, pixelValue);
254  return *this;
255  }
256 
257  // Copy-assignment operator.
258  PixelProxy& operator=(const PixelProxy& pixelProxy) ITK_NOEXCEPT
259  {
260  // Note that this assignment operator only copies the pixel value.
261  // That is the normal behavior when a reference is assigned to another.
262  const PixelType pixelValue = pixelProxy;
263  *this = pixelValue;
264  return *this;
265  }
266 
267 
268  friend void swap(PixelProxy lhs, PixelProxy rhs) ITK_NOEXCEPT
269  {
270  const auto lhsPixelValue = lhs.m_PixelAccessPolicy.GetPixelValue(lhs.m_ImageBufferPointer);
271  const auto rhsPixelValue = rhs.m_PixelAccessPolicy.GetPixelValue(rhs.m_ImageBufferPointer);
272 
273  // Swap only the pixel values, not the image buffer pointers!
274  lhs.m_PixelAccessPolicy.SetPixelValue(lhs.m_ImageBufferPointer, rhsPixelValue);
275  rhs.m_PixelAccessPolicy.SetPixelValue(rhs.m_ImageBufferPointer, lhsPixelValue);
276  }
277  };
278 
279 
292  template <bool VIsConst>
293  class QualifiedIterator final
294  {
295  private:
296  // Const and non-const iterators are friends, in order to implement the
297  // constructor that allow conversion from non-const to const iterator.
298  friend class QualifiedIterator<!VIsConst>;
299 
300  // ShapedImageNeighborhoodRange is a friend, as it should be the only one that can
301  // directly use the private constructor of the iterator.
303 
304  // Image type class that is either 'const' or non-const qualified, depending on QualifiedIterator and TImage.
305  using QualifiedImageType = typename std::conditional<VIsConst, const ImageType, ImageType>::type;
306 
307  static constexpr bool IsImageTypeConst = std::is_const<QualifiedImageType>::value;
308 
309  using QualifiedInternalPixelType = typename std::conditional<IsImageTypeConst, const InternalPixelType, InternalPixelType>::type;
310 
311  // Pixel type class that is either 'const' or non-const qualified, depending on QualifiedImageType.
312  using QualifiedPixelType = typename std::conditional<IsImageTypeConst, const PixelType, PixelType>::type;
313 
314  // Pointer to the buffer of the image. Only null when the iterator is default-constructed.
316 
317  // Image size.
319 
320  // A copy of the offset table of the image.
322 
323  // The accessor of the image.
325 
327 
328  // The pixel coordinates of the location of the neighborhood, relative to
329  // the index of the first pixel of the buffered region. Note that this
330  // location does not have to be within buffered region. It may also be
331  // outside the image.
333 
334  const OffsetType* m_CurrentOffset = nullptr;
335 
336  // Private constructor, used to create the begin and the end iterator of a range.
337  // Only used by its friend class ShapedImageNeighborhoodRange.
339  QualifiedInternalPixelType* const imageBufferPointer,
340  const ImageSizeType& imageSize,
341  const OffsetType& offsetTable,
342  const NeighborhoodAccessorFunctorType& neighborhoodAccessor,
343  const OptionalPixelAccessParameterType optionalPixelAccessParameter,
344  const IndexType& relativeLocation,
345  const OffsetType* const offset) ITK_NOEXCEPT
346  :
347  m_ImageBufferPointer{ imageBufferPointer },
348  // Note: Use parentheses instead of curly braces to initialize data members,
349  // to avoid AppleClang 6.0.0.6000056 compilation error, "no viable conversion..."
350  m_ImageSize(imageSize),
351  m_OffsetTable(offsetTable),
352  m_NeighborhoodAccessor(neighborhoodAccessor),
353  m_OptionalPixelAccessParameter(optionalPixelAccessParameter),
354  m_RelativeLocation(relativeLocation),
355  m_CurrentOffset{offset}
356  {
357  }
358 
359 
360  TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy(EmptyPixelAccessParameter) const
361  {
362  return TImageNeighborhoodPixelAccessPolicy{ m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_RelativeLocation + *m_CurrentOffset };
363  }
364 
365  template <typename TPixelAccessParameter>
366  TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy(const TPixelAccessParameter pixelAccessParameter) const
367  {
368  static_assert(std::is_same< TPixelAccessParameter, OptionalPixelAccessParameterType>::value,
369  "This helper function should only be used for OptionalPixelAccessParameterType!");
370  static_assert(!std::is_same< TPixelAccessParameter, EmptyPixelAccessParameter>::value,
371  "EmptyPixelAccessParameter indicates that there is no pixel access parameter specified!");
372  return TImageNeighborhoodPixelAccessPolicy{ m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_RelativeLocation + *m_CurrentOffset, pixelAccessParameter };
373  }
374 
375  public:
376  // Types conforming the iterator requirements of the C++ standard library:
377  using difference_type = std::ptrdiff_t;
381  using iterator_category = std::random_access_iterator_tag;
382 
383 
394  QualifiedIterator() = default;
395 
399  :
400  m_ImageBufferPointer{ arg.m_ImageBufferPointer },
401  // Note: Use parentheses instead of curly braces to initialize data members,
402  // to avoid AppleClang 6.0.0.6000056 compilation error, "no viable conversion..."
403  m_ImageSize(arg.m_ImageSize),
404  m_OffsetTable(arg.m_OffsetTable),
405  m_NeighborhoodAccessor(arg.m_NeighborhoodAccessor),
406  m_OptionalPixelAccessParameter(arg.m_OptionalPixelAccessParameter),
407  m_RelativeLocation(arg.m_RelativeLocation),
408  m_CurrentOffset{arg.m_CurrentOffset}
409  {
410  }
412 
413 
415  reference operator*() const ITK_NOEXCEPT
416  {
418  }
420 
421 
424  {
425  assert(m_CurrentOffset != nullptr);
426  ++m_CurrentOffset;
427  return *this;
428  }
430 
431 
434  QualifiedIterator operator++(int) ITK_NOEXCEPT
435  {
436  auto result = *this;
437  ++(*this);
438  return result;
439  }
441 
442 
445  {
446  assert(m_CurrentOffset != nullptr);
447  --m_CurrentOffset;
448  return *this;
449  }
451 
452 
455  QualifiedIterator operator--(int) ITK_NOEXCEPT
456  {
457  auto result = *this;
458  --(*this);
459  return result;
460  }
462 
463 
467  friend bool operator==(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
468  {
469  assert(lhs.m_ImageBufferPointer == rhs.m_ImageBufferPointer);
470  assert(lhs.m_ImageSize == rhs.m_ImageSize);
471  assert(lhs.m_OffsetTable == rhs.m_OffsetTable);
473 
474  return lhs.m_CurrentOffset == rhs.m_CurrentOffset;
475  }
476 
477 
479  friend bool operator!=(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
480  {
481  // Implemented just like the corresponding std::rel_ops operator.
482  return !(lhs == rhs);
483  }
484 
485 
487  friend bool operator<(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
488  {
489  assert(lhs.m_ImageBufferPointer == rhs.m_ImageBufferPointer);
490  assert(lhs.m_ImageSize == rhs.m_ImageSize);
491  assert(lhs.m_OffsetTable == rhs.m_OffsetTable);
493 
494  return lhs.m_CurrentOffset < rhs.m_CurrentOffset;
495  }
496 
497 
499  friend bool operator>(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
500  {
501  // Implemented just like the corresponding std::rel_ops operator.
502  return rhs < lhs;
503  }
504 
505 
507  friend bool operator<=(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
508  {
509  // Implemented just like the corresponding std::rel_ops operator.
510  return !(rhs < lhs);
511  }
512 
513 
515  friend bool operator>=(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
516  {
517  // Implemented just like the corresponding std::rel_ops operator.
518  return !(lhs < rhs);
519  }
520 
521 
524  {
525  it.m_CurrentOffset += n;
526  return it;
527  }
529 
532  {
533  it += (-n);
534  return it;
535  }
537 
539  friend difference_type operator-(const QualifiedIterator& lhs, const QualifiedIterator& rhs) ITK_NOEXCEPT
540  {
541  assert(lhs.m_ImageBufferPointer == rhs.m_ImageBufferPointer);
542  assert(lhs.m_ImageSize == rhs.m_ImageSize);
543  assert(lhs.m_OffsetTable == rhs.m_OffsetTable);
545 
546  return lhs.m_CurrentOffset - rhs.m_CurrentOffset;
547  }
548 
549 
552  {
553  return it += n;
554  }
555 
556 
559  {
560  return it += n;
561  }
562 
563 
566  {
567  return it += (-n);
568  }
569 
570 
572  reference operator[](const difference_type n) const ITK_NOEXCEPT
573  {
574  return *(*this + n);
575  }
576 
577 
579  QualifiedIterator& operator=(const QualifiedIterator&) ITK_NOEXCEPT = default;
580  };
581 
582  static constexpr bool IsImageTypeConst = std::is_const<TImage>::value;
583 
584  using QualifiedInternalPixelType = typename std::conditional<IsImageTypeConst, const InternalPixelType, InternalPixelType>::type;
585 
586 
587  // Just the data from itk::ImageRegion (not the virtual table)
588  struct RegionData
589  {
590  IndexType m_Index{{}};
591  ImageSizeType m_Size{{}};
592 
593  RegionData() ITK_NOEXCEPT = default;
594 
595  explicit RegionData(const ImageRegionType& imageRegion)
596  :
597  m_Index(imageRegion.GetIndex()),
598  m_Size(imageRegion.GetSize())
599  {
600  }
601  };
602 
603 
604  void SubtractIndex(IndexType& index1, const IndexType& index2)
605  {
606  for (unsigned i = 0; i < ImageDimension; ++i)
607  {
608  index1[i] -= index2[i];
609  }
610  }
611 
612  // ShapedImageNeighborhoodRange data members (strictly private):
613 
614  // Pointer to the buffer of the image.
616 
617  // Index and size of the buffered image region.
619 
620  // A copy of the offset table of the image.
622 
624 
625  // Index (pixel coordinates) of the location of the neighborhood relative
626  // to the origin of the image. Typically it is the location of the
627  // center pixel of the neighborhood. It may be outside the image boundaries.
629 
630  // The offsets relative to m_RelativeLocation that specify the neighborhood shape.
631  const OffsetType* m_ShapeOffsets{ nullptr };
632 
633  // The number of neighborhood pixels.
635 
637 
638 public:
641  using reverse_iterator = std::reverse_iterator<iterator>;
642  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
643 
649  ShapedImageNeighborhoodRange() = default;
650 
659  ImageType& image,
660  const IndexType& location,
661  const OffsetType* const shapeOffsets,
662  const std::size_t numberOfNeigborhoodPixels,
663  const OptionalPixelAccessParameterType optionalPixelAccessParameter = {})
664  :
665  m_ImageBufferPointer{image.ImageType::GetBufferPointer()},
666  // Note: Use parentheses instead of curly braces to initialize data members,
667  // to avoid AppleClang 6.0.0.6000056 compile errors, "no viable conversion..."
668  // and "excess elements in struct initializer".
669  m_BufferedRegionData(image.ImageType::GetBufferedRegion()),
670  m_NeighborhoodAccessor(image.GetNeighborhoodAccessor()),
671  m_RelativeLocation(location),
672  m_ShapeOffsets{ shapeOffsets },
673  m_NumberOfNeighborhoodPixels{ numberOfNeigborhoodPixels },
674  m_OptionalPixelAccessParameter(optionalPixelAccessParameter)
675  {
676  const OffsetValueType* const offsetTable = image.GetOffsetTable();
677  assert(offsetTable != nullptr);
679 
680  std::copy_n(offsetTable, ImageDimension, m_OffsetTable.begin());
681 
684  }
685 
695  template <typename TContainerOfOffsets>
697  ImageType& image,
698  const IndexType& location,
699  const TContainerOfOffsets& shapeOffsets,
700  const OptionalPixelAccessParameterType optionalPixelAccessParameter = {})
701  :
703  {
704  image,
705  location,
706  shapeOffsets.data(),
707  shapeOffsets.size(),
708  optionalPixelAccessParameter
709  }
710  {
711  }
713 
715  iterator begin() const ITK_NOEXCEPT
716  {
717  return iterator
718  {
726  };
727  }
728 
730  iterator end() const ITK_NOEXCEPT
731  {
732  return iterator
733  {
741  };
742  }
743 
746  const_iterator cbegin() const ITK_NOEXCEPT
747  {
748  return this->begin();
749  }
750 
752  const_iterator cend() const ITK_NOEXCEPT
753  {
754  return this->end();
755  }
756 
758  reverse_iterator rbegin() const ITK_NOEXCEPT
759  {
760  return reverse_iterator(this->end());
761  }
762 
764  reverse_iterator rend() const ITK_NOEXCEPT
765  {
766  return reverse_iterator(this->begin());
767  }
768 
770  const_reverse_iterator crbegin() const ITK_NOEXCEPT
771  {
772  return this->rbegin();
773  }
774 
776  const_reverse_iterator crend() const ITK_NOEXCEPT
777  {
778  return this->rend();
779  }
780 
781 
783  std::size_t size() const ITK_NOEXCEPT
784  {
786  }
787 
788 
790  bool empty() const ITK_NOEXCEPT
791  {
792  return m_NumberOfNeighborhoodPixels == 0;
793  }
794 
795 
801  typename QualifiedIterator<false>::reference operator[](const std::size_t n) const ITK_NOEXCEPT
802  {
803  assert(n < this->size());
804  assert(n <= static_cast<std::size_t>(std::numeric_limits<std::ptrdiff_t>::max()));
806 
807  return this->begin()[static_cast<std::ptrdiff_t>(n)];
808  }
809 
810 
814  void SetLocation(const IndexType& location) ITK_NOEXCEPT
815  {
816  m_RelativeLocation = location;
818  }
819 };
821 
822 
823 } // namespace Experimental
824 } // namespace itk
825 
826 #endif
QualifiedIterator(QualifiedInternalPixelType *const imageBufferPointer, const ImageSizeType &imageSize, const OffsetType &offsetTable, const NeighborhoodAccessorFunctorType &neighborhoodAccessor, const OptionalPixelAccessParameterType optionalPixelAccessParameter, const IndexType &relativeLocation, const OffsetType *const offset) noexcept
TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy(EmptyPixelAccessParameter) const
TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy(const TPixelAccessParameter pixelAccessParameter) const
typename OptionalPixelAccessParameter< TImageNeighborhoodPixelAccessPolicy >::Type OptionalPixelAccessParameterType
unsigned long SizeValueType
Definition: itkIntTypes.h:83
typename std::conditional< IsImageTypeConst, const PixelType, PixelType >::type QualifiedPixelType
QualifiedIterator< false >::reference operator[](const std::vcl_size_t n) const noexcept
static int Test(typename T::PixelAccessParameterType *)
friend QualifiedIterator operator-(QualifiedIterator it, const difference_type n) noexcept
friend bool operator!=(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
friend QualifiedIterator operator+(const difference_type n, QualifiedIterator it) noexcept
void SubtractIndex(IndexType &index1, const IndexType &index2)
typename std::conditional< IsImageTypeConst, const InternalPixelType, InternalPixelType >::type QualifiedInternalPixelType
friend difference_type operator-(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
friend bool operator<(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
signed long IndexValueType
Definition: itkIntTypes.h:90
friend QualifiedIterator & operator-=(QualifiedIterator &it, const difference_type n) noexcept
friend bool operator>=(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
typename std::conditional< VIsConst, const ImageType, ImageType >::type QualifiedImageType
friend QualifiedIterator & operator+=(QualifiedIterator &it, const difference_type n) noexcept
iterator begin()
Definition: itkOffset.h:294
friend QualifiedIterator operator+(QualifiedIterator it, const difference_type n) noexcept
friend bool operator>(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
ShapedImageNeighborhoodRange(ImageType &image, const IndexType &location, const TContainerOfOffsets &shapeOffsets, const OptionalPixelAccessParameterType optionalPixelAccessParameter={})
typename TImage::NeighborhoodAccessorFunctorType NeighborhoodAccessorFunctorType
friend bool operator==(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
ShapedImageNeighborhoodRange(ImageType &image, const IndexType &location, const OffsetType *const shapeOffsets, const std::vcl_size_t numberOfNeigborhoodPixels, const OptionalPixelAccessParameterType optionalPixelAccessParameter={})
QualifiedIterator & operator=(const QualifiedIterator &) noexcept=default
typename std::conditional< IsImageTypeConst, const InternalPixelType, InternalPixelType >::type QualifiedInternalPixelType
friend bool operator<=(const QualifiedIterator &lhs, const QualifiedIterator &rhs) noexcept
signed long OffsetValueType
Definition: itkIntTypes.h:94
std::reverse_iterator< const_iterator > const_reverse_iterator