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