You.i Engine
YiRtti.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_RTTI_H_
3 #define _YI_RTTI_H_
4 
5 #include "framework/YiPredef.h"
7 #include "utility/YiString.h"
8 #include "utility/YiTypeTraits.h"
9 
10 #include <map>
11 
49 {
50 public:
51  virtual ~CYIRuntimeTypeInfo();
52 
62  template<typename T>
63  inline std::unique_ptr<T> CreateInstance() const;
64 
68  virtual bool CanCastTo(const CYIRuntimeTypeInfo &baseType) const = 0;
69 
77  template<typename T>
78  inline bool CanCastTo() const;
79 
83  const CYIString &GetName() const;
84 
88  virtual const std::vector<const CYIRuntimeTypeInfo*> &GetBasesTypeInfos() const = 0;
89 
93  virtual bool IsInstantiable() const = 0;
94 
98  void RegisterWithLinker() const;
99 
113  template<typename T>
114  inline const T *CastVoidPointer(const void *pObject) const;
115 
116  inline bool operator==(const CYIRuntimeTypeInfo &other) const;
117  inline bool operator!=(const CYIRuntimeTypeInfo &other) const;
118  inline bool operator<(const CYIRuntimeTypeInfo &other) const;
119 
120 protected:
121  CYIRuntimeTypeInfo(const CYIString &name);
122  virtual void *CreateVoidInstance() const = 0;
123 
124 private:
125  virtual const void *CastVoidToVoid(const CYIRuntimeTypeInfo &baseType, const void *pObject) const = 0;
126 
127  CYIString m_name;
128 
130 };
131 
132 
133 
146 template<typename CLASS, typename BASE1 = void, typename BASE2 = void, typename BASE3 = void>
148 {
149 public:
153  typedef CLASS ClassType;
154 
158  typedef BASE1 BaseType1;
159 
163  typedef BASE2 BaseType2;
164 
168  typedef BASE3 BaseType3;
169 
175  inline bool CanCastToNonVirtual(const CYIRuntimeTypeInfo &baseType) const;
176 
188  template<typename T>
189  inline bool CanCastTo() const;
190 
196  template<typename T, typename TBASE1, typename TBASE2, typename TBASE3>
197  inline bool CanCastTo(const CYIRuntimeTypeInfoTyped<T, TBASE1, TBASE2, TBASE3> &baseType) const;
198 
204  inline std::unique_ptr<CLASS> CreateInstance() const;
205 
206  virtual const void *CastVoidToVoid(const CYIRuntimeTypeInfo &baseType, const void *pObject) const override;
207  inline const void *CastVoidToVoidNonVirtual(const CYIRuntimeTypeInfo &baseType, const void *pObject) const;
208  virtual bool CanCastTo(const CYIRuntimeTypeInfo &baseType) const override;
209  virtual const std::vector<const CYIRuntimeTypeInfo*> &GetBasesTypeInfos() const override;
210 
211 protected:
212  CYIRuntimeTypeInfoTyped(const CYIString &name);
213 };
214 
215 
216 
225 {
226 public:
230  static CYIRTTIRegistry &GetInstance();
231 
243  void RegisterType(const CYIRuntimeTypeInfo &typeInfo, const CYIString &name);
244 
250  const CYIRuntimeTypeInfo &RegisterTypeHelper(const CYIRuntimeTypeInfo &typeInfo);
251 
259  void UnregisterType(const CYIString &name);
260 
266  inline const CYIRuntimeTypeInfo *GetTypeForName(const CYIString &typeName) const;
267 
271  std::map<CYIString, const CYIRuntimeTypeInfo*> GetRegisteredTypes() const;
272 
278  std::vector<const CYIRuntimeTypeInfo *> GetSuperclassesTypeInfos(const CYIRuntimeTypeInfo &type, bool bDirectSuperclassesOnly = false) const;
279 
285  std::vector<const CYIRuntimeTypeInfo *> GetSubclassesTypeInfos(const CYIRuntimeTypeInfo &type, bool bDirectSubclassesOnly = false) const;
286 
292  std::vector<const CYIRuntimeTypeInfo *> GetRootTypeInfos() const;
293 
314  CYIString GenerateInheritanceTreeString(const CYIRuntimeTypeInfo &type, bool bUseASCII = false, const CYIString &textColor = "", const CYIString &graphColor = "", const CYIString &noticeColor = "") const;
315 
316 private:
317  struct StringComparator
318  {
319  inline bool operator()(const CYIString &lhs, const CYIString &rhs) const;
320  };
321 
322  CYIRTTIRegistry();
323 
324  std::map<CYIString, const CYIRuntimeTypeInfo*, StringComparator> m_types;
325 
327 };
328 
329 
330 
350 #define YI_TYPE_BASES(...) YI_MAKE_VARIADIC_MACRO(YI_TYPE_BASES_, ##__VA_ARGS__)
351 
372 #define YI_TYPE_DEF(...) YI_MAKE_VARIADIC_MACRO(YI_TYPE_DEF_, ##__VA_ARGS__)
373 
394 #define YI_TYPE_DEF_INST(...) YI_MAKE_VARIADIC_MACRO(YI_TYPE_DEF_INST_, ##__VA_ARGS__)
395 
412 #define YI_TYPE_DEF_WITH_NAME(...) YI_MAKE_VARIADIC_MACRO(YI_TYPE_DEF_WITH_NAME_, ##__VA_ARGS__)
413 
430 #define YI_TYPE_DEF_INST_WITH_NAME(...) YI_MAKE_VARIADIC_MACRO(YI_TYPE_DEF_INST_WITH_NAME_, ##__VA_ARGS__)
431 
432 
433 
434 #if defined(DOXY)
435 
461 template<typename TARGET, typename SOURCE>
462 inline TARGET *YiDynamicCast(SOURCE *pObject);
463 
482 template<typename TARGET, typename SOURCE>
483 inline std::shared_ptr<TARGET> YiDynamicPointerCast(const std::shared_ptr<SOURCE> &pObject);
484 
488 template<typename TARGET, typename SOURCE>
489 inline std::shared_ptr<TARGET> YiDynamicCast(const std::shared_ptr<SOURCE> &pObject);
490 #endif
491 
505 template<typename T>
506 std::unique_ptr<T> YiRTTINew(const CYIString &name);
507 
511 const CYIRuntimeTypeInfo *YiGetTypeInfo(const char *pTypeName);
512 
516 const CYIRuntimeTypeInfo *YiGetTypeInfo(const CYIString &typeName);
517 
521 template<typename T>
522 inline const CYIRuntimeTypeInfo *YiGetTypeInfo(T *pObject);
523 
524 
525 
526 #if defined(DOXY)
527 
531 class RTTISampleClass : public Base1, public Base2, public Base3
532 {
533 public:
547  static const CYIRuntimeTypeInfoTyped<RTTISampleClass, Base1, Base2, Base3> &GetClassTypeInfo();
548 
558  const CYIRuntimeTypeInfo &GetRuntimeTypeInfo() const;
559 };
560 
561 #endif
562 
565 #include "utility/YiRtti.inl"
566 
567 #endif /* _YI_RTTI_H_ */
bool operator!=(const CYIRuntimeTypeInfo &other) const
bool operator==(const CYIRuntimeTypeInfo &other) const
#define YI_DISALLOW_COPY_AND_ASSIGN(TypeName)
Delete the copy constructor and assignment operator (and consequently the move constructor as well) ...
Definition: YiPredef.h:114
Container class for Unicode strings. Conceptually, a CYIString object is a sequence of Unicode charac...
Definition: YiString.h:35
const CYIRuntimeTypeInfo * YiGetTypeInfo(const char *pTypeName)
void RegisterWithLinker() const
virtual ~CYIRuntimeTypeInfo()
TARGET * YiDynamicCast(SOURCE *pObject)
Casts the pointer pObject to type T*.
BASE1 BaseType1
Definition: YiRtti.h:158
CLASS ClassType
Definition: YiRtti.h:153
std::shared_ptr< TARGET > YiDynamicPointerCast(const std::shared_ptr< SOURCE > &pObject)
Casts the shared pointer pObject to shared pointer type T*.
const CYIString & GetName() const
bool CanCastTo() const
BASE2 BaseType2
Definition: YiRtti.h:163
virtual const std::vector< const CYIRuntimeTypeInfo * > & GetBasesTypeInfos() const =0
This is a sample class to document the RTTI functions inserted into classes by the YI_TYPE_BASES(...
Definition: YiRtti.h:531
const T * CastVoidPointer(const void *pObject) const
The abstract runtime representation of a C++ type.
Definition: YiRtti.h:48
virtual bool IsInstantiable() const =0
bool operator<(const CYIRuntimeTypeInfo &other) const
A registry of all known RTTI types.
Definition: YiRtti.h:224
virtual void * CreateVoidInstance() const =0
BASE3 BaseType3
Definition: YiRtti.h:168
std::unique_ptr< T > YiRTTINew(const CYIString &name)
Creates a new instance of the type identifed by name.
std::unique_ptr< T > CreateInstance() const
CYIRuntimeTypeInfo(const CYIString &name)
The runtime representation of a C++ type.
Definition: YiRtti.h:147