diff --git a/src/mesh/DiamondDualConnectivityBuilder.cpp b/src/mesh/DiamondDualConnectivityBuilder.cpp index 93a559b725fa2633bf5aa208dfbb0383aa0c3224..44606bc0edca1e6dfe70a979fa86b4595d1db52f 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 e0c18457a20f5317a8e775535a2b5ee4f44bce60..bed1e9daff01e46e38908b1268f298c1045a6d73 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 aed409bdaf6fb6e0f60b71f9d77f1a94ec238fc1..9459010b69e89acaf3f247866d2f6e81ef00cd81 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 3b7eb2ceaff5c1cacfa26f0bb4194af457e209a2..33dfbaf4cf7cc8e59eebfc095624d43c5bf038b3 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;