include
behaviortree_cpp_v3
utils
demangle_util.h
Go to the documentation of this file.
1
#ifndef DEMANGLE_UTIL_H
2
#define DEMANGLE_UTIL_H
3
4
#include <string>
5
6
#if defined(__clang__) && defined(__has_include)
7
#if __has_include(<cxxabi.h>)
8
#define HAS_CXXABI_H
9
#endif
10
#elif defined(__GLIBCXX__) || defined(__GLIBCPP__)
11
#define HAS_CXXABI_H
12
#endif
13
14
#if defined(HAS_CXXABI_H)
15
#include <cxxabi.h>
16
#include <cstdlib>
17
#include <cstddef>
18
#endif
19
20
namespace
BT
21
{
22
inline
char
const
*
demangle_alloc
(
char
const
* name) noexcept;
23
inline
void
demangle_free
(
char
const
* name) noexcept;
24
25
class
scoped_demangled_name
26
{
27
private
:
28
char
const
*
m_p
;
29
30
public
:
31
explicit
scoped_demangled_name
(
char
const
* name) noexcept :
m_p
(
demangle_alloc
(name))
32
{}
33
34
~scoped_demangled_name
() noexcept
35
{
36
demangle_free
(
m_p
);
37
}
38
39
char
const
*
get
() const noexcept
40
{
41
return
m_p
;
42
}
43
44
scoped_demangled_name
(
scoped_demangled_name
const
&) =
delete
;
45
scoped_demangled_name
&
operator=
(
scoped_demangled_name
const
&) =
delete
;
46
};
47
48
#if defined(HAS_CXXABI_H)
49
50
inline
char
const
*
demangle_alloc
(
char
const
* name) noexcept
51
{
52
int
status = 0;
53
std::size_t size = 0;
54
return
abi::__cxa_demangle(name, NULL, &size, &status);
55
}
56
57
inline
void
demangle_free
(
char
const
* name) noexcept
58
{
59
std::free(
const_cast<
char
*
>
(name));
60
}
61
62
#else
63
64
inline
char
const
*
demangle_alloc
(
char
const
* name) noexcept
65
{
66
return
name;
67
}
68
69
inline
void
demangle_free
(
char
const
*) noexcept
70
{}
71
72
inline
std::string
demangle
(
char
const
* name)
73
{
74
return
name;
75
}
76
77
#endif
78
79
inline
std::string
demangle
(
const
std::type_info* info)
80
{
81
if
(!info)
82
{
83
return
"void"
;
84
}
85
if
(info == &
typeid
(std::string))
86
{
87
return
"std::string"
;
88
}
89
scoped_demangled_name
demangled_name(info->name());
90
char
const
*
const
p = demangled_name.
get
();
91
if
(p)
92
{
93
return
p;
94
}
95
else
96
{
97
return
info->name();
98
}
99
}
100
101
inline
std::string
demangle
(
const
std::type_info& info)
102
{
103
return
demangle
(&info);
104
}
105
106
}
// namespace BT
107
108
#undef HAS_CXXABI_H
109
110
#endif // DEMANGLE_UTIL_H
BT
Definition:
ex01_wrap_legacy.cpp:29
BT::demangle
std::string demangle(char const *name)
Definition:
demangle_util.h:72
BT::scoped_demangled_name::get
char const * get() const noexcept
Definition:
demangle_util.h:39
BT::scoped_demangled_name::operator=
scoped_demangled_name & operator=(scoped_demangled_name const &)=delete
BT::scoped_demangled_name
Definition:
demangle_util.h:25
BT::demangle_alloc
char const * demangle_alloc(char const *name) noexcept
Definition:
demangle_util.h:64
BT::scoped_demangled_name::scoped_demangled_name
scoped_demangled_name(char const *name) noexcept
Definition:
demangle_util.h:31
BT::demangle_free
void demangle_free(char const *name) noexcept
Definition:
demangle_util.h:69
BT::scoped_demangled_name::~scoped_demangled_name
~scoped_demangled_name() noexcept
Definition:
demangle_util.h:34
BT::scoped_demangled_name::m_p
char const * m_p
Definition:
demangle_util.h:28
behaviortree_cpp_v3
Author(s): Michele Colledanchise, Davide Faconti
autogenerated on Wed Jun 26 2024 02:51:19