BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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