| // Copyright 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <brillo/type_name_undecorate.h> |
| |
| #include <cstring> |
| #include <map> |
| #include <string> |
| |
| #ifdef __GNUG__ |
| #include <cstdlib> |
| #include <cxxabi.h> |
| #include <memory> |
| #endif // __GNUG__ |
| |
| namespace brillo { |
| |
| std::string UndecorateTypeName(const char* type_name) { |
| #ifdef __GNUG__ |
| // Under g++ use abi::__cxa_demangle() to undecorate the type name. |
| int status = 0; |
| |
| std::unique_ptr<char, decltype(&std::free)> res{ |
| abi::__cxa_demangle(type_name, nullptr, nullptr, &status), std::free}; |
| |
| return (status == 0) ? res.get() : type_name; |
| #else |
| // If not compiled with g++, do nothing... |
| // E.g. MSVC's type_info::name() already contains undecorated name. |
| return type_name; |
| #endif |
| } |
| |
| std::string GetUndecoratedTypeNameForTag(const char* type_tag) { |
| #if defined(USE_RTTI_FOR_TYPE_TAGS) && \ |
| (defined(__cpp_rtti) || defined(__GXX_RTTI)) |
| return UndecorateTypeName(type_tag); |
| #else |
| // The signature of type tag for, say, 'int' would be the following: |
| // const char *brillo::GetTypeTag() [T = int] |
| // So we just need to extract the type name between '[T = ' and ']'. |
| const char* token = " = "; |
| const char* pos = std::strstr(type_tag, token); |
| if (!pos) |
| return type_tag; |
| std::string name = pos + std::strlen(token); |
| if (!name.empty() && name.back() == ']') |
| name.pop_back(); |
| return name; |
| #endif |
| } |
| |
| // Implementations of the explicitly instantiated GetTypeTag<T>() for common |
| // types. |
| template const char* GetTypeTag<int8_t>(); |
| template const char* GetTypeTag<uint8_t>(); |
| template const char* GetTypeTag<int16_t>(); |
| template const char* GetTypeTag<uint16_t>(); |
| template const char* GetTypeTag<int32_t>(); |
| template const char* GetTypeTag<uint32_t>(); |
| template const char* GetTypeTag<int64_t>(); |
| template const char* GetTypeTag<uint64_t>(); |
| template const char* GetTypeTag<bool>(); |
| template const char* GetTypeTag<double>(); |
| template const char* GetTypeTag<std::string>(); |
| |
| } // namespace brillo |