diff --git a/Core/Export/MaterialKeyHandler.cpp b/Core/Export/MaterialKeyHandler.cpp index 11d3c15c4cce554bfca7ad59278347022034de9c..75a7524b013b10fa472f419c61a0176fdfa1506a 100644 --- a/Core/Export/MaterialKeyHandler.cpp +++ b/Core/Export/MaterialKeyHandler.cpp @@ -13,30 +13,32 @@ // ************************************************************************************************ #include "Core/Export/MaterialKeyHandler.h" +#include "Base/Utils/Assert.h" #include "Sample/Material/Material.h" #include <algorithm> #include <set> #include <stdexcept> -std::string MaterialKeyHandler::mat2key(const Material* mat) const { - return m_MatMap.at(mat); -} - -std::map<const std::string, const Material*> MaterialKeyHandler::materialMap() const { - return {}; -} - void MaterialKeyHandler::insertMaterial(const Material* mat) { - for (const auto& it: m_MatMap) + for (const auto& it: m_Mat2Unique) if (*it.first == *mat) { - m_MatMap.emplace(mat, it.second); + m_Mat2Unique.emplace(mat, it.first); return; } - // material not found => create new key - std::set<std::string> unique_keys; - for (const auto& it: m_MatMap) - unique_keys.insert(it.second); + m_Mat2Unique.emplace(mat, mat); + + const std::string key = "material_" + std::to_string(m_Key2Mat.size() + 1); + m_Key2Mat.emplace(key, mat); +} + +const std::string& MaterialKeyHandler::mat2key(const Material* mat) const { + const Material* unique_mat = m_Mat2Unique.at(mat); + for (const auto& it: m_Key2Mat) + if (it.second == unique_mat) + return it.first; + ASSERT(0); +} - const std::string key = "material_" + std::to_string(unique_keys.size() + 1); - m_MatMap.emplace(mat, key); +const std::map<const std::string, const Material*>& MaterialKeyHandler::materialMap() const { + return m_Key2Mat; } diff --git a/Core/Export/MaterialKeyHandler.h b/Core/Export/MaterialKeyHandler.h index b14070e9732b6a4c733eb4dae1709ee13a7e8e39..cfc83193f04c18931ed0ae26b10ccfedcfcf252f 100644 --- a/Core/Export/MaterialKeyHandler.h +++ b/Core/Export/MaterialKeyHandler.h @@ -26,12 +26,14 @@ class Material; class MaterialKeyHandler { public: - std::map<const std::string, const Material*> materialMap() const; - std::string mat2key(const Material* sample) const; void insertMaterial(const Material* sample); + const std::map<const std::string, const Material*>& materialMap() const; + const std::string& mat2key(const Material* sample) const; + private: - std::map<const Material*, const std::string> m_MatMap; + std::map<const Material*, const Material*> m_Mat2Unique; + std::map<const std::string, const Material*> m_Key2Mat; }; #endif // BORNAGAIN_CORE_EXPORT_MATERIALKEYHANDLER_H diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i index 8c727f79c2c9e04deb1a007841a4891660a99fa4..5e359576a199fb9233b37ca7b05e17dae16ab508 100644 --- a/auto/Wrap/doxygenCore.i +++ b/auto/Wrap/doxygenCore.i @@ -1226,13 +1226,13 @@ Stores Material instances, associates them with given tag, and provides unique k C++ includes: MaterialKeyHandler.h "; -%feature("docstring") MaterialKeyHandler::materialMap "std::map< const std::string, const Material * > MaterialKeyHandler::materialMap() const +%feature("docstring") MaterialKeyHandler::insertMaterial "void MaterialKeyHandler::insertMaterial(const Material *sample) "; -%feature("docstring") MaterialKeyHandler::mat2key "std::string MaterialKeyHandler::mat2key(const Material *sample) const +%feature("docstring") MaterialKeyHandler::materialMap "const std::map< const std::string, const Material * > & MaterialKeyHandler::materialMap() const "; -%feature("docstring") MaterialKeyHandler::insertMaterial "void MaterialKeyHandler::insertMaterial(const Material *sample) +%feature("docstring") MaterialKeyHandler::mat2key "const std::string & MaterialKeyHandler::mat2key(const Material *sample) const ";