Skip to content

Commit 1a3f4ba

Browse files
committed
ENH: Add itk::MakeIndexRange functions, to ease creating an IndexRange
There are two kinds of IndexRange's: `ZeroBasedIndexRange` is optimized for an image region that has a start index of all zeros. `ImageRegionIndexRange` supports any arbitrary image region, having any arbitrary start index. The overload set of `MakeIndexRange` functions aims to ease creating the most appropriate IndexRange type: - `MakeIndexRange(size)` returns a `ZeroBasedIndexRange` - `MakeIndexRange(imageRegion)` returns an `ImageRegionIndexRange` - `MakeIndexRange(index, size)` returns an `ImageRegionIndexRange` Adjusted the IndexRange unit tests and the Doxygen code example to use `MakeIndexRange`.
1 parent b5fa7be commit 1a3f4ba

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

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/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

0 commit comments

Comments
 (0)