BALL
1.4.2
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
include
BALL
COMMON
rtti.h
Go to the documentation of this file.
1
// -*- Mode: C++; tab-width: 2; -*-
2
// vi: set ts=2:
3
//
4
5
#ifndef BALL_COMMON_RTTI_H
6
#define BALL_COMMON_RTTI_H
7
8
#ifndef BALL_CONFIG_CONFIG_H
9
# include <BALL/CONFIG/config.h>
10
#endif
11
12
#ifndef BALL_COMMON_H
13
# include <
BALL/common.h
>
14
#endif
15
16
#include <string>
17
#include <typeinfo>
18
using
std::string;
19
20
namespace
BALL
21
{
22
23
# ifdef __GNUC__
24
// EGCS produces a nearly unreadable name mangling that requires
25
// further interpretation
26
namespace
GNUDemangling
27
{
28
BALL_EXPORT
string
demangle(
string
s);
29
}
30
# endif
31
42
BALL_EXPORT
string
streamClassName
(
const
std::type_info& t);
43
66
namespace
RTTI
67
{
68
74
template
<
typename
T>
75
const
T&
getDefault
()
76
{
77
static
T t;
78
return
t;
79
}
80
86
template
<
typename
T>
87
void
*
getNew
()
88
{
89
return
static_cast<
void
*
>
(
new
T);
90
}
91
96
template
<
typename
T>
97
const
char
*
getName
()
98
{
99
return
typeid
(T).name();
100
}
101
104
template
<
typename
T>
105
void
*
getClassID
()
106
{
107
static
char
dummy;
108
return
(
void
*)&dummy;
109
}
110
121
template
<
typename
T>
122
const
char
*
getStreamName
()
123
{
124
// define portable names for the portable
125
// types (some platforms use Size, some unsigned int,
126
// SUN CC even unsigned for the Size type)
127
if
((
typeid
(T) ==
typeid
(
Size
))
128
|| (
typeid
(T) ==
typeid
(
Position
))
129
|| (
typeid
(T) ==
typeid
(
HashIndex
))
130
|| (
typeid
(T) ==
typeid
(
Property
))
131
|| (
typeid
(T) ==
typeid
(
Handle
)))
132
{
133
return
"BALL::Size"
;
134
}
135
if
((
typeid
(T) ==
typeid
(
Index
))
136
|| (
typeid
(T) ==
typeid
(
ErrorCode
))
137
|| (
typeid
(T) ==
typeid
(
Distance
)))
138
{
139
return
"BALL::Index"
;
140
}
141
if
(
typeid
(T) ==
typeid
(::std::string))
142
{
143
return
"::std::string"
;
144
}
145
if
(
typeid
(T) ==
typeid
(
LongSize
))
146
{
147
return
"BALL::LongSize"
;
148
}
149
if
(
typeid
(T) ==
typeid
(
bool
))
150
{
151
return
"bool"
;
152
}
153
if
(
typeid
(T) ==
typeid
(
float
))
154
{
155
return
"float"
;
156
}
157
if
(
typeid
(T) ==
typeid
(
char
))
158
{
159
return
"char"
;
160
}
161
if
(
typeid
(T) ==
typeid
(
unsigned
char
))
162
{
163
return
"unsigned_char"
;
164
}
165
if
(
typeid
(T) ==
typeid
(
double
))
166
{
167
return
"double"
;
168
}
169
static
string
s(
""
);
170
static
bool
is_set =
false
;
171
172
if
(!is_set)
173
{
174
is_set =
true
;
175
s =
streamClassName
(
typeid
(T));
176
}
177
178
return
s.c_str();
179
}
180
191
template
<
typename
T,
typename
U>
192
bool
isKindOf
(
const
U& u)
193
{
194
return
(0 != dynamic_cast<const T*>(&u));
195
}
196
214
template
<
typename
T,
typename
U>
215
T*
castTo
(
const
U& u)
216
{
217
return
const_cast<
T*
>
(
dynamic_cast<
const
T*
>
(&u));
218
}
219
225
template
<
typename
T,
typename
U>
226
bool
isInstanceOf
(
const
U& u)
227
{
228
return
(
typeid
(u) ==
typeid
(T));
229
}
230
231
}
// namespace RTTI
232
}
// namespace BALL
233
234
#endif // BALL_COMMON_RTTI_H
Generated by
1.8.3.1