Add cast by Tree and refactor

This commit is contained in:
Данил
2025-02-21 20:10:57 +07:00
parent a429424143
commit 5bfafba515
5 changed files with 92 additions and 39 deletions
+56
View File
@@ -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<class Kind>
static bool IsA(Classes type)
{
return Meta<Kind>::Type == type;
}
template<class To, class From>
static To* dyn_cast(From* object)
{
IRTTI* InterfaceOfObject = static_cast<IRTTI*>(object);
if (IsA<To>(InterfaceOfObject->type))
return reinterpret_cast<To*>(object);
const size_t coutType = InterfaceOfObject->Tree.size;
for (size_t i = 0; i < coutType; ++i)
{
if (InterfaceOfObject->Tree.Tree[i] == Meta<To>::Type)
return reinterpret_cast<To*>(object);
}
return nullptr;
}
};