| // 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. |
| |
| #ifndef LIBBRILLO_BRILLO_TYPE_NAME_UNDECORATE_H_ |
| #define LIBBRILLO_BRILLO_TYPE_NAME_UNDECORATE_H_ |
| |
| #include <string> |
| #include <typeinfo> |
| |
| #include <brillo/brillo_export.h> |
| |
| #if !defined(USE_RTTI_FOR_TYPE_TAGS) && !defined(__clang__) |
| // When type information is used with RTTI disabled, we rely on |
| // __PRETTY_FUNCTION__ macro for type tags. Unfortunately gcc and clang produce |
| // different signatures for types that have optional template parameters, such |
| // as std::vector and std::map. The problem arises when inter-operating between |
| // libraries that are compiled with different compilers. |
| // Since most of Brillo is compiled with clang, we choose clang here exclusively |
| // and prevent this code from compiling with GCC to avoid hidden runtime errors. |
| #error TypeInfo/Any with RTTI disabled is supported on clang compiler only. |
| #endif |
| |
| namespace brillo { |
| |
| template <typename T> |
| const char* GetTypeTag() { |
| #if defined(USE_RTTI_FOR_TYPE_TAGS) && \ |
| (defined(__cpp_rtti) || defined(__GXX_RTTI)) |
| return typeid(T).name(); |
| #else |
| // __PRETTY_FUNCTION__ would include the type T signature and therefore each |
| // instance of brillo::internal_details::GetTypeTag<T>() will have a different |
| // tag string. |
| return __PRETTY_FUNCTION__; |
| #endif |
| } |
| |
| // Explicitly instantiate GetTypeTag<T>() for common types to minimize static |
| // data segment pollution. |
| extern template BRILLO_EXPORT const char* GetTypeTag<int8_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<uint8_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<int16_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<uint16_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<int32_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<uint32_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<int64_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<uint64_t>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<bool>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<double>(); |
| extern template BRILLO_EXPORT const char* GetTypeTag<std::string>(); |
| |
| // Use brillo::UndecorateTypeName() to obtain human-readable type from |
| // the decorated/mangled type name returned by std::type_info::name(). |
| BRILLO_EXPORT std::string UndecorateTypeName(const char* type_name); |
| |
| // Returns undecorated type name for the given type tag. This will extract the |
| // actual type name from the type tag string. |
| BRILLO_EXPORT std::string GetUndecoratedTypeNameForTag(const char* type_tag); |
| |
| // A template helper function that returns the undecorated type name for type T. |
| template <typename T> |
| inline std::string GetUndecoratedTypeName() { |
| return GetUndecoratedTypeNameForTag(GetTypeTag<T>()); |
| } |
| |
| } // namespace brillo |
| |
| #endif // LIBBRILLO_BRILLO_TYPE_NAME_UNDECORATE_H_ |