diff --git a/libsrc/interface/writeuser.cpp b/libsrc/interface/writeuser.cpp index bfab7fbb..637af7d3 100644 --- a/libsrc/interface/writeuser.cpp +++ b/libsrc/interface/writeuser.cpp @@ -16,19 +16,38 @@ namespace netgen { - extern MeshingParameters mparam; + std::map& UserFormatRegister::getFormats() + { + static std::map formats = {}; + return formats; + } - Array UserFormatRegister::entries; - std::map UserFormatRegister::format_to_entry_index; + void UserFormatRegister::Register(UserFormatRegister::UserFormatEntry && entry) + { + getFormats()[entry.format] = std::move(entry); + } + + const bool UserFormatRegister::HaveFormat(string format) + { + const auto formats = getFormats(); + return formats.find(format) != formats.end(); + } + + const UserFormatRegister::UserFormatEntry & UserFormatRegister::Get(string format) + { + return getFormats()[format]; + } + + extern MeshingParameters mparam; void RegisterUserFormats (NgArray & names, NgArray & extensions) { - for (const auto & entry : UserFormatRegister::entries) + for (const auto & entry : UserFormatRegister::getFormats()) { - names.Append (entry.format.c_str()); - extensions.Append (entry.extensions[0].c_str()); + names.Append (entry.second.format.c_str()); + extensions.Append (entry.second.extensions[0].c_str()); } } diff --git a/libsrc/interface/writeuser.hpp b/libsrc/interface/writeuser.hpp index 99dc21e0..3d9a4e3a 100644 --- a/libsrc/interface/writeuser.hpp +++ b/libsrc/interface/writeuser.hpp @@ -28,32 +28,23 @@ struct UserFormatRegister { optional read; optional write; }; - DLL_HEADER static Array entries; - DLL_HEADER static std::map format_to_entry_index; + static void Register(UserFormatEntry && entry); - static void Register(UserFormatEntry && entry) { - format_to_entry_index[entry.format] = entries.Size(); - entries.Append( std::move(entry) ); - } - - static const bool HaveFormat(string format) { - return format_to_entry_index.count(format) > 0; - } - static const UserFormatEntry & Get(string format) { - return entries[format_to_entry_index[format]]; - } + static const bool HaveFormat(string format); + DLL_HEADER static const UserFormatEntry & Get(string format); template static void IterateFormats(TFunc func, bool need_read=false, bool need_write=false) { Array import_formats; - for(const auto & e: entries) - if((!need_read || e.read) && (!need_write || e.write)) - import_formats.Append(e.format); + for(const auto & e: getFormats()) + if((!need_read || e.second.read) && (!need_write || e.second.write)) + import_formats.Append(e.second.format); QuickSort(import_formats); for(auto format : import_formats) - func(entries[format_to_entry_index[format]]); + func(Get(format)); } + DLL_HEADER static std::map& getFormats(); }; struct RegisterUserFormat { diff --git a/libsrc/meshing/python_mesh.cpp b/libsrc/meshing/python_mesh.cpp index a771ba18..bbd9488a 100644 --- a/libsrc/meshing/python_mesh.cpp +++ b/libsrc/meshing/python_mesh.cpp @@ -700,7 +700,8 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) string export_docu = "Export mesh to other file format. Supported formats are:\n"; Array export_formats; - for(auto & e : UserFormatRegister::entries) + for(auto & kv : UserFormatRegister::getFormats()) { + const auto e = kv.second; if(e.write) { string s = '\t'+e.format+"\t("+e.extensions[0]; for(auto & ext : e.extensions.Range(1, e.extensions.Size())) @@ -708,6 +709,7 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m) s += ")\n"; export_formats.Append(s); } + } QuickSort(export_formats); for(const auto & s : export_formats) export_docu += s;