diff --git a/libsrc/core/archive.cpp b/libsrc/core/archive.cpp index 9d7f2cd5..84e6d875 100644 --- a/libsrc/core/archive.cpp +++ b/libsrc/core/archive.cpp @@ -33,6 +33,11 @@ namespace ngcore std::make_unique>(); (*type_register)[classname] = info; } + void Archive :: RemoveArchiveRegister(const std::string& classname) + { + if(IsRegistered(classname)) + type_register->erase(classname); + } bool Archive :: IsRegistered(const std::string& classname) { if(type_register == nullptr) type_register = diff --git a/libsrc/core/archive.hpp b/libsrc/core/archive.hpp index 7ddba8eb..22019302 100644 --- a/libsrc/core/archive.hpp +++ b/libsrc/core/archive.hpp @@ -124,8 +124,18 @@ namespace ngcore // once and put them together correctly afterwards. Therefore all objects that may live in // Python should be archived using this Shallow function. If Shallow is called from C++ code // it archives the object normally. +#ifdef NETGEN_PYTHON template Archive& Shallow(T& val); // implemented in python_ngcore.hpp +#else // NETGEN_PYTHON + template + Archive& Shallow(T& val) + { + static_assert(detail::is_any_pointer, "ShallowArchive must be given pointer type!"); + *this & val; + return *this; + } +#endif // NETGEN_PYTHON #ifdef NETGEN_PYTHON virtual void ShallowOutPython(const pybind11::object& /*unused*/) @@ -572,6 +582,7 @@ namespace ngcore // Set ClassArchiveInfo for Demangled typeid, this is done by creating an instance of // RegisterClassForArchive static void SetArchiveRegister(const std::string& classname, const detail::ClassArchiveInfo& info); + static void RemoveArchiveRegister(const std::string& classname); static bool IsRegistered(const std::string& classname); // Helper class for up-/downcasting @@ -638,6 +649,10 @@ namespace ngcore { return typeid(T) == ti ? p : Archive::Caster::tryDowncast(ti, p); }; Archive::SetArchiveRegister(std::string(Demangle(typeid(T).name())),info); } + ~RegisterClassForArchive() + { + Archive::RemoveArchiveRegister(std::string(Demangle(typeid(T).name()))); + } };