diff --git a/sol/demangle.hpp b/sol/demangle.hpp index b1ef893d..77de1311 100644 --- a/sol/demangle.hpp +++ b/sol/demangle.hpp @@ -32,12 +32,12 @@ namespace sol { namespace detail { #ifdef _MSC_VER -std::string demangle(const std::type_info& id) { +std::string get_type_name(const std::type_info& id) { return id.name(); } #elif defined(__GNUC__) || defined(__clang__) -std::string demangle(const std::type_info& id) { +std::string get_type_name(const std::type_info& id) { int status; char* unmangled = abi::__cxa_demangle(id.name(), 0, 0, &status); std::string realname = unmangled; @@ -49,24 +49,26 @@ std::string demangle(const std::type_info& id) { #error Compiler not supported for demangling #endif // compilers -std::string lua_demangle(const std::type_info& id) { - std::string realname = demangle(id); - const static std::array removals = { "struct ", "class " }; - const static std::array replacements = { "::", "_" }; +std::string demangle(const std::type_info& id) { + std::string realname = get_type_name(id); + const static std::array removals = {{ "struct ", "class " }}; + const static std::array replacements = {{ "::", "_" }}; for(std::size_t r = 0; r < removals.size(); ++r) { auto found = realname.find(removals[r]); - while (found != std::string::npos) { + while(found != std::string::npos) { realname.erase(found, removals[r].size()); found = realname.find(removals[r]); } } + for(std::size_t r = 0; r < replacements.size(); r+=2) { auto found = realname.find(replacements[r]); - while (found != std::string::npos) { - realname.replace(found, replacements[r].size(), replacements[r+1]); + while(found != std::string::npos) { + realname.replace(found, replacements[r].size(), replacements[r + 1]); found = realname.find(replacements[r], found); } } + return realname; } } // detail diff --git a/sol/userdata.hpp b/sol/userdata.hpp index 07dc262b..d6c8af02 100644 --- a/sol/userdata.hpp +++ b/sol/userdata.hpp @@ -42,7 +42,7 @@ struct userdata_traits { }; template -const std::string userdata_traits::name = detail::lua_demangle(typeid(T)); +const std::string userdata_traits::name = detail::demangle(typeid(T)); template const std::string userdata_traits::metatable = std::string("sol.stateful.").append(name);