From 4436e79e6aec4b7fb9f049680c8aa33d4c33de63 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: Sun, 23 Feb 2025 15:49:53 +0700 Subject: [PATCH] Optimized type casting and refactor --- RTTI/RTTI.cpp | 72 ++++++++++++++++++++++++++++++++++++------------ RTTI/RTTI.h | 68 +++++++++++++++++++++++++++++++-------------- RTTI/RTTI_Meta.h | 6 ++-- 3 files changed, 105 insertions(+), 41 deletions(-) diff --git a/RTTI/RTTI.cpp b/RTTI/RTTI.cpp index 3c01557..bd6f04c 100644 --- a/RTTI/RTTI.cpp +++ b/RTTI/RTTI.cpp @@ -1,29 +1,60 @@ #include "RTTI.h" -void IRTTI::TreeArray::push_back(const Classes type) +void IRTTI::FastContainer::push_back(const Classes newType) { - Tree[size - 1] = type; - - size++; - Classes* NewTree = new Classes[size]; + if (0 == _size) + { + ++_size; + array = new Classes; + *array = newType; + } + else + { + ++_size; + Classes* NewArray = new Classes[_size]; - for (size_t i = 0; i < size - 1; ++i) - NewTree[i] = Tree[i]; - - delete[] Tree; - Tree = NewTree; + long long indexObject = _size - 1; + for (long long i = 0, j = 0; i < _size - 1; ++i, ++j) + { + if (newType < array[i] && indexObject == _size - 1) + { + indexObject = j; + ++j; + } + + NewArray[j] = array[i]; + } + NewArray[indexObject] = newType; + + delete[] array; + array = NewArray; + } } -IRTTI::TreeArray::TreeArray() +bool IRTTI::FastContainer::find(const Classes& Type) const { - Tree = new Classes; - size = 1; + long long low = 0; + long long high = _size - 1; + + while (low <= high) + { + long long mid = (low + high) / 2; + if (static_cast(array[mid]) == static_cast(Type)) + return true; + + if (static_cast(array[mid]) > static_cast(Type)) + high = mid - 1; + else + low = mid + 1; + } + + return false; } -void IRTTI::SetType(const Classes type) +void IRTTI::SetType(const Classes Type) { - this->type = type; - Tree.push_back(type); + this->type = Type; + Tree.push_back(Type); } IRTTI::IRTTI() @@ -31,7 +62,12 @@ IRTTI::IRTTI() SetType(Classes::IRTTI); } -Classes IRTTI::RTTI_Kind() const +Classes RTTI::GetType(const IRTTI* object) { - return type; + return object->type; +} + +const char* RTTI::GetTypeStr(const IRTTI* object) +{ + return enum_to_string(object->type); } diff --git a/RTTI/RTTI.h b/RTTI/RTTI.h index c021cb8..1a7f7e2 100644 --- a/RTTI/RTTI.h +++ b/RTTI/RTTI.h @@ -6,37 +6,62 @@ GENERATE_META(IRTTI) class IRTTI { - struct TreeArray + // Fast array + class FastContainer final { - size_t size; - Classes* Tree; - void push_back(const Classes type); - TreeArray(); + long long _size = 0; + Classes* array = nullptr; + public: + long long constexpr size() const { return _size; } + void push_back(const Classes object); + bool find(const Classes& Type) const; }; - TreeArray Tree; + FastContainer Tree; Classes type; protected: - void SetType(Classes type); + // That method set type value and add type to inheritance tree + void SetType(Classes Type); IRTTI(); ~IRTTI() = default; -public: - Classes RTTI_Kind() const; - + friend class RTTI; }; -// RTTI metods +// RTTI methods class RTTI final { RTTI() = default; -public: + + // Convert enum to string + [[nodiscard]] + static const char* enum_to_string(const Classes type) + { + switch (type) + { + case Classes::IRTTI: return "IRTTI"; + case Classes::TestA: return "TestA"; + case Classes::TestB: return "TestB"; + case Classes::TestC: return "TestC"; + case Classes::TestD: return "TestD"; + default: return "Undefined"; + } + } + + // That method allow compare given type with real type object template - static bool IsA(Classes type) + static bool IsA(const Classes type) { return Meta::Type == type; } - +public: + template + static bool IsA(const IRTTI* object) + { + return IsA(object->type); + } + + // That method realized dynamic_cast template static To* dyn_cast(From* object) { @@ -44,13 +69,16 @@ public: if (IsA(InterfaceOfObject->type)) return reinterpret_cast(object); - const size_t coutType = InterfaceOfObject->Tree.size - 1; - for (size_t i = 0; i < coutType; ++i) - { - if (InterfaceOfObject->Tree.Tree[i] == Meta::Type) - return reinterpret_cast(object); - } + if (InterfaceOfObject->Tree.find(Meta::Type)) + return reinterpret_cast(object); return nullptr; } + + // That method return real type object in the form of enum value + static Classes GetType(const IRTTI* object); + + // That method return real type in the form of string + [[nodiscard]] + static const char* GetTypeStr(const IRTTI* object); }; \ No newline at end of file diff --git a/RTTI/RTTI_Meta.h b/RTTI/RTTI_Meta.h index 6c3ece6..e77121a 100644 --- a/RTTI/RTTI_Meta.h +++ b/RTTI/RTTI_Meta.h @@ -1,16 +1,16 @@ #pragma once -// This macro adds meta information to a type. +// This macro adds meta information to a type #define GENERATE_META(Class) \ class Class; \ template<> struct Meta { \ static constexpr Classes Type = Classes::##Class; \ }; -// Predeclarate struct for meta information +// Predeclared struct for meta information template struct Meta; -// Enum type classes +// Enum type classes enum class Classes { IRTTI