From 09c0139b4e40d153b68c69252330367333314c69 Mon Sep 17 00:00:00 2001 From: Kenneth Moreland Date: Thu, 6 Apr 2023 16:55:04 -0600 Subject: [PATCH] Fix operator for IteratorFromArrayPortal There was an error in `operator-=` for `IteratorFromArrayPortal` that went by unnoticed. The operator is fixed and regression tests for the operators has been added. --- docs/changelog/fix-iterator-operator.md | 5 ++ vtkm/cont/internal/IteratorFromArrayPortal.h | 2 +- .../UnitTestIteratorFromArrayPortal.cxx | 72 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/fix-iterator-operator.md diff --git a/docs/changelog/fix-iterator-operator.md b/docs/changelog/fix-iterator-operator.md new file mode 100644 index 000000000..0a72db7f8 --- /dev/null +++ b/docs/changelog/fix-iterator-operator.md @@ -0,0 +1,5 @@ +# Fixed operator for IteratorFromArrayPortal + +There was an error in `operator-=` for `IteratorFromArrayPortal` that went +by unnoticed. The operator is fixed and regression tests for the operators +has been added. diff --git a/vtkm/cont/internal/IteratorFromArrayPortal.h b/vtkm/cont/internal/IteratorFromArrayPortal.h index 911e0e497..f6085364e 100644 --- a/vtkm/cont/internal/IteratorFromArrayPortal.h +++ b/vtkm/cont/internal/IteratorFromArrayPortal.h @@ -98,7 +98,7 @@ public: VTKM_EXEC_CONT iter& operator-=(difference_type n) { - this->Index += static_cast(n); + this->Index -= static_cast(n); VTKM_ASSERT(this->Index >= 0); return *this; } diff --git a/vtkm/cont/testing/UnitTestIteratorFromArrayPortal.cxx b/vtkm/cont/testing/UnitTestIteratorFromArrayPortal.cxx index 2a8466ace..d2d5e8af5 100644 --- a/vtkm/cont/testing/UnitTestIteratorFromArrayPortal.cxx +++ b/vtkm/cont/testing/UnitTestIteratorFromArrayPortal.cxx @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -115,6 +116,74 @@ struct TemplatedTests "Did not get correct values when writing to iterator."); } + void TestOperators() + { + struct Functor + { + VTKM_EXEC ValueType operator()(vtkm::Id index) const { return TestValue(index, ValueType{}); } + }; + Functor functor; + + auto array = vtkm::cont::make_ArrayHandleImplicit(functor, ARRAY_SIZE); + auto portal = array.ReadPortal(); + + VTKM_TEST_ASSERT(test_equal(portal.Get(0), functor(0))); + ::CheckPortal(portal); + + // Normally, you would use `ArrayPortalToIterators`, but we want to test this + // class specifically. + using IteratorType = vtkm::cont::internal::IteratorFromArrayPortal; + IteratorType begin{ portal }; + IteratorType end{ portal, ARRAY_SIZE }; + + VTKM_TEST_ASSERT(test_equal(*begin, functor(0))); + VTKM_TEST_ASSERT(test_equal(begin[0], functor(0))); + VTKM_TEST_ASSERT(test_equal(begin[3], functor(3))); + + IteratorType iter = begin; + VTKM_TEST_ASSERT(test_equal(*iter, functor(0))); + VTKM_TEST_ASSERT(test_equal(*(iter++), functor(0))); + VTKM_TEST_ASSERT(test_equal(*iter, functor(1))); + VTKM_TEST_ASSERT(test_equal(*(++iter), functor(2))); + VTKM_TEST_ASSERT(test_equal(*iter, functor(2))); + + VTKM_TEST_ASSERT(test_equal(*(iter--), functor(2))); + VTKM_TEST_ASSERT(test_equal(*iter, functor(1))); + VTKM_TEST_ASSERT(test_equal(*(--iter), functor(0))); + VTKM_TEST_ASSERT(test_equal(*iter, functor(0))); + + VTKM_TEST_ASSERT(test_equal(*(iter += 3), functor(3))); + VTKM_TEST_ASSERT(test_equal(*(iter -= 3), functor(0))); + + VTKM_TEST_ASSERT(end - begin == ARRAY_SIZE); + + VTKM_TEST_ASSERT(test_equal(*(iter + 3), functor(3))); + VTKM_TEST_ASSERT(test_equal(*(3 + iter), functor(3))); + iter += 3; + VTKM_TEST_ASSERT(test_equal(*(iter - 3), functor(0))); + + VTKM_TEST_ASSERT(iter == (begin + 3)); + VTKM_TEST_ASSERT(!(iter != (begin + 3))); + VTKM_TEST_ASSERT(iter != begin); + VTKM_TEST_ASSERT(!(iter == begin)); + + VTKM_TEST_ASSERT(!(iter < begin)); + VTKM_TEST_ASSERT(!(iter < (begin + 3))); + VTKM_TEST_ASSERT((iter < end)); + + VTKM_TEST_ASSERT(!(iter <= begin)); + VTKM_TEST_ASSERT((iter <= (begin + 3))); + VTKM_TEST_ASSERT((iter <= end)); + + VTKM_TEST_ASSERT((iter > begin)); + VTKM_TEST_ASSERT(!(iter > (begin + 3))); + VTKM_TEST_ASSERT(!(iter > end)); + + VTKM_TEST_ASSERT((iter >= begin)); + VTKM_TEST_ASSERT((iter >= (begin + 3))); + VTKM_TEST_ASSERT(!(iter >= end)); + } + void operator()() { ValueType array[ARRAY_SIZE]; @@ -133,6 +202,9 @@ struct TemplatedTests std::cout << " Test write to iterator." << std::endl; TestIteratorWrite(portal); + + std::cout << " Test operators." << std::endl; + TestOperators(); } };