diff --git a/RTTI.cpp b/RTTI.cpp new file mode 100644 index 0000000..3608e24 --- /dev/null +++ b/RTTI.cpp @@ -0,0 +1,6 @@ +#include "RTTI.h" + +Classes IRTTI::RTTI_Kind() const +{ + return type; +} diff --git a/RTTI.h b/RTTI.h new file mode 100644 index 0000000..ffa79b7 --- /dev/null +++ b/RTTI.h @@ -0,0 +1,32 @@ +#pragma once + +#include "RTTI_Meta.h" + +// Interface RTTI +class IRTTI +{ +protected: + Classes type; + virtual ~IRTTI() = default; +public: + Classes RTTI_Kind() const; + + friend class RTTI; +}; + +// RTTI metods +class RTTI final +{ + RTTI() = default; +public: + template + static bool IsA(Classes type) + { + return Meta::TypeStr == type; + } + template + static To* dyn_cast(From* object) + { + return IsA(static_cast(object)->type) ? reinterpret_cast(object) : nullptr; + } +}; \ No newline at end of file diff --git a/RTTI_Meta.h b/RTTI_Meta.h new file mode 100644 index 0000000..77fbee3 --- /dev/null +++ b/RTTI_Meta.h @@ -0,0 +1,16 @@ +#pragma once + +// This macro adds meta information to a type. +#define GENERATE_META(Class) \ +class Class; \ +template<> struct Meta { \ +static constexpr Classes TypeStr = Classes::##Class; \ +}; + +// Predeclarate struct for meta information +template struct Meta; + +// Enum type classes +enum class Classes +{ +};