diff --git a/RTTI.cpp b/RTTI.cpp deleted file mode 100644 index 3608e24..0000000 --- a/RTTI.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "RTTI.h" - -Classes IRTTI::RTTI_Kind() const -{ - return type; -} diff --git a/RTTI.h b/RTTI.h deleted file mode 100644 index ffa79b7..0000000 --- a/RTTI.h +++ /dev/null @@ -1,32 +0,0 @@ -#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/RTTI.cpp b/RTTI/RTTI.cpp new file mode 100644 index 0000000..a64bf85 --- /dev/null +++ b/RTTI/RTTI.cpp @@ -0,0 +1,34 @@ +#include "RTTI.h" + +void IRTTI::TreeArray::push_back(const Classes type) +{ + size++; + Classes* NewTree = new Classes[size]; + + for (size_t i = 0; i < size - 1; ++i) + NewTree[i] = Tree[i]; + + NewTree[size - 1] = type; +} + +IRTTI::TreeArray::TreeArray() +{ + Tree = new Classes; + size = 1; +} + +void IRTTI::SetType(const Classes type) +{ + this->type = type; + //Tree.push_back(type); +} + +IRTTI::IRTTI() +{ + SetType(Classes::IRTTI); +} + +Classes IRTTI::RTTI_Kind() const +{ + return type; +} diff --git a/RTTI/RTTI.h b/RTTI/RTTI.h new file mode 100644 index 0000000..a392c88 --- /dev/null +++ b/RTTI/RTTI.h @@ -0,0 +1,56 @@ +#pragma once + +#include "RTTI_Meta.h" + +// Interface RTTI +GENERATE_META(IRTTI) +class IRTTI +{ + struct TreeArray + { + size_t size; + Classes* Tree; + void push_back(const Classes type); + TreeArray(); + }; + TreeArray Tree; + Classes type; +protected: + void SetType(Classes type); + + IRTTI(); + ~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::Type == type; + } + + template + static To* dyn_cast(From* object) + { + IRTTI* InterfaceOfObject = static_cast(object); + if (IsA(InterfaceOfObject->type)) + return reinterpret_cast(object); + + const size_t coutType = InterfaceOfObject->Tree.size; + for (size_t i = 0; i < coutType; ++i) + { + if (InterfaceOfObject->Tree.Tree[i] == Meta::Type) + return reinterpret_cast(object); + } + + return nullptr; + } +}; \ No newline at end of file diff --git a/RTTI_Meta.h b/RTTI/RTTI_Meta.h similarity index 81% rename from RTTI_Meta.h rename to RTTI/RTTI_Meta.h index 77fbee3..6c3ece6 100644 --- a/RTTI_Meta.h +++ b/RTTI/RTTI_Meta.h @@ -4,7 +4,7 @@ #define GENERATE_META(Class) \ class Class; \ template<> struct Meta { \ -static constexpr Classes TypeStr = Classes::##Class; \ +static constexpr Classes Type = Classes::##Class; \ }; // Predeclarate struct for meta information @@ -13,4 +13,5 @@ template struct Meta; // Enum type classes enum class Classes { + IRTTI };