Open
Description
alpaka/include/alpaka/core/DemangleTypeNames.hpp
Lines 18 to 19 in e20236d
We aim to remove boost completely. With clang 15+ and gcc 11+ we can remove this code with the following code.
These versions support std::source_location
.
#include <source_location>
#include <string>
#include <string_view>
/// \file
/// use source_location to derive the demangled type name
/// based on:
/// https://www.reddit.com/r/cpp/comments/lfi6jt/finally_a_possibly_portable_way_to_convert_types/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
struct DummyType
{
};
template<typename T>
inline auto EmbedTypeIntoSignature()
{
return std::string_view{std::source_location::current().function_name()};
}
template<typename T>
struct Demangled
{
static auto name()
{
constexpr size_t testSignatureLength = sizeof("DummyType") - 1;
auto const DummySignature = EmbedTypeIntoSignature<DummyType>();
// count char's until the type name starts
auto const startPosition = DummySignature.find("DummyType");
// count char's after the type information by removing type name information and pre information
auto const tailLength = DummySignature.size() - startPosition - testSignatureLength;
auto const EmbeddingSignature = EmbedTypeIntoSignature<T>();
auto const typeLength = EmbeddingSignature.size() - startPosition - tailLength;
return EmbeddingSignature.substr(startPosition, typeLength);
}
};
template<typename T>
auto demangled = Demangled<T>::name();