zengine-old/engine/3rdparty/zlib/include/refl/detail/uclass.h

126 lines
2.8 KiB
C
Raw Normal View History

2024-04-08 21:01:50 +08:00
#pragma once
#include "field.h"
#include "view.h"
2024-04-19 22:02:27 +08:00
#include "meta.h"
2024-04-08 21:01:50 +08:00
namespace refl {
2024-04-15 19:53:39 +08:00
enum ClassFlag :uint32_t {
CLASS_NONE_FLAG = 0,
CLASS_TRIVIAL_FLAG = 1 << 0,
2024-04-25 21:45:41 +08:00
CLASS_POINTER_FLAG = 1 << 1,
CLASS_ARRAY_FLAG = 1 << 2,
2024-04-15 19:53:39 +08:00
};
2024-04-16 16:17:13 +08:00
using enum ClassFlag;
2024-04-08 21:01:50 +08:00
struct vtable_uclass
{
//class
2024-04-16 16:17:13 +08:00
const FieldPtr* (*GetField)(const UClass*, const Name&, int);
2024-04-08 21:01:50 +08:00
//function
2024-04-16 16:17:13 +08:00
sarray<const UClass*>(*GetParams)(const UClass*);
2024-04-08 21:01:50 +08:00
//function
2024-04-19 22:02:27 +08:00
void (*Call)(const FieldPtr*, const sarray<Any>& ArgsList);
2024-04-28 00:23:35 +08:00
//meta
const UClass* (*GetMeta)(const Name&);
2024-04-09 16:31:09 +08:00
//object
void (*InitObject)(void*);
void (*CopyObject)(void*, const void*);
void (*DestObject)(void*);
2024-04-08 21:01:50 +08:00
};
class UClass{
public:
Name name;
uint32_t size;
2024-04-15 19:53:39 +08:00
uint32_t flag{0};
2024-04-08 21:01:50 +08:00
const UClass* parent;
2024-04-19 22:02:27 +08:00
Meta* meta{nullptr};
2024-04-08 21:01:50 +08:00
vtable_uclass vtable{};
public:
constexpr UClass(std::string_view name, uint32_t size, const UClass* parent = nullptr)
:name(name), size(size), parent(parent){}
2024-04-19 22:02:27 +08:00
AnyView New(void* ptr = nullptr) const{
2024-04-08 21:01:50 +08:00
if (ptr == nullptr) {
ptr = malloc(size);
InitObject(ptr);
}
return { ptr , this };
}
template<typename T>
T* New(T* ptr = nullptr) const{
if (!IsChildOf<T>()) {
return nullptr;
}
if (ptr == nullptr) {
ptr = (T*)malloc(size);
}
InitObject(ptr);
return ptr;
}
bool IsChildOf(const UClass* cls) const {
const UClass* _parent = parent;
while (_parent != nullptr) {
if (_parent == cls) {
return true;
}
_parent = _parent->parent;
}
return false;
}
template<typename T>
bool IsChildOf(bool bthis = false) const {
2024-04-25 21:45:41 +08:00
return IsChildOf(&TypeInfo<T>::StaticClass);
2024-04-08 21:01:50 +08:00
}
public:
2024-04-16 16:17:13 +08:00
const FieldPtr* GetField(const Name& name, int index)const {
2024-04-08 21:01:50 +08:00
if (vtable.GetField) {
2024-04-16 16:17:13 +08:00
return vtable.GetField(this, name, index);
2024-04-08 21:01:50 +08:00
}
return nullptr;
}
2024-04-09 16:31:09 +08:00
void InitObject(void* ptr)const {
if (vtable.InitObject) {
vtable.InitObject(ptr);
}
else {
memset(ptr, 0, size);
}
}
void CopyObject(void* dst, const void* src)const {
if (vtable.CopyObject) {
vtable.CopyObject(dst, src);
}
else {
memcpy(dst, src, size);
}
2024-04-08 21:01:50 +08:00
}
2024-04-09 16:31:09 +08:00
void DestObject(void* ptr)const {
if (vtable.DestObject) {
vtable.DestObject(ptr);
}
2024-04-08 21:01:50 +08:00
}
2024-04-09 16:31:09 +08:00
public:
template<_ReflCheck_Ctor T>
static void InitObject(void* ptr) {
T obj{};
std::construct_at((T*)ptr, obj);
}
template<typename T>
static void CopyObject(void* dst, const void* src) {
*(T*)dst = *(T*)src;
2024-04-08 21:01:50 +08:00
}
2024-04-25 21:45:41 +08:00
template<_ReflCheck_Ctor T, int N>
static void InitObject(void* ptr) {
T* tptr = (T*)ptr;
T obj{};
for (int i = 0; i < N; i++) {
std::construct_at(tptr++, obj);
}
}
template<typename T, int N>
static void CopyObject(void* dst, const void* src) {
T* tdst = (T*)dst;
const T* tsrc = (const T*)src;
for (int i = 0; i < N; i++) {
*tdst++ = *tsrc++;
}
}
2024-04-08 21:01:50 +08:00
};
}