61 lines
1.3 KiB
C++
61 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <cxxabi.h>
|
|
#include <string>
|
|
|
|
namespace sp {
|
|
|
|
template <typename T>
|
|
std::string GetBasicClassName(const T& a_Value) {
|
|
int status;
|
|
char* demangled = abi::__cxa_demangle(typeid(a_Value).name(), 0, 0, &status);
|
|
if (status != 0)
|
|
return "";
|
|
return std::string(demangled);
|
|
}
|
|
|
|
template <typename T>
|
|
std::string GetBasicClassName() {
|
|
int status;
|
|
char* demangled = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
|
|
if (status != 0)
|
|
return "";
|
|
return std::string(demangled);
|
|
}
|
|
|
|
template <typename T>
|
|
struct Reflector {
|
|
static std::string GetClassName() {
|
|
return GetBasicClassName<T>();
|
|
}
|
|
};
|
|
|
|
template <>
|
|
struct Reflector<std::string> {
|
|
static std::string GetClassName() {
|
|
return "std::string";
|
|
}
|
|
};
|
|
|
|
template <typename K, typename V>
|
|
struct Reflector<std::map<K, V>> {
|
|
static std::string GetClassName();
|
|
};
|
|
|
|
template <typename T>
|
|
struct Reflector<std::vector<T>> {
|
|
static std::string GetClassName();
|
|
};
|
|
|
|
template <typename T>
|
|
std::string Reflector<std::vector<T>>::GetClassName() {
|
|
return "std::vector<" + Reflector<T>::GetClassName() + ">";
|
|
}
|
|
|
|
template <typename K, typename V>
|
|
std::string Reflector<std::map<K, V>>::GetClassName() {
|
|
return "std::map<" + Reflector<K>::GetClassName() + ", " + Reflector<V>::GetClassName() + ">";
|
|
}
|
|
|
|
} // namespace sp
|