From 3e83f7311b9c20d3e6385c3d277ff7c256ba617e Mon Sep 17 00:00:00 2001 From: Nicolas Gallego-Ortiz Date: Wed, 14 Aug 2019 11:25:36 +0200 Subject: [PATCH] internal name mechanism added at property creation --- .gitignore | 2 ++ src/OpenMesh/Core/Utils/Property.hh | 4 +-- src/OpenMesh/Core/Utils/PropertyContainer.hh | 3 +- src/OpenMesh/Core/Utils/typename.hh | 29 ++++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/OpenMesh/Core/Utils/typename.hh diff --git a/.gitignore b/.gitignore index 2ae4ed78..de469da2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ CMakeLists.txt.user build* *.swp .settings +# ignore mac temporal files +.DS_Store diff --git a/src/OpenMesh/Core/Utils/Property.hh b/src/OpenMesh/Core/Utils/Property.hh index c6507b09..d896e1b8 100644 --- a/src/OpenMesh/Core/Utils/Property.hh +++ b/src/OpenMesh/Core/Utils/Property.hh @@ -232,8 +232,8 @@ public: public: - explicit PropertyT(const std::string& _name = "") - : BaseProperty(_name) + explicit PropertyT(const std::string& _name = "", const std::string& _internal_type_name="" ) + : BaseProperty(_name, _internal_type_name) { } public: // inherited from BaseProperty diff --git a/src/OpenMesh/Core/Utils/PropertyContainer.hh b/src/OpenMesh/Core/Utils/PropertyContainer.hh index dcc9a3ac..6f1835e4 100644 --- a/src/OpenMesh/Core/Utils/PropertyContainer.hh +++ b/src/OpenMesh/Core/Utils/PropertyContainer.hh @@ -50,6 +50,7 @@ #endif #include +#include //----------------------------------------------------------------------------- namespace OpenMesh @@ -104,7 +105,7 @@ public: int idx=0; for ( ; p_it!=p_end && *p_it!=nullptr; ++p_it, ++idx ) {}; if (p_it==p_end) properties_.push_back(nullptr); - properties_[idx] = new PropertyT(_name); + properties_[idx] = new PropertyT(_name, get_type_name() ); // create a new property with requested name and given (system dependent) internal typename return BasePropHandleT(idx); } diff --git a/src/OpenMesh/Core/Utils/typename.hh b/src/OpenMesh/Core/Utils/typename.hh new file mode 100644 index 00000000..3dd4ba30 --- /dev/null +++ b/src/OpenMesh/Core/Utils/typename.hh @@ -0,0 +1,29 @@ +#ifndef TYPENAME_HH +#define TYPENAME_HH + +/// Get an internal name for a type +/// Important, this is depends on compilers and versions, do NOT se in file formats! +/// This provides property type safty when only limited RTTI is available +/// Solution adapted from OpenVolumeMesh + +#include +#include + +namespace OpenMesh { + +template +std::string get_type_name() +{ +#ifdef _MSC_VER + // MSVC'S type_name returns only a friendly name with name() method, + // to get a unique name use raw_name() method instead + return typeid(T).raw_name(); +#else + // GCC and clang curently return mangled name as name(), there is no raw_name() method + return typeid(T).name(); +#endif +} + +} + +#endif // TYPENAME_HH