From a06392666da36c2e2c01fee2a2f2d055305bff9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 19 Apr 2022 20:23:29 +0200
Subject: [PATCH] Store RefEdgeList instead of edge list

Simplify access to MeshEdgeBoundary (simpler and safer)
---
 src/mesh/MeshEdgeBoundary.cpp |  9 ++++-----
 src/mesh/MeshEdgeBoundary.hpp | 11 +++++++++--
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/mesh/MeshEdgeBoundary.cpp b/src/mesh/MeshEdgeBoundary.cpp
index 2542b0a3d..00ece5864 100644
--- a/src/mesh/MeshEdgeBoundary.cpp
+++ b/src/mesh/MeshEdgeBoundary.cpp
@@ -7,7 +7,7 @@
 
 template <size_t Dimension>
 MeshEdgeBoundary<Dimension>::MeshEdgeBoundary(const Mesh<Connectivity<Dimension>>&, const RefEdgeList& ref_edge_list)
-  : m_edge_list(ref_edge_list.list()), m_boundary_name(ref_edge_list.refId().tagName())
+  : m_ref_edge_list(ref_edge_list), m_boundary_name(ref_edge_list.refId().tagName())
 {}
 
 template MeshEdgeBoundary<1>::MeshEdgeBoundary(const Mesh<Connectivity<1>>&, const RefEdgeList&);
@@ -43,18 +43,17 @@ MeshEdgeBoundary<Dimension>::MeshEdgeBoundary(const Mesh<Connectivity<Dimension>
     Array<EdgeId> edge_list(edge_ids.size());
     parallel_for(
       edge_ids.size(), PUGS_LAMBDA(int r) { edge_list[r] = edge_ids[r]; });
-    m_edge_list = edge_list;
+    m_ref_edge_list = RefEdgeList{ref_face_list.refId(), edge_list, ref_face_list.isBoundary()};
   } else if constexpr (Dimension == 2) {
     Array<EdgeId> edge_list(face_list.size());
     parallel_for(
       face_list.size(), PUGS_LAMBDA(int r) { edge_list[r] = static_cast<FaceId::base_type>(face_list[r]); });
-    m_edge_list = edge_list;
+    m_ref_edge_list = RefEdgeList{ref_face_list.refId(), edge_list, ref_face_list.isBoundary()};
   }
 
   // This is quite dirty but it allows a non negligible performance
   // improvement
-  const_cast<Connectivity<Dimension>&>(mesh.connectivity())
-    .addRefItemList(RefItemList<ItemType::edge>(ref_face_list.refId(), m_edge_list, ref_face_list.isBoundary()));
+  const_cast<Connectivity<Dimension>&>(mesh.connectivity()).addRefItemList(m_ref_edge_list);
 }
 
 template MeshEdgeBoundary<2>::MeshEdgeBoundary(const Mesh<Connectivity<2>>&, const RefFaceList&);
diff --git a/src/mesh/MeshEdgeBoundary.hpp b/src/mesh/MeshEdgeBoundary.hpp
index 9ff40cc6e..012579bb0 100644
--- a/src/mesh/MeshEdgeBoundary.hpp
+++ b/src/mesh/MeshEdgeBoundary.hpp
@@ -16,7 +16,7 @@ template <size_t Dimension>
 class [[nodiscard]] MeshEdgeBoundary   // clazy:exclude=copyable-polymorphic
 {
  protected:
-  Array<const EdgeId> m_edge_list;
+  RefEdgeList m_ref_edge_list;
   std::string m_boundary_name;
 
   std::array<TinyVector<Dimension>, Dimension*(Dimension - 1)> _getBounds(const Mesh<Connectivity<Dimension>>& mesh)
@@ -30,9 +30,16 @@ class [[nodiscard]] MeshEdgeBoundary   // clazy:exclude=copyable-polymorphic
   MeshEdgeBoundary& operator=(const MeshEdgeBoundary&) = default;
   MeshEdgeBoundary& operator=(MeshEdgeBoundary&&) = default;
 
+  PUGS_INLINE
+  const RefEdgeList& refEdgeList() const
+  {
+    return m_ref_edge_list;
+  }
+
+  PUGS_INLINE
   const Array<const EdgeId>& edgeList() const
   {
-    return m_edge_list;
+    return m_ref_edge_list.list();
   }
 
  protected:
-- 
GitLab