diff --git a/Modules/Core/Common/include/itkIndex.h b/Modules/Core/Common/include/itkIndex.h index 754bc27dbdb..ac5972f9a57 100644 --- a/Modules/Core/Common/include/itkIndex.h +++ b/Modules/Core/Common/include/itkIndex.h @@ -445,25 +445,25 @@ struct ITK_TEMPLATE_EXPORT Index final return m_InternalArray[pos]; } - reference + constexpr reference front() { return *begin(); } - const_reference + constexpr const_reference front() const { return *begin(); } - reference + constexpr reference back() { return VDimension ? *(end() - 1) : *end(); } - const_reference + constexpr const_reference back() const { return VDimension ? *(end() - 1) : *end(); diff --git a/Modules/Core/Common/include/itkOffset.h b/Modules/Core/Common/include/itkOffset.h index 694bfff02a3..8df077f3a34 100644 --- a/Modules/Core/Common/include/itkOffset.h +++ b/Modules/Core/Common/include/itkOffset.h @@ -397,25 +397,25 @@ struct ITK_TEMPLATE_EXPORT Offset final return m_InternalArray[pos]; } - reference + constexpr reference front() { return *begin(); } - const_reference + constexpr const_reference front() const { return *begin(); } - reference + constexpr reference back() { return VDimension ? *(end() - 1) : *end(); } - const_reference + constexpr const_reference back() const { return VDimension ? *(end() - 1) : *end(); diff --git a/Modules/Core/Common/include/itkSize.h b/Modules/Core/Common/include/itkSize.h index 2e6a60c8441..6e2cc398cff 100644 --- a/Modules/Core/Common/include/itkSize.h +++ b/Modules/Core/Common/include/itkSize.h @@ -369,25 +369,25 @@ struct ITK_TEMPLATE_EXPORT Size final return m_InternalArray[pos]; } - reference + constexpr reference front() { return *begin(); } - const_reference + constexpr const_reference front() const { return *begin(); } - reference + constexpr reference back() { return VDimension ? *(end() - 1) : *end(); } - const_reference + constexpr const_reference back() const { return VDimension ? *(end() - 1) : *end(); diff --git a/Modules/Core/Common/test/itkIndexGTest.cxx b/Modules/Core/Common/test/itkIndexGTest.cxx index 23e4c4f7aa8..94cd17ec1d1 100644 --- a/Modules/Core/Common/test/itkIndexGTest.cxx +++ b/Modules/Core/Common/test/itkIndexGTest.cxx @@ -75,6 +75,10 @@ static_assert(itk::RangeGTestUtilities::CheckConstexprBeginAndEndOfContainer>(), "Check constexpr begin() and end() of Index."); +static_assert(itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Index<>()) && + itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Index<1>()), + "Check that `distance(&front, &back) + 1` is equal to `size`"); + // Tests that itk::Index::Filled(value) returns an itk::Index with the // specified value for each element. diff --git a/Modules/Core/Common/test/itkOffsetGTest.cxx b/Modules/Core/Common/test/itkOffsetGTest.cxx index c2367d4dd55..bd009f97e01 100644 --- a/Modules/Core/Common/test/itkOffsetGTest.cxx +++ b/Modules/Core/Common/test/itkOffsetGTest.cxx @@ -24,3 +24,7 @@ static_assert(itk::RangeGTestUtilities::CheckConstexprBeginAndEndOfContainer>() && itk::RangeGTestUtilities::CheckConstexprBeginAndEndOfContainer>(), "Check constexpr begin() and end() of Offset."); + +static_assert(itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Offset<>()) && + itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Offset<1>()), + "Check that `distance(&front, &back) + 1` is equal to `size`"); diff --git a/Modules/Core/Common/test/itkRangeGTestUtilities.h b/Modules/Core/Common/test/itkRangeGTestUtilities.h index 13c6029c54c..eba4558ac0c 100644 --- a/Modules/Core/Common/test/itkRangeGTestUtilities.h +++ b/Modules/Core/Common/test/itkRangeGTestUtilities.h @@ -156,6 +156,15 @@ class RangeGTestUtilities } + // Tells if `distance(&front, &back) + 1` is equal to `size`, for the specified container. + template + static constexpr bool + IsDistanceFromFrontToBackPlusOneEqualToSize(const TContainer & container) + { + return std::distance(&container.front(), &container.back()) + 1 == container.size(); + } + + // Checks that each element of the specified range is zero. template static void diff --git a/Modules/Core/Common/test/itkSizeGTest.cxx b/Modules/Core/Common/test/itkSizeGTest.cxx index c2af1b6429c..d6ba8a66b2c 100644 --- a/Modules/Core/Common/test/itkSizeGTest.cxx +++ b/Modules/Core/Common/test/itkSizeGTest.cxx @@ -85,6 +85,10 @@ static_assert(itk::RangeGTestUtilities::CheckConstexprBeginAndEndOfContainer>(), "Check constexpr begin() and end() of Size."); +static_assert(itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Size<>()) && + itk::RangeGTestUtilities::IsDistanceFromFrontToBackPlusOneEqualToSize(itk::Size<1>()), + "Check that `distance(&front, &back) + 1` is equal to `size`"); + // Tests that itk::Size::Filled(value) returns an itk::Size with the // specified value for each element.