From 97f3bdeaafb82018ef2e69169f9fd98c6141013f Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 22 Jul 2020 12:21:38 +0200
Subject: [PATCH] Build data mapper once for all

Is is now built while building diamond dual connectivity

Some work is still needed, one has to define mapper structures while
building connectivity to avoid (future) incoherence and to give it
flexibility (renumbering an probably helpful for parallelism)
---
 src/mesh/DiamondDualConnectivityBuilder.cpp |  6 +++
 src/mesh/DiamondDualConnectivityBuilder.hpp | 10 +++++
 src/mesh/DiamondDualConnectivityManager.cpp | 49 +++++++--------------
 src/mesh/DiamondDualConnectivityManager.hpp |  2 +
 4 files changed, 34 insertions(+), 33 deletions(-)

diff --git a/src/mesh/DiamondDualConnectivityBuilder.cpp b/src/mesh/DiamondDualConnectivityBuilder.cpp
index 93a559b72..44606bc0e 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.cpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.cpp
@@ -3,6 +3,7 @@
 #include <mesh/Connectivity.hpp>
 #include <mesh/ConnectivityDescriptor.hpp>
 #include <mesh/ConnectivityDispatcher.hpp>
+#include <mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp>
 #include <mesh/ItemValueUtils.hpp>
 #include <mesh/Mesh.hpp>
 #include <mesh/RefId.hpp>
@@ -481,6 +482,11 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
   }
 
   m_connectivity = ConnectivityType::build(diamond_descriptor);
+
+  m_mapper =
+    std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
+                                                                                 dynamic_cast<const ConnectivityType&>(
+                                                                                   *m_connectivity));
 }
 
 DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity)
diff --git a/src/mesh/DiamondDualConnectivityBuilder.hpp b/src/mesh/DiamondDualConnectivityBuilder.hpp
index e0c18457a..bed1e9daf 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.hpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.hpp
@@ -9,9 +9,13 @@ template <size_t>
 class Connectivity;
 class ConnectivityDescriptor;
 
+class IConnectivityToDiamondDualConnectivityDataMapper;
+
 class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
 {
  private:
+  std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> m_mapper;
+
   template <size_t Dimension>
   void _buildDiamondConnectivityDescriptor(const Connectivity<Dimension>&, ConnectivityDescriptor&);
 
@@ -22,6 +26,12 @@ class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
   DiamondDualConnectivityBuilder(const IConnectivity&);
 
  public:
+  std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper>
+  mapper() const
+  {
+    return m_mapper;
+  }
+
   ~DiamondDualConnectivityBuilder() = default;
 };
 
diff --git a/src/mesh/DiamondDualConnectivityManager.cpp b/src/mesh/DiamondDualConnectivityManager.cpp
index aed409bda..9459010b6 100644
--- a/src/mesh/DiamondDualConnectivityManager.cpp
+++ b/src/mesh/DiamondDualConnectivityManager.cpp
@@ -41,57 +41,40 @@ DiamondDualConnectivityManager::deleteConnectivity(const IConnectivity* p_connec
   m_connectivity_to_diamond_dual_connectivity_info_map.erase(p_connectivity);
 }
 
-template <size_t Dimension>
-std::shared_ptr<const Connectivity<Dimension>>
-DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& connectivity)
+DiamondDualConnectivityManager::DiamondDualConnectivityInfo
+DiamondDualConnectivityManager::_getDiamondDualConnectivityInfo(const IConnectivity& connectivity)
 {
   const IConnectivity* p_connectivity = &connectivity;
 
   if (auto i_connectivity = m_connectivity_to_diamond_dual_connectivity_info_map.find(p_connectivity);
       i_connectivity != m_connectivity_to_diamond_dual_connectivity_info_map.end()) {
-    auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
-    return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
-      diamond_dual_connectivity_info.diamondDualConnectivity());
+    return i_connectivity->second;
   } else {
     DiamondDualConnectivityBuilder builder{connectivity};
 
-    std::shared_ptr diamond_connectivity =
-      std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
-    std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
-      std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
+    DiamondDualConnectivityInfo connectivity_info{builder.connectivity(), builder.mapper()};
 
-    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
-      DiamondDualConnectivityInfo{diamond_connectivity, mapper};
+    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] = connectivity_info;
 
-    return diamond_connectivity;
+    return connectivity_info;
   }
 }
 
+template <size_t Dimension>
+std::shared_ptr<const Connectivity<Dimension>>
+DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& connectivity)
+{
+  return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
+    this->_getDiamondDualConnectivityInfo(connectivity).diamondDualConnectivity());
+}
+
 template <size_t Dimension>
 std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>
 DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(
   const Connectivity<Dimension>& connectivity)
 {
-  const IConnectivity* p_connectivity = &connectivity;
-
-  if (auto i_connectivity = m_connectivity_to_diamond_dual_connectivity_info_map.find(p_connectivity);
-      i_connectivity != m_connectivity_to_diamond_dual_connectivity_info_map.end()) {
-    auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
-    return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
-      diamond_dual_connectivity_info.connectivityToDiamondDualConnectivityDataMapper());
-  } else {
-    DiamondDualConnectivityBuilder builder{connectivity};
-
-    std::shared_ptr diamond_connectivity =
-      std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
-    std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
-      std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
-
-    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
-      DiamondDualConnectivityInfo{diamond_connectivity, mapper};
-
-    return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(mapper);
-  }
+  return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
+    this->_getDiamondDualConnectivityInfo(connectivity).connectivityToDiamondDualConnectivityDataMapper());
 }
 
 template std::shared_ptr<const Connectivity<1>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
diff --git a/src/mesh/DiamondDualConnectivityManager.hpp b/src/mesh/DiamondDualConnectivityManager.hpp
index 3b7eb2cea..33dfbaf4c 100644
--- a/src/mesh/DiamondDualConnectivityManager.hpp
+++ b/src/mesh/DiamondDualConnectivityManager.hpp
@@ -56,6 +56,8 @@ class DiamondDualConnectivityManager
     ~DiamondDualConnectivityInfo() = default;
   };
 
+  DiamondDualConnectivityInfo _getDiamondDualConnectivityInfo(const IConnectivity& connectivity);
+
   std::unordered_map<const IConnectivity*, DiamondDualConnectivityInfo>
     m_connectivity_to_diamond_dual_connectivity_info_map;
 
-- 
GitLab