From 718cef24a711f5ecf9333268797945f4e100d18a Mon Sep 17 00:00:00 2001 From: Thomas Padioleau Date: Tue, 11 Nov 2025 13:58:01 +0100 Subject: [PATCH] Refactor logical and reductions to improve coverage --- include/ddc/detail/kokkos.hpp | 2 +- include/ddc/discrete_domain.hpp | 17 ++++++++----- include/ddc/sparse_discrete_domain.hpp | 2 ++ include/ddc/strided_discrete_domain.hpp | 30 +++++++++++----------- tests/discrete_domain.cpp | 26 ++++++++++++++++--- tests/strided_discrete_domain.cpp | 33 ++++++++++++++++++++++--- 6 files changed, 79 insertions(+), 31 deletions(-) diff --git a/include/ddc/detail/kokkos.hpp b/include/ddc/detail/kokkos.hpp index c2d455525..a90c03acf 100644 --- a/include/ddc/detail/kokkos.hpp +++ b/include/ddc/detail/kokkos.hpp @@ -175,7 +175,7 @@ KOKKOS_FUNCTION auto build_mdspan( Kokkos::View const view, std::index_sequence) { - KOKKOS_ASSERT((is_kokkos_layout_compatible(view))) + KOKKOS_ASSERT(is_kokkos_layout_compatible(view)) DDC_IF_NVCC_THEN_PUSH_AND_SUPPRESS(implicit_return_from_non_void_function) using element_type = kokkos_to_mdspan_element_t; using extents_type = Kokkos::dextents::rank>; diff --git a/include/ddc/discrete_domain.hpp b/include/ddc/discrete_domain.hpp index 658afea3c..1d78d44cf 100644 --- a/include/ddc/discrete_domain.hpp +++ b/include/ddc/discrete_domain.hpp @@ -217,12 +217,17 @@ class DiscreteDomain sizeof...(DDims) == (0 + ... + DElems::size()), "Invalid number of dimensions"); static_assert((is_discrete_element_v && ...), "Expected DiscreteElements"); - return (((DiscreteElement(take(delems...)) - >= DiscreteElement(m_element_begin)) - && ...) - && ((DiscreteElement(take(delems...)) - < DiscreteElement(m_element_end)) - && ...)); + // GCOVR_EXCL_BR_START + auto const test1 + = ((DiscreteElement(take(delems...)) + >= DiscreteElement(m_element_begin)) + && ...); + auto const test2 + = ((DiscreteElement(take(delems...)) + < DiscreteElement(m_element_end)) + && ...); + // GCOVR_EXCL_BR_STOP + return test1 && test2; } template diff --git a/include/ddc/sparse_discrete_domain.hpp b/include/ddc/sparse_discrete_domain.hpp index c1592a3e1..04a96ee74 100644 --- a/include/ddc/sparse_discrete_domain.hpp +++ b/include/ddc/sparse_discrete_domain.hpp @@ -279,12 +279,14 @@ class SparseDiscreteDomain sizeof...(DDims) == (0 + ... + DElems::size()), "Invalid number of dimensions"); static_assert((is_discrete_element_v && ...), "Expected DiscreteElements"); + // GCOVR_EXCL_BR_START return (detail::binary_search( get(m_views).data(), get(m_views).data() + get(m_views).size(), uid(take(delems...)), std::less {}) && ...); + // GCOVR_EXCL_BR_STOP } template diff --git a/include/ddc/strided_discrete_domain.hpp b/include/ddc/strided_discrete_domain.hpp index 89b3aada6..9b2d84e2c 100644 --- a/include/ddc/strided_discrete_domain.hpp +++ b/include/ddc/strided_discrete_domain.hpp @@ -220,22 +220,20 @@ class StridedDiscreteDomain sizeof...(DDims) == (0 + ... + DElems::size()), "Invalid number of dimensions"); static_assert((is_discrete_element_v && ...), "Expected DiscreteElements"); - auto const test1 - = ((DiscreteElement(take(delems...)) - >= DiscreteElement(m_element_begin)) - && ...); - auto const test2 - = ((DiscreteElement(take(delems...)) - < (DiscreteElement(m_element_begin) - + DiscreteVector(m_extents) * DiscreteVector(m_strides))) - && ...); - auto const test3 - = ((((DiscreteElement(take(delems...)) - - DiscreteElement(m_element_begin)) - % DiscreteVector(m_strides)) - == 0) - && ...); - return test1 && test2 && test3; + auto const contains_1d = [](DiscreteElementType const i, + DiscreteElementType const b, + DiscreteVectorElement const n, + DiscreteVectorElement const s) { + return (i >= b) && (i < (b + (n - 1) * s + 1)) && ((i - b) % s == 0); + }; + // GCOVR_EXCL_BR_START + return (contains_1d( + DiscreteElement(take(delems...)).uid(), + DiscreteElement(m_element_begin).uid(), + DiscreteVector(m_extents).value(), + DiscreteVector(m_strides).value()) + && ...); + // GCOVR_EXCL_BR_STOP } template diff --git a/tests/discrete_domain.cpp b/tests/discrete_domain.cpp index 33314681e..32ad2098c 100644 --- a/tests/discrete_domain.cpp +++ b/tests/discrete_domain.cpp @@ -132,21 +132,38 @@ TEST(DiscreteDomainTest, CompareSameDomains) TEST(DiscreteDomainTest, CompareDifferentDomains) { DDomXY const dom_x_y_1(lbound_x_y + DVectXY(0, 1), DVectXY(1, 2)); - DDomXY const dom_x_y_2(lbound_x_y + DVectXY(2, 3), DVectXY(3, 4)); + DDomXY const dom_x_y_2(lbound_x_y + DVectXY(0, 1), DVectXY(3, 4)); + DDomXY const dom_x_y_3(lbound_x_y + DVectXY(2, 3), DVectXY(1, 2)); EXPECT_FALSE(dom_x_y_1 == dom_x_y_2); EXPECT_FALSE(dom_x_y_1 == DDomYX(dom_x_y_2)); EXPECT_TRUE(dom_x_y_1 != dom_x_y_2); EXPECT_TRUE(dom_x_y_1 != DDomYX(dom_x_y_2)); + + EXPECT_FALSE(dom_x_y_1 == dom_x_y_3); + EXPECT_FALSE(dom_x_y_1 == DDomYX(dom_x_y_3)); + EXPECT_TRUE(dom_x_y_1 != dom_x_y_3); + EXPECT_TRUE(dom_x_y_1 != DDomYX(dom_x_y_3)); + + EXPECT_FALSE(dom_x_y_2 == dom_x_y_3); + EXPECT_FALSE(dom_x_y_2 == DDomYX(dom_x_y_3)); + EXPECT_TRUE(dom_x_y_2 != dom_x_y_3); + EXPECT_TRUE(dom_x_y_2 != DDomYX(dom_x_y_3)); } TEST(DiscreteDomainTest, CompareEmptyDomains) { DDomXY const dom_x_y_1(lbound_x_y + DVectXY(4, 1), DVectXY(0, 0)); DDomXY const dom_x_y_2(lbound_x_y + DVectXY(3, 9), DVectXY(0, 0)); + DDomXY const dom_x_y_3(lbound_x_y, nelems_x_y); EXPECT_TRUE(dom_x_y_1.empty()); EXPECT_TRUE(dom_x_y_2.empty()); + EXPECT_FALSE(dom_x_y_3.empty()); + EXPECT_TRUE(dom_x_y_1 == dom_x_y_2); EXPECT_FALSE(dom_x_y_1 != dom_x_y_2); + + EXPECT_FALSE(dom_x_y_1 == dom_x_y_3); + EXPECT_TRUE(dom_x_y_1 != dom_x_y_3); } TEST(DiscreteDomainTest, Subdomain) @@ -247,9 +264,10 @@ TEST(DiscreteDomainTest, Remove) TEST(DiscreteDomainTest, Contains) { - DDomXY const dom_x_y(lbound_x_y, nelems_x_y); - EXPECT_TRUE(dom_x_y.contains(lbound_x_y)); - EXPECT_FALSE(dom_x_y.contains(lbound_x_y + nelems_x_y)); + DDomXY const dom_x_y(lbound_x_y + DVectXY(1, 1), nelems_x_y); + EXPECT_TRUE(dom_x_y.contains(dom_x_y.front())); + EXPECT_FALSE(dom_x_y.contains(dom_x_y.front() - DVectXY(1, 1))); + EXPECT_FALSE(dom_x_y.contains(dom_x_y.back() + DVectXY(1, 1))); } TEST(DiscreteDomainTest, DistanceFromFront) diff --git a/tests/strided_discrete_domain.cpp b/tests/strided_discrete_domain.cpp index b318d57b4..4e84c774f 100644 --- a/tests/strided_discrete_domain.cpp +++ b/tests/strided_discrete_domain.cpp @@ -137,21 +137,44 @@ TEST(StridedDiscreteDomainTest, CompareSameDomains) TEST(StridedDiscreteDomainTest, CompareDifferentDomains) { DDomXY const dom_x_y_1(lbound_x_y + DVectXY(0, 1), DVectXY(1, 2), strides_x_y); - DDomXY const dom_x_y_2(lbound_x_y + DVectXY(2, 3), DVectXY(3, 4), strides_x_y); + DDomXY const dom_x_y_2(lbound_x_y + DVectXY(0, 1), DVectXY(3, 4), strides_x_y); + DDomXY const dom_x_y_3(lbound_x_y + DVectXY(2, 3), DVectXY(1, 2), strides_x_y); + DDomXY const dom_x_y_4(lbound_x_y + DVectXY(2, 3), DVectXY(1, 2), DVectXY(1, 2)); EXPECT_FALSE(dom_x_y_1 == dom_x_y_2); EXPECT_FALSE(dom_x_y_1 == DDomYX(dom_x_y_2)); EXPECT_TRUE(dom_x_y_1 != dom_x_y_2); EXPECT_TRUE(dom_x_y_1 != DDomYX(dom_x_y_2)); + + EXPECT_FALSE(dom_x_y_1 == dom_x_y_3); + EXPECT_FALSE(dom_x_y_1 == DDomYX(dom_x_y_3)); + EXPECT_TRUE(dom_x_y_1 != dom_x_y_3); + EXPECT_TRUE(dom_x_y_1 != DDomYX(dom_x_y_3)); + + EXPECT_FALSE(dom_x_y_2 == dom_x_y_3); + EXPECT_FALSE(dom_x_y_2 == DDomYX(dom_x_y_3)); + EXPECT_TRUE(dom_x_y_2 != dom_x_y_3); + EXPECT_TRUE(dom_x_y_2 != DDomYX(dom_x_y_3)); + + EXPECT_FALSE(dom_x_y_3 == dom_x_y_4); + EXPECT_FALSE(dom_x_y_3 == DDomYX(dom_x_y_4)); + EXPECT_TRUE(dom_x_y_3 != dom_x_y_4); + EXPECT_TRUE(dom_x_y_3 != DDomYX(dom_x_y_4)); } TEST(StridedDiscreteDomainTest, CompareEmptyDomains) { DDomXY const dom_x_y_1(lbound_x_y + DVectXY(4, 1), DVectXY(0, 0), strides_x_y); DDomXY const dom_x_y_2(lbound_x_y + DVectXY(3, 9), DVectXY(0, 0), strides_x_y); + DDomXY const dom_x_y_3(lbound_x_y, nelems_x_y, strides_x_y); EXPECT_TRUE(dom_x_y_1.empty()); EXPECT_TRUE(dom_x_y_2.empty()); + EXPECT_FALSE(dom_x_y_3.empty()); + EXPECT_TRUE(dom_x_y_1 == dom_x_y_2); EXPECT_FALSE(dom_x_y_1 != dom_x_y_2); + + EXPECT_FALSE(dom_x_y_1 == dom_x_y_3); + EXPECT_TRUE(dom_x_y_1 != dom_x_y_3); } TEST(StridedDiscreteDomainTest, RangeFor) @@ -247,9 +270,11 @@ TEST(StridedDiscreteDomainTest, Remove) TEST(StridedDiscreteDomainTest, Contains) { - DDomXY const dom_x_y(lbound_x_y, nelems_x_y, strides_x_y); - EXPECT_TRUE(dom_x_y.contains(lbound_x_y)); - EXPECT_FALSE(dom_x_y.contains(lbound_x_y + DVectXY(1, 1))); + DDomXY const dom_x_y(lbound_x_y + DVectXY(1, 1), nelems_x_y, strides_x_y); + EXPECT_TRUE(dom_x_y.contains(dom_x_y.front())); + EXPECT_FALSE(dom_x_y.contains(dom_x_y.front() - DVectXY(1, 1))); + EXPECT_FALSE(dom_x_y.contains(dom_x_y.back() + DVectXY(1, 1))); + EXPECT_FALSE(dom_x_y.contains(dom_x_y.front() + DVectXY(1, 1))); } TEST(StridedDiscreteDomainTest, DistanceFromFront)