Skip to content

Commit aff0a03

Browse files
authored
Merge pull request #5812 from N-Dekker/MakeIndexRange
Add `itk::MakeIndexRange` functions and use them
2 parents 2253b91 + 3a00f63 commit aff0a03

14 files changed

Lines changed: 63 additions & 33 deletions

Modules/Core/Common/include/itkBSplineInterpolationWeightFunction.hxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ BSplineInterpolationWeightFunction<TCoordinate, VSpaceDimension, VSplineOrder>::
4949
{
5050
static constexpr auto offsetToIndexTable = [] {
5151
FixedArray<IndexType, NumberOfWeights> table{};
52-
auto indexIterator = ZeroBasedIndexRange<SpaceDimension>(SupportSize).cbegin();
52+
auto indexIterator = MakeIndexRange(SupportSize).cbegin();
5353

5454
for (size_t i{}; i < NumberOfWeights; ++i)
5555
{

Modules/Core/Common/include/itkIndexRange.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ namespace itk
4141
\code
4242
constexpr unsigned int Dimension{ 2 };
4343
const Size<Dimension> size = { {2, 3} };
44-
const ZeroBasedIndexRange<Dimension> indexRange{ size };
4544
46-
for (const Index<Dimension> index : indexRange)
45+
for (const Index<Dimension> index : MakeIndexRange(size))
4746
{
4847
std::cout << index;
4948
}
@@ -474,6 +473,30 @@ using ImageRegionIndexRange = IndexRange<VDimension, false>;
474473
template <unsigned int VDimension>
475474
using ZeroBasedIndexRange = IndexRange<VDimension, true>;
476475

476+
/* Creates a range of indices for the specified grid size. */
477+
template <unsigned int VDimension>
478+
[[nodiscard]] constexpr auto
479+
MakeIndexRange(const Size<VDimension> & gridSize)
480+
{
481+
return ZeroBasedIndexRange<VDimension>(gridSize);
482+
}
483+
484+
/* Creates a range of indices for the specified image region. */
485+
template <unsigned int VDimension>
486+
[[nodiscard]] auto
487+
MakeIndexRange(const ImageRegion<VDimension> & imageRegion)
488+
{
489+
return ImageRegionIndexRange<VDimension>(imageRegion);
490+
}
491+
492+
/* Creates a range of indices for the image region specified by its index and size. */
493+
template <unsigned int VDimension>
494+
[[nodiscard]] auto
495+
MakeIndexRange(const Index<VDimension> & imageRegionIndex, const Size<VDimension> & imageRegionSize)
496+
{
497+
return ImageRegionIndexRange<VDimension>(ImageRegion<VDimension>{ imageRegionIndex, imageRegionSize });
498+
}
499+
477500
} // namespace itk
478501

479502
#endif

Modules/Core/Common/include/itkSobelOperator.hxx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ SobelOperator<TPixel, VDimension, TAllocator>::Fill(const CoefficientVector & co
3939
using IndexType = Index<VDimension>;
4040

4141
unsigned int coeff_index = 0;
42-
for (const IndexType & index :
43-
ImageRegionIndexRange<VDimension>(ImageRegion{ IndexType::Filled(-1), SizeType::Filled(3) }))
42+
for (const IndexType & index : MakeIndexRange(IndexType::Filled(-1), SizeType::Filled(3)))
4443
{
4544
auto pos = static_cast<int>(center);
4645

Modules/Core/Common/test/itkImageRegionGTest.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ TEST(ImageRegion, OneSizedRegionIsInsideIffItsIndexIsInside)
104104
auto paddedRegion = region;
105105
paddedRegion.PadByRadius(1);
106106

107-
for (const auto & index : itk::ImageRegionIndexRange<RegionType::ImageDimension>(paddedRegion))
107+
for (const auto & index : itk::MakeIndexRange(paddedRegion))
108108
{
109109
const RegionType oneSizedRegion{ index, SizeType::Filled(1) };
110110

Modules/Core/Common/test/itkIndexRangeGTest.cxx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,26 @@ template class itk::IndexRange<2, false>;
3535

3636
using itk::IndexRange;
3737
using itk::ImageRegionIndexRange;
38+
using itk::MakeIndexRange;
3839
using itk::ZeroBasedIndexRange;
3940
using itk::RangeGTestUtilities;
4041

4142

4243
static_assert(sizeof(ZeroBasedIndexRange<3>) < sizeof(ImageRegionIndexRange<3>),
4344
"ZeroBasedIndexRange does not need to store the index of a region, so it should take less memory.");
4445

46+
static_assert(std::is_same_v<decltype(MakeIndexRange(itk::Size<2>{})), ZeroBasedIndexRange<2>> &&
47+
std::is_same_v<decltype(MakeIndexRange(itk::Size<3>{})), ZeroBasedIndexRange<3>>,
48+
"MakeIndexRange(size) should return a ZeroBasedIndexRange.");
49+
50+
static_assert(std::is_same_v<decltype(MakeIndexRange(itk::ImageRegion<2>{})), ImageRegionIndexRange<2>> &&
51+
std::is_same_v<decltype(MakeIndexRange(itk::ImageRegion<3>{})), ImageRegionIndexRange<3>>,
52+
"MakeIndexRange(imageRegion) should return an ImageRegionIndexRange.");
53+
54+
static_assert(std::is_same_v<decltype(MakeIndexRange(itk::Index<2>{}, itk::Size<2>{})), ImageRegionIndexRange<2>> &&
55+
std::is_same_v<decltype(MakeIndexRange(itk::Index<3>{}, itk::Size<3>{})), ImageRegionIndexRange<3>>,
56+
"MakeIndexRange(index, size) should return an ImageRegionIndexRange.");
57+
4558
namespace
4659
{
4760
template <unsigned int VDimension>
@@ -107,7 +120,9 @@ ExpectRangeIsEmptyWhenRegionSizeIsZero(std::mt19937 & randomNumberEngine)
107120
const itk::Index<VDimension> randomRegionIndex = GenerateRandomIndex<VDimension>(randomNumberEngine);
108121
const itk::ImageRegion<VDimension> zeroSizedImageRegion{ randomRegionIndex, zeroSize };
109122

110-
EXPECT_TRUE(ImageRegionIndexRange<VDimension>{ zeroSizedImageRegion }.empty());
123+
EXPECT_TRUE(MakeIndexRange(zeroSize).empty());
124+
EXPECT_TRUE(MakeIndexRange(zeroSizedImageRegion).empty());
125+
EXPECT_TRUE(MakeIndexRange(randomRegionIndex, zeroSize).empty());
111126
}
112127

113128

Modules/Core/ImageFunction/test/itkGaussianInterpolateImageFunctionTest.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ itkGaussianInterpolateImageFunctionTest(int, char *[])
5858
image->SetOrigin(origin);
5959
image->SetSpacing(spacing);
6060

61-
for (const auto index : itk::ZeroBasedIndexRange<ImageType::ImageDimension>(size))
61+
for (const auto index : itk::MakeIndexRange(size))
6262
{
6363
image->SetPixel(index, index[0] + index[1]);
6464
}

Modules/Core/ImageFunction/test/itkSumOfSquaresImageFunctionGTest.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Expect_EvaluateAtIndex_returns_zero_when_all_pixels_are_zero(const typename TIma
6464

6565
imageFunction->SetInputImage(image);
6666

67-
for (const auto index : itk::ZeroBasedIndexRange<TImage::ImageDimension>{ imageSize })
67+
for (const auto index : itk::MakeIndexRange(imageSize))
6868
{
6969
EXPECT_EQ(imageFunction->EvaluateAtIndex(index), 0);
7070
}
@@ -88,7 +88,7 @@ Expect_EvaluateAtIndex_returns_number_of_neigbors_when_all_pixels_are_one(const
8888

8989
const auto numberOfNeighbors = std::pow(2.0 * radius + 1.0, TImage::ImageDimension);
9090

91-
for (const auto index : itk::ZeroBasedIndexRange<TImage::ImageDimension>{ imageSize })
91+
for (const auto index : itk::MakeIndexRange(imageSize))
9292
{
9393
EXPECT_EQ(imageFunction->EvaluateAtIndex(index), numberOfNeighbors);
9494
}

Modules/Core/SpatialObjects/test/itkImageMaskSpatialObjectGTest.cxx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,13 @@ Expect_AxisAlignedBoundingBoxRegion_equals_region_of_single_pixel_when_it_is_the
9191
image->SetRegions(imageRegion);
9292
image->AllocateInitialized();
9393

94-
const itk::ImageRegionIndexRange<VImageDimension> indexRange{ imageRegion };
95-
9694
// Expected size: the "region size" of a single pixel (1x1, in 2D, 1x1x1 in 3D).
9795
const itk::Size<VImageDimension> expectedSize = [] {
9896
auto size = itk::Size<VImageDimension>::Filled(1);
9997
return size;
10098
}();
10199

102-
for (const auto & index : indexRange)
100+
for (const auto & index : MakeIndexRange(imageRegion))
103101
{
104102
// Set only one pixel value non-zero.
105103
image->SetPixel(index, 1);

Modules/Filtering/ImageGradient/test/itkGradientImageFilterGTest.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ TEST(GradientImageFilter, ConstantGradientInputImage)
8787
inputImage->SetRegions(imageSize);
8888
inputImage->Allocate(false);
8989

90-
for (const auto & index : itk::ZeroBasedIndexRange<Dimension>(imageSize))
90+
for (const auto & index : itk::MakeIndexRange(imageSize))
9191
{
9292
// A constant gradient along the first dimension of the image.
9393
inputImage->SetPixel(index, static_cast<PixelType>(inputGradientValue * index[0]));
@@ -102,7 +102,7 @@ TEST(GradientImageFilter, ConstantGradientInputImage)
102102
// Only look at the inner region, to avoid boundary effects (which are beyond the scope of this unit test).
103103
const itk::ImageRegion innerRegion{ IndexType::Filled(1), imageSize - SizeType::Filled(2) };
104104

105-
for (const auto & index : itk::ImageRegionIndexRange<Dimension>(innerRegion))
105+
for (const auto & index : itk::MakeIndexRange(innerRegion))
106106
{
107107
const auto outputPixelValue = output.GetPixel(index);
108108

Modules/Filtering/Path/include/itkContourExtractor2DImageFilter.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ class ITK_TEMPLATE_EXPORT ContourExtractor2DImageFilter
145145
using InputRealType = typename NumericTraits<InputPixelType>::RealType;
146146

147147
/** Ranges and iterators for regions */
148-
using RegionIndexRange = ImageRegionIndexRange<InputImageType::ImageDimension>;
148+
#ifndef ITK_FUTURE_LEGACY_REMOVE
149+
using RegionIndexRange ITK_FUTURE_DEPRECATED(
150+
"Please use `itk::ImageRegionIndexRange` or `itk::MakeIndexRange` directly!") =
151+
ImageRegionIndexRange<InputImageType::ImageDimension>;
152+
#endif
149153
using RegionRange = ImageRegionRange<InputImageType>;
150154
using RegionConstRange = ImageRegionRange<const InputImageType>;
151155

0 commit comments

Comments
 (0)