@@ -35,6 +35,16 @@ namespace itk
3535namespace Experimental
3636{
3737
38+ /* *
39+ * \class EmptyPixelAccessParameter
40+ * Empty struct, used by ShapedImageNeighborhoodRange to denote that
41+ * there is no pixel access parameter specified.
42+ *
43+ * \ingroup ImageIterators
44+ * \ingroup ITKCommon
45+ */
46+ struct EmptyPixelAccessParameter {};
47+
3848/* *
3949 * \class ShapedImageNeighborhoodRange
4050 * Modern C++11 range to iterate over a neighborhood of pixels.
@@ -90,7 +100,8 @@ namespace Experimental
90100 * \ingroup ITKCommon
91101 */
92102template <typename TImage,
93- typename TImageNeighborhoodPixelAccessPolicy = ZeroFluxNeumannImageNeighborhoodPixelAccessPolicy<TImage>>
103+ typename TImageNeighborhoodPixelAccessPolicy = ZeroFluxNeumannImageNeighborhoodPixelAccessPolicy<TImage>,
104+ typename TOptionalPixelAccessParameter = EmptyPixelAccessParameter>
94105class ShapedImageNeighborhoodRange final
95106{
96107private:
@@ -139,13 +150,10 @@ class ShapedImageNeighborhoodRange final
139150 // Constructor, called directly by operator*() of the iterator class.
140151 PixelProxy (
141152 const InternalPixelType* const imageBufferPointer,
142- const ImageSizeType& imageSize,
143- const OffsetType& offsetTable,
144- const NeighborhoodAccessorFunctorType& neighborhoodAccessor,
145- const IndexType& pixelIndex) ITK_NOEXCEPT
153+ const TImageNeighborhoodPixelAccessPolicy& pixelAccessPolicy) ITK_NOEXCEPT
146154 :
147155 m_ImageBufferPointer{imageBufferPointer},
148- m_PixelAccessPolicy{ imageSize, offsetTable, neighborhoodAccessor, pixelIndex }
156+ m_PixelAccessPolicy{pixelAccessPolicy }
149157 {
150158 }
151159
@@ -192,13 +200,10 @@ class ShapedImageNeighborhoodRange final
192200 // Constructor, called directly by operator*() of the iterator class.
193201 PixelProxy (
194202 InternalPixelType* const imageBufferPointer,
195- const ImageSizeType& imageSize,
196- const OffsetType& offsetTable,
197- const NeighborhoodAccessorFunctorType& neighborhoodAccessor,
198- const IndexType& pixelIndex) ITK_NOEXCEPT
203+ const TImageNeighborhoodPixelAccessPolicy& pixelAccessPolicy) ITK_NOEXCEPT
199204 :
200205 m_ImageBufferPointer{imageBufferPointer},
201- m_PixelAccessPolicy{ imageSize, offsetTable, neighborhoodAccessor, pixelIndex }
206+ m_PixelAccessPolicy{pixelAccessPolicy }
202207 {
203208 }
204209
@@ -284,6 +289,8 @@ class ShapedImageNeighborhoodRange final
284289 // The accessor of the image.
285290 NeighborhoodAccessorFunctorType m_NeighborhoodAccessor;
286291
292+ TOptionalPixelAccessParameter m_OptionalPixelAccessParameter;
293+
287294 // The pixel coordinates of the location of the neighborhood.
288295 // May be outside the image!
289296 IndexType m_Location = { {} };
@@ -297,6 +304,7 @@ class ShapedImageNeighborhoodRange final
297304 const ImageSizeType& imageSize,
298305 const OffsetType& offsetTable,
299306 const NeighborhoodAccessorFunctorType& neighborhoodAccessor,
307+ const TOptionalPixelAccessParameter optionalPixelAccessParameter,
300308 const IndexType& location,
301309 const OffsetType* const offset) ITK_NOEXCEPT
302310 :
@@ -306,12 +314,29 @@ class ShapedImageNeighborhoodRange final
306314 m_ImageSize (imageSize),
307315 m_OffsetTable (offsetTable),
308316 m_NeighborhoodAccessor (neighborhoodAccessor),
317+ m_OptionalPixelAccessParameter (optionalPixelAccessParameter),
309318 m_Location (location),
310319 m_CurrentOffset{offset}
311320 {
312321 assert (m_ImageBufferPointer != nullptr );
313322 }
314323
324+
325+ TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy (EmptyPixelAccessParameter) const
326+ {
327+ return TImageNeighborhoodPixelAccessPolicy{ m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_Location + *m_CurrentOffset };
328+ }
329+
330+ template <typename TPixelAccessParameter>
331+ TImageNeighborhoodPixelAccessPolicy CreatePixelAccessPolicy (const TPixelAccessParameter pixelAccessParameter) const
332+ {
333+ static_assert (std::is_same< TPixelAccessParameter, TOptionalPixelAccessParameter>::value,
334+ " This helper function should only be used for TOptionalPixelAccessParameter!" );
335+ static_assert (!std::is_same< TPixelAccessParameter, EmptyPixelAccessParameter>::value,
336+ " EmptyPixelAccessParameter indicates that there is no pixel access parameter specified!" );
337+ return TImageNeighborhoodPixelAccessPolicy{ m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_Location + *m_CurrentOffset, pixelAccessParameter };
338+ }
339+
315340 public:
316341 // Types conforming the iterator requirements of the C++ standard library:
317342 using difference_type = std::ptrdiff_t ;
@@ -347,7 +372,7 @@ class ShapedImageNeighborhoodRange final
347372 /* * Returns a reference to the current pixel. */
348373 reference operator *() const ITK_NOEXCEPT
349374 {
350- return reference{m_ImageBufferPointer, m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_Location + *m_CurrentOffset };
375+ return reference{m_ImageBufferPointer, CreatePixelAccessPolicy (m_OptionalPixelAccessParameter) };
351376 }
352377
353378
@@ -535,6 +560,8 @@ class ShapedImageNeighborhoodRange final
535560 // The number of neighborhood pixels.
536561 const std::size_t m_NumberOfNeighborhoodPixels;
537562
563+ const TOptionalPixelAccessParameter m_OptionalPixelAccessParameter;
564+
538565public:
539566 using const_iterator = QualifiedIterator<true >;
540567 using iterator = QualifiedIterator<false >;
@@ -549,7 +576,8 @@ class ShapedImageNeighborhoodRange final
549576 ImageType& image,
550577 const IndexType& location,
551578 const OffsetType* const shapeOffsets,
552- const std::size_t numberOfNeigborhoodPixels)
579+ const std::size_t numberOfNeigborhoodPixels,
580+ const TOptionalPixelAccessParameter optionalPixelAccessParameter = {})
553581 :
554582 m_ImageBufferPointer{image.ImageType ::GetBufferPointer ()},
555583 // Note: Use parentheses instead of curly braces to initialize data members,
@@ -559,7 +587,8 @@ class ShapedImageNeighborhoodRange final
559587 m_NeighborhoodAccessor (image.GetNeighborhoodAccessor()),
560588 m_Location (location),
561589 m_ShapeOffsets{ shapeOffsets },
562- m_NumberOfNeighborhoodPixels{ numberOfNeigborhoodPixels }
590+ m_NumberOfNeighborhoodPixels{ numberOfNeigborhoodPixels },
591+ m_OptionalPixelAccessParameter (optionalPixelAccessParameter)
563592 {
564593 assert (m_ImageBufferPointer != nullptr );
565594 const OffsetValueType* const offsetTable = image.GetOffsetTable ();
@@ -580,13 +609,17 @@ class ShapedImageNeighborhoodRange final
580609 ShapedImageNeighborhoodRange (
581610 ImageType& image,
582611 const IndexType& location,
583- TContainerOfOffsets&& shapeOffsets)
612+ TContainerOfOffsets&& shapeOffsets,
613+ const TOptionalPixelAccessParameter optionalPixelAccessParameter = {})
584614 :
585- ShapedImageNeighborhoodRange{
615+ ShapedImageNeighborhoodRange
616+ {
586617 image,
587618 location,
588619 shapeOffsets.data (),
589- shapeOffsets.size ()}
620+ shapeOffsets.size (),
621+ optionalPixelAccessParameter
622+ }
590623 {
591624 static_assert (!std::is_rvalue_reference<decltype (shapeOffsets)>::value,
592625 " The container of offsets should not be a temporary (rvalue) object!" );
@@ -596,14 +629,14 @@ class ShapedImageNeighborhoodRange final
596629 iterator begin () const ITK_NOEXCEPT
597630 {
598631 assert (m_ImageBufferPointer != nullptr );
599- return iterator (m_ImageBufferPointer, m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_Location, m_ShapeOffsets);
632+ return iterator (m_ImageBufferPointer, m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_OptionalPixelAccessParameter, m_Location, m_ShapeOffsets);
600633 }
601634
602635 /* * Returns an 'end iterator' for this range. */
603636 iterator end () const ITK_NOEXCEPT
604637 {
605638 assert (m_ImageBufferPointer != nullptr );
606- return iterator (m_ImageBufferPointer, m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_Location, m_ShapeOffsets + m_NumberOfNeighborhoodPixels);
639+ return iterator (m_ImageBufferPointer, m_ImageSize, m_OffsetTable, m_NeighborhoodAccessor, m_OptionalPixelAccessParameter, m_Location, m_ShapeOffsets + m_NumberOfNeighborhoodPixels);
607640 }
608641
609642 /* * Returns a const iterator to the first neighborhood pixel.
0 commit comments