/* pybind11/detail/typeid.h: Compiler-independent access to type identifiers Copyright (c) 2016 Wenzel Jakob All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. */ #pragma once #include #include #if defined(__GNUG__) #include #endif NAMESPACE_BEGIN(PYBIND11_NAMESPACE) NAMESPACE_BEGIN(detail) /// Erase all occurrences of a substring inline void erase_all(std::string &string, const std::string &search) { for (size_t pos = 0;;) { pos = string.find(search, pos); if (pos == std::string::npos) break; string.erase(pos, search.length()); } } PYBIND11_NOINLINE inline void clean_type_id(std::string &name) { #if defined(__GNUG__) int status = 0; std::unique_ptr res { abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status), std::free }; if (status == 0) name = res.get(); #else detail::erase_all(name, "class "); detail::erase_all(name, "struct "); detail::erase_all(name, "enum "); #endif detail::erase_all(name, "pybind11::"); } NAMESPACE_END(detail) /// Return a string representation of a C++ type template static std::string type_id() { std::string name(typeid(T).name()); detail::clean_type_id(name); return name; } NAMESPACE_END(PYBIND11_NAMESPACE)