diff options
Diffstat (limited to 'test/source/GetTypeName.h')
-rw-r--r-- | test/source/GetTypeName.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/test/source/GetTypeName.h b/test/source/GetTypeName.h new file mode 100644 index 0000000..f844167 --- /dev/null +++ b/test/source/GetTypeName.h @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////// +// Copyright (c) Electronic Arts Inc. All rights reserved. +///////////////////////////////////////////////////////////////////////////// + + +#ifndef GETTYPENAME_H +#define GETTYPENAME_H + + +#include <EABase/eabase.h> +#include <EASTL/type_traits.h> +#include <EASTL/string.h> +#include <stdlib.h> +#include <typeinfo> + + +/////////////////////////////////////////////////////////////////////////////// +// EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE +// +// Defined as 0 or 1. The value depends on the compilation environment. +// Indicates if we can use system-provided abi::__cxa_demangle() at runtime. +// +#if !defined(EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE) + #if (defined(EA_PLATFORM_LINUX) || defined(EA_PLATFORM_APPLE)) && defined(EA_PLATFORM_DESKTOP) + #define EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE 1 + #else + #define EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE 0 + #endif +#endif + + +#if EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE + #include <cxxabi.h> +#elif EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) + EA_DISABLE_ALL_VC_WARNINGS(); + #include <Windows.h> + #include <DbgHelp.h> + #pragma comment(lib, "dbghelp.lib") + EA_RESTORE_ALL_VC_WARNINGS(); +#endif + + +/////////////////////////////////////////////////////////////////////////////// +// EASTLTEST_GETTYPENAME_AVAILABLE +// +// Defined as 0 or 1. The value depends on the compilation environment. +// Indicates if we can use system-provided abi::__cxa_demangle() at runtime. +// +#if !defined(EASTLTEST_GETTYPENAME_AVAILABLE) + #if (EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE || EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP)) && (!defined(EA_COMPILER_NO_RTTI) || defined(_MSC_VER)) // VC++ works without RTTI enabled. + #define EASTLTEST_GETTYPENAME_AVAILABLE 1 + #else + #define EASTLTEST_GETTYPENAME_AVAILABLE 0 + #endif +#endif + + +/// GetTypeName +/// +/// Returns the type name of a templated type. +/// +template <typename T> +eastl::string GetTypeName() +{ + eastl::string result; + + #if !defined(EA_COMPILER_NO_RTTI) || defined(_MSC_VER) // VC++ works without RTTI enabled. + typedef typename eastl::remove_reference<T>::type TR; + + const char* pName = typeid(TR).name(); + + #if EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE + const char* pDemangledName = abi::__cxa_demangle(pName, NULL, NULL, NULL); + + #elif EA_WINAPI_FAMILY_PARTITION(EA_WINAPI_PARTITION_DESKTOP) + char pDemangledName[1024]; + DWORD count = UnDecorateSymbolName(pName, pDemangledName, (DWORD)EAArrayCount(pDemangledName), UNDNAME_NO_THISTYPE | UNDNAME_NO_ACCESS_SPECIFIERS | UNDNAME_NO_MEMBER_TYPE); + if(count == 0) + pDemangledName[0] = 0; + #else + const char* pDemangledName = NULL; + #endif + + if(pDemangledName && pDemangledName[0]) + result = pDemangledName; + else + result = pName; + + if(eastl::is_const<TR>::value) + result += " const"; + + if(eastl::is_volatile<TR>::value) + result += " volatile"; + + if(eastl::is_lvalue_reference<T>::value) + result += "&"; + else if(eastl::is_rvalue_reference<T>::value) + result += "&&"; + + if(pDemangledName) + { + #if EASTL_LIBSTDCPP_DEMANGLE_AVAILABLE + free((void*)(pDemangledName)); + #endif + } + #endif + + return result; +} + + +#endif // Header include guard + + + + + + + |