internal name mechanism added at property creation

This commit is contained in:
Nicolas Gallego-Ortiz
2019-08-14 11:25:36 +02:00
parent 1f0f036e77
commit 3e83f7311b
4 changed files with 35 additions and 3 deletions

View File

@@ -232,8 +232,8 @@ public:
public:
explicit PropertyT(const std::string& _name = "<unknown>")
: BaseProperty(_name)
explicit PropertyT(const std::string& _name = "<unknown>", const std::string& _internal_type_name="" )
: BaseProperty(_name, _internal_type_name)
{ }
public: // inherited from BaseProperty

View File

@@ -50,6 +50,7 @@
#endif
#include <OpenMesh/Core/Utils/Property.hh>
#include <OpenMesh/Core/Utils/TypeName.hh>
//-----------------------------------------------------------------------------
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<T>(_name);
properties_[idx] = new PropertyT<T>(_name, get_type_name<T>() ); // create a new property with requested name and given (system dependent) internal typename
return BasePropHandleT<T>(idx);
}

View File

@@ -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 <string>
#include <typeinfo>
namespace OpenMesh {
template <typename T>
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