From 6279c518153ffc671eb9c5f74486f4686b8ca692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Tue, 6 Apr 2021 15:46:09 +0200 Subject: [PATCH] Fix copy from WeakSubItemValuePerItem --- src/mesh/SubItemValuePerItem.hpp | 12 +++- tests/test_SubItemValuePerItem.cpp | 89 ++++++++++++++++++++++-------- 2 files changed, 77 insertions(+), 24 deletions(-) diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp index dedafdb9c..a842220b2 100644 --- a/src/mesh/SubItemValuePerItem.hpp +++ b/src/mesh/SubItemValuePerItem.hpp @@ -41,6 +41,12 @@ class SubItemValuePerItem // Allow const std:weak_ptr version to access our data friend SubItemValuePerItem<std::add_const_t<DataType>, ItemOfItem, ConnectivityWeakPtr>; + // Allow const std:shared_ptr version to access our data + friend SubItemValuePerItem<std::remove_const_t<DataType>, ItemOfItem, ConnectivitySharedPtr>; + + // Allow const std:weak_ptr version to access our data + friend SubItemValuePerItem<std::remove_const_t<DataType>, ItemOfItem, ConnectivityWeakPtr>; + public: using ToShared = SubItemValuePerItem<DataType, ItemOfItem, ConnectivitySharedPtr>; @@ -96,9 +102,11 @@ class SubItemValuePerItem friend PUGS_INLINE SubItemValuePerItem<std::remove_const_t<DataType>, ItemOfItem, ConnectivityPtr> copy(SubItemValuePerItem<DataType, ItemOfItem, ConnectivityPtr>& source) { - SubItemValuePerItem<std::remove_const_t<DataType>, ItemOfItem, ConnectivityPtr> image(*source.m_connectivity_ptr); + SubItemValuePerItem<std::remove_const_t<DataType>, ItemOfItem, ConnectivityPtr> image; - image.m_values = copy(source.m_values); + image.m_connectivity_ptr = source.m_connectivity_ptr; + image.m_host_row_map = source.m_host_row_map; + image.m_values = copy(source.m_values); return image; } diff --git a/tests/test_SubItemValuePerItem.cpp b/tests/test_SubItemValuePerItem.cpp index 15c070ddd..e7c9434aa 100644 --- a/tests/test_SubItemValuePerItem.cpp +++ b/tests/test_SubItemValuePerItem.cpp @@ -611,43 +611,88 @@ TEST_CASE("SubItemValuePerItem", "[mesh]") const Mesh<Connectivity<3>>& mesh_3d = MeshDataBaseForTests::get().cartesianMesh<3>(); const Connectivity<3>& connectivity = mesh_3d.connectivity(); - NodeValuePerCell<size_t> node_value_per_cell{connectivity}; - + SECTION("classic") { - size_t value = 0; - for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { - for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { - node_value_per_cell.itemValues(cell_id)[i_node] = value++; + NodeValuePerCell<size_t> node_value_per_cell{connectivity}; + + { + size_t value = 0; + for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { + for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { + node_value_per_cell.itemValues(cell_id)[i_node] = value++; + } } } - } - NodeValuePerCell<size_t> copy_node_value_per_cell = copy(node_value_per_cell); + NodeValuePerCell<size_t> copy_node_value_per_cell = copy(node_value_per_cell); - { - bool is_same = true; - for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { - is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); + { + bool is_same = true; + for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { + is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); + } + + REQUIRE(is_same); } - REQUIRE(is_same); - } + { + for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { + for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { + node_value_per_cell.itemValues(cell_id)[i_node] = i_node; + } + } + } - { - for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { - for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { - node_value_per_cell.itemValues(cell_id)[i_node] = i_node; + { + bool is_same = true; + for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { + is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); } + + REQUIRE(not is_same); } } + SECTION("from weak") { - bool is_same = true; - for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { - is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); + WeakNodeValuePerCell<size_t> node_value_per_cell{connectivity}; + + { + size_t value = 0; + for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { + for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { + node_value_per_cell.itemValues(cell_id)[i_node] = value++; + } + } + } + + NodeValuePerCell<size_t> copy_node_value_per_cell = copy(node_value_per_cell); + + { + bool is_same = true; + for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { + is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); + } + + REQUIRE(is_same); + } + + { + for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) { + for (size_t i_node = 0; i_node < node_value_per_cell.numberOfSubValues(cell_id); ++i_node) { + node_value_per_cell.itemValues(cell_id)[i_node] = i_node; + } + } } - REQUIRE(not is_same); + { + bool is_same = true; + for (size_t i = 0; i < copy_node_value_per_cell.numberOfValues(); ++i) { + is_same &= (copy_node_value_per_cell[i] == node_value_per_cell[i]); + } + + REQUIRE(not is_same); + } } } -- GitLab