From a429424143b13804d92850295f6cd163aab198cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=B8=D0=BB?= <119668441+Jiga228@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:01:20 +0700 Subject: [PATCH] Create repository --- RTTI.cpp | 6 ++++++ RTTI.h | 32 ++++++++++++++++++++++++++++++++ RTTI_Meta.h | 16 ++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 RTTI.cpp create mode 100644 RTTI.h create mode 100644 RTTI_Meta.h 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 +{ +};