#include <cxxabi.h>
#include <string>
#include <typeinfo>
#include <cassert>
#include <cstdlib>
#include <iostream>
const std::string demangle(const char* const mangledTypeName) {
int resultStatus = -4;
const char* const result = abi::__cxa_demangle( mangledTypeName, 0, 0, &resultStatus );
std::string demangledTypeName;
const bool noError = (0 == resultStatus);
const bool demangledSuccess = (noError && result != 0);
assert(demangledSuccess);
demangledTypeName = (demangledSuccess ? result : "Unknown type.");
free(const_cast<char*>(result));
return demangledTypeName;
}
const std::string demangle(const std::string& mangledTypeName) {
return demangle(mangledTypeName.c_str());
}
const std::string demangledNameOfType(const std::type_info& type_id) {
return demangle(type_id.name());
}
#define DEMANGLED_NAME_OF_TYPE(TypeOrValue) (demangledNameOfType(typeid(TypeOrValue)))
#define PRINT_NAME_OF_TYPE(TypeOrValue) {std::cout<<DEMANGLED_NAME_OF_TYPE(TypeOrValue)<<std::endl;}
int main()
{
PRINT_NAME_OF_TYPE( 'a' );
PRINT_NAME_OF_TYPE( 'a1' );
}
I2luY2x1ZGUgPGN4eGFiaS5oPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxjYXNzZXJ0PgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY29uc3Qgc3RkOjpzdHJpbmcgZGVtYW5nbGUoY29uc3QgY2hhciogY29uc3QgbWFuZ2xlZFR5cGVOYW1lKSB7CiAgIGludCByZXN1bHRTdGF0dXMgPSAtNDsKICAgY29uc3QgY2hhciogY29uc3QgcmVzdWx0ID0gYWJpOjpfX2N4YV9kZW1hbmdsZSggbWFuZ2xlZFR5cGVOYW1lLCAwLCAwLCAmcmVzdWx0U3RhdHVzICk7CiAgIHN0ZDo6c3RyaW5nIGRlbWFuZ2xlZFR5cGVOYW1lOwogICBjb25zdCBib29sIG5vRXJyb3IgPSAoMCA9PSByZXN1bHRTdGF0dXMpOwogICBjb25zdCBib29sIGRlbWFuZ2xlZFN1Y2Nlc3MgPSAobm9FcnJvciAmJiByZXN1bHQgIT0gMCk7CiAgIGFzc2VydChkZW1hbmdsZWRTdWNjZXNzKTsKICAgZGVtYW5nbGVkVHlwZU5hbWUgPSAoZGVtYW5nbGVkU3VjY2VzcyA/IHJlc3VsdCA6ICJVbmtub3duIHR5cGUuIik7CiAgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4ocmVzdWx0KSk7CiAgIHJldHVybiBkZW1hbmdsZWRUeXBlTmFtZTsKfQoKY29uc3Qgc3RkOjpzdHJpbmcgZGVtYW5nbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1hbmdsZWRUeXBlTmFtZSkgewogICByZXR1cm4gZGVtYW5nbGUobWFuZ2xlZFR5cGVOYW1lLmNfc3RyKCkpOwp9Cgpjb25zdCBzdGQ6OnN0cmluZyBkZW1hbmdsZWROYW1lT2ZUeXBlKGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiB0eXBlX2lkKSB7CiAgIHJldHVybiBkZW1hbmdsZSh0eXBlX2lkLm5hbWUoKSk7Cn0KCiNkZWZpbmUgREVNQU5HTEVEX05BTUVfT0ZfVFlQRShUeXBlT3JWYWx1ZSkgKGRlbWFuZ2xlZE5hbWVPZlR5cGUodHlwZWlkKFR5cGVPclZhbHVlKSkpCiNkZWZpbmUgUFJJTlRfTkFNRV9PRl9UWVBFKFR5cGVPclZhbHVlKSB7c3RkOjpjb3V0PDxERU1BTkdMRURfTkFNRV9PRl9UWVBFKFR5cGVPclZhbHVlKTw8c3RkOjplbmRsO30KCmludCBtYWluKCkKewogICAgUFJJTlRfTkFNRV9PRl9UWVBFKCAnYScgKTsKICAgIFBSSU5UX05BTUVfT0ZfVFlQRSggJ2ExJyApOwp9