Skip to content

Commit

Permalink
Merge pull request #4495 from N-Dekker/Array2D-update
Browse files Browse the repository at this point in the history
  • Loading branch information
dzenanz authored Mar 12, 2024
2 parents e7a60b6 + 110c25b commit fc02910
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 18 deletions.
21 changes: 15 additions & 6 deletions Modules/Core/Common/include/itkArray2D.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,9 @@
namespace itk
{
/** \class Array2D
* \brief Array2D class representing a 2D array with size defined
* at construction time.
* \brief Array2D class representing a 2D array.
*
* This class derives from the vnl_matrix<> class.
* Its size is assigned at construction time (run time) and can not be
* changed afterwards.
*
* The class is templated over the type of the elements.
*
Expand All @@ -50,14 +47,27 @@ class ITK_TEMPLATE_EXPORT Array2D : public vnl_matrix<TValue>
using Self = Array2D;
using VnlMatrixType = vnl_matrix<TValue>;

/** Default-constructor. Creates a matrix of size zero (0 rows and 0 columns). */
Array2D() = default;

/** Constructs a matrix of the specified number of rows and columns. */
Array2D(unsigned int numberOfRows, unsigned int numberOfCols);

/** Constructs a matrix of the specified number of rows and columns, with each element having the specified initial
* value. */
Array2D(unsigned int numberOfRows, unsigned int numberOfCols, const TValue & initialValue);

/** Copy-constructor. */
Array2D(const Self & array);

/** Converting constructor. Implicitly converts the specified matrix to an Array2D. */
Array2D(const VnlMatrixType & matrix);

/** Copy-assignment operator. */
Self &
operator=(const Self & array);

/** Assigns the specified matrix to an Array2D. */
Self &
operator=(const VnlMatrixType & matrix);

Expand Down Expand Up @@ -85,8 +95,7 @@ class ITK_TEMPLATE_EXPORT Array2D : public vnl_matrix<TValue>
void
SetSize(unsigned int m, unsigned int n);

/** This destructor is not virtual for performance reasons. However, this
* means that subclasses cannot allocate memory. */
/** Destructor. */
~Array2D() override = default;
};

Expand Down
5 changes: 5 additions & 0 deletions Modules/Core/Common/include/itkArray2D.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ Array2D<TValue>::Array2D(unsigned int numberOfRows, unsigned int numberOfCols)
: vnl_matrix<TValue>(numberOfRows, numberOfCols)
{}

template <typename TValue>
Array2D<TValue>::Array2D(unsigned int numberOfRows, unsigned int numberOfCols, const TValue & initialValue)
: vnl_matrix<TValue>(numberOfRows, numberOfCols, initialValue)
{}

template <typename TValue>
Array2D<TValue>::Array2D(const VnlMatrixType & matrix)
: vnl_matrix<TValue>(matrix)
Expand Down
1 change: 1 addition & 0 deletions Modules/Core/Common/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,7 @@ if(ITK_BUILD_SHARED_LIBS AND ITK_DYNAMIC_LOADING)
endif()

set(ITKCommonGTests
itkArray2DGTest.cxx
itkAggregateTypesGTest.cxx
itkBitCastGTest.cxx
itkBooleanStdVectorGTest.cxx
Expand Down
53 changes: 53 additions & 0 deletions Modules/Core/Common/test/itkArray2DGTest.cxx
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/

// First include the header file to be tested:
#include "itkArray2D.h"
#include <gtest/gtest.h>
#include <limits>


// Tests that Array2D may be constructed with an initial value for each element.
TEST(Array2D, ConstructorSupportsInitialValue)
{
const auto checkConstructor =
[](const unsigned int numberOfRows, const unsigned int numberOfCols, const auto initialValue) {
using ValueType = std::remove_const_t<decltype(initialValue)>;

const itk::Array2D<ValueType> array2D(numberOfRows, numberOfCols, initialValue);

EXPECT_EQ(array2D.rows(), numberOfRows);
EXPECT_EQ(array2D.columns(), numberOfCols);

for (const auto & element : array2D)
{
EXPECT_EQ(element, initialValue);
}
};

for (const auto initialValue : { -1, 0, 1 })
{
checkConstructor(0, 0, initialValue);
checkConstructor(1, 2, initialValue);
}
for (const auto initialValue : { std::numeric_limits<double>::min(), std::numeric_limits<double>::max() })
{
checkConstructor(0, 0, initialValue);
checkConstructor(1, 2, initialValue);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -231,9 +231,7 @@ MRIBiasFieldCorrectionFilter<TInputImage, TOutputImage, TMaskImage>::SetNumberOf
}

// Resize the schedules
ScheduleType temp(m_NumberOfLevels, ImageDimension);
temp.Fill(0);
m_Schedule = temp;
m_Schedule = ScheduleType(m_NumberOfLevels, ImageDimension, 0);

// Determine initial shrink factor
unsigned int startfactor = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ MultiResolutionPyramidImageFilter<TInputImage, TOutputImage>::SetNumberOfLevels(
}

// resize the schedules
ScheduleType temp(m_NumberOfLevels, ImageDimension);
temp.Fill(0);
m_Schedule = temp;
m_Schedule = ScheduleType(m_NumberOfLevels, ImageDimension, 0);

// determine initial shrink factor
unsigned int startfactor = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,9 +258,7 @@ itkMultiResolutionPyramidImageFilterTest(int argc, char * argv[])
pyramid->SetStartingShrinkFactors(factors.Begin());

// check the schedule;
ScheduleType temp(numLevels, ImageDimension);
temp.Fill(0);
schedule = temp;
schedule = ScheduleType(numLevels, ImageDimension, 0);
for (k = 0; k < numLevels; ++k)
{
unsigned int denominator = 1 << k;
Expand Down Expand Up @@ -409,9 +407,7 @@ itkMultiResolutionPyramidImageFilterTest(int argc, char * argv[])
schedule.Fill(0);
pyramid->SetSchedule(schedule);

ScheduleType temp2(pyramid->GetNumberOfLevels() - 1, ImageDimension);
temp2.Fill(1);
pyramid->SetSchedule(temp2);
pyramid->SetSchedule(ScheduleType(pyramid->GetNumberOfLevels() - 1, ImageDimension, 1));

std::cout << "Test passed." << std::endl;
return EXIT_SUCCESS;
Expand Down

0 comments on commit fc02910

Please sign in to comment.