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

183 lines
5.5 KiB
Plaintext
Raw Normal View History

2024-04-08 21:01:50 +08:00
#pragma once
2024-04-11 10:13:15 +08:00
#include <array>
2024-04-08 21:01:50 +08:00
#include "uclass.h"
namespace refl {
template<_ReflCheck_Ctor T>
class UClass_Auto : public UClass {
public:
using UClass::UClass;
2024-04-09 16:31:09 +08:00
using MyUClass = UClass_Auto<T>;
2024-04-08 21:01:50 +08:00
public:
2024-04-13 17:47:44 +08:00
consteval static MyUClass BuildClass() {
2024-04-09 16:31:09 +08:00
MyUClass cls(type_name<T>().View(), sizeof(T));
2024-04-08 21:01:50 +08:00
if constexpr (!std::is_trivially_copyable_v<T>) {
2024-04-09 16:31:09 +08:00
cls.vtable.InitObject = &MyUClass::InitObject<T>;
cls.vtable.CopyObject = &MyUClass::CopyObject<T>;
2024-04-08 21:01:50 +08:00
}
2024-04-25 21:45:41 +08:00
else if constexpr (std::is_pointer_v<T>){
using RawT = std::remove_pointer_t<T>;
cls.flag = CLASS_POINTER_FLAG;
if constexpr (!std::is_same_v<RawT, void>) {
cls.parent = &TypeInfo<RawT>::StaticClass;
}
}
2024-04-15 19:53:39 +08:00
else {
cls.flag = CLASS_TRIVIAL_FLAG;
}
2024-04-08 21:01:50 +08:00
return cls;
}
2024-04-13 17:47:44 +08:00
void Set(void* ptr,const T& t) {
*(T*)ptr = t;
}
T& Get(void* ptr) {
return *(T*)ptr;
}
2024-04-08 21:01:50 +08:00
};
2024-04-25 21:45:41 +08:00
template<_ReflCheck_Ctor T, int N>
class UClass_Array : public UClass {
public:
using UClass::UClass;
using MyUClass = UClass_Array<T, N>;
public:
consteval static MyUClass BuildClass() {
MyUClass cls(type_name<T[N]>().View(), sizeof(T) * N, &TypeInfo<T>::StaticClass);
if constexpr (!std::is_trivially_copyable_v<T>) {
cls.vtable.InitObject = &MyUClass::InitObject<T, N>;
cls.vtable.CopyObject = &MyUClass::CopyObject<T, N>;
}
else if constexpr (std::is_pointer_v<T>) {
cls.flag = CLASS_POINTER_FLAG | CLASS_ARRAY_FLAG;
}
else {
cls.flag = CLASS_TRIVIAL_FLAG | CLASS_ARRAY_FLAG;
}
return cls;
}
};
2024-04-08 21:01:50 +08:00
/*
* 模板优化
* 成员参数转化为const void*
* 引用参数转化为指针
2024-04-09 22:26:33 +08:00
* 返回引用转化为指针
2024-04-08 21:01:50 +08:00
*/
template<typename R, typename... Args>
class UMethod_Auto : public UClass {
using UClass::UClass;
using MethodType = R(*)(Args...);
2024-04-09 16:31:09 +08:00
using MyUClass = UMethod_Auto<R, Args...>;
2024-04-08 21:01:50 +08:00
public:
std::array<const UClass*, sizeof...(Args) + 1> UList{};
2024-04-25 21:45:41 +08:00
consteval sarray<const UClass*> GetParams()const {
return sarray<const UClass*>(&UList.front(), UList.size());
}
2024-04-16 16:17:13 +08:00
static sarray<const UClass*> GetParams(const UClass* cls) {
2024-04-09 16:31:09 +08:00
auto& UList = static_cast<const MyUClass*>(cls)->UList;
2024-04-16 16:17:13 +08:00
return sarray<const UClass*>(&UList.front(),UList.size());
2024-04-08 21:01:50 +08:00
}
2024-04-15 19:53:39 +08:00
//这里顺序似乎是不确定的,但是我实际运用是对的
//如果使用make_index_sequence,会多一次函数调用
//为什么包裹一层迭代器,就不会出现警告了
2024-04-19 22:02:27 +08:00
static void Call(const FieldPtr* field, const sarray<Any>& ArgsList) {
2024-04-15 19:53:39 +08:00
assert(sizeof...(Args) <= ArgsList.size());
2024-04-08 21:01:50 +08:00
if constexpr (std::is_same_v<R, void>) {
2024-04-19 22:02:27 +08:00
MethodType fptr = (MethodType)field->data.method.fptr;
2024-04-15 19:53:39 +08:00
auto param = ArgsList.end();
2024-04-25 21:45:41 +08:00
fptr((param--->CastTo<Args>())...);
2024-04-08 21:01:50 +08:00
}
else {
2024-04-19 22:02:27 +08:00
MethodType fptr = (MethodType)field->data.method.fptr;
2024-04-15 19:53:39 +08:00
auto param = ArgsList.end();
2024-04-16 16:17:13 +08:00
auto ret = ArgsList.front();
2024-04-09 22:26:33 +08:00
if (ret->cls == &TypeInfo<R*>::StaticClass) {
2024-04-25 21:45:41 +08:00
*(R*)ret->ptr = fptr((param--->CastTo<Args>())...);
2024-04-08 21:01:50 +08:00
}
else {
2024-04-25 21:45:41 +08:00
fptr((param--->CastTo<Args>())...);
2024-04-08 21:01:50 +08:00
}
}
}
protected:
2024-04-13 17:47:44 +08:00
consteval void BuildUList() {
2024-04-08 21:01:50 +08:00
if constexpr (!std::is_same_v<R, void>) {
2024-04-09 22:26:33 +08:00
UList[0] = &TypeInfo<R*>::StaticClass;
2024-04-08 21:01:50 +08:00
}
if constexpr (sizeof...(Args) > 0) {
auto ptr = &UList[1];
2024-04-25 21:45:41 +08:00
(..., (*ptr = &TypeInfo<args_type_t<Args>*>::StaticClass, ptr++));
2024-04-08 21:01:50 +08:00
}
}
public:
//为了简化判断cls 对象 统统指向 T*
2024-04-13 17:47:44 +08:00
consteval static MyUClass BuildClass() {
2024-04-09 16:31:09 +08:00
MyUClass cls(type_name<MethodType>().View(), sizeof(MethodType));
cls.vtable.GetParams = &MyUClass::GetParams;
cls.vtable.Call = &MyUClass::Call;
2024-04-15 19:53:39 +08:00
cls.flag = CLASS_TRIVIAL_FLAG;
2024-04-08 21:01:50 +08:00
cls.BuildUList();
return cls;
}
};
2024-04-13 17:47:44 +08:00
template<typename T, typename P = void>
class UClass_Meta : public UClass {
public:
2024-04-19 22:02:27 +08:00
using FieldsType = decltype(T::MyMeta::__MakeFields());
FieldsType Fields{ T::MyMeta::__MakeFields() };
2024-04-14 22:45:08 +08:00
UClass_Meta() : UClass(type_name<T>().View(), sizeof(T)){
2024-04-15 19:53:39 +08:00
if constexpr (std::is_trivially_copyable_v<T>) {
flag = CLASS_TRIVIAL_FLAG;
}
2024-04-13 17:47:44 +08:00
if constexpr (!std::is_same_v<P, void>) {
parent = &TypeInfo<P>::StaticClass;
}
2024-04-28 00:23:35 +08:00
if constexpr (requires(void* ptr) {T::__InitObject(ptr);}) {
2024-04-14 22:45:08 +08:00
vtable.InitObject = &T::__InitObject;
}
else {
vtable.InitObject = &UClass::InitObject<T>;
}
2024-04-28 00:23:35 +08:00
if constexpr (requires(const Name & name) { T::__GetMeta(name); }) {
vtable.GetMeta = &T::__GetMeta;
}
2024-04-16 16:17:13 +08:00
vtable.GetField = &UClass_Meta::GetField;
2024-04-13 17:47:44 +08:00
}
2024-04-14 22:45:08 +08:00
const FieldPtr* GetField(int index) const {
return &Fields[index];
}
2024-04-16 16:17:13 +08:00
static const FieldPtr* GetField(const UClass* _cls,const Name& name, int index = 0){
auto cls = static_cast<const UClass_Meta*>(_cls);
auto& Fields = cls->Fields;
2024-04-14 22:45:08 +08:00
constexpr int length = std::tuple_size<FieldsType>::value;
auto ptr = index < length ? &Fields[index] : nullptr;
for (int i = index; i < length; i++, ptr++) {
if (name == ptr->name) {
return ptr;
}
}
return nullptr;
}
2024-04-08 21:01:50 +08:00
};
2024-04-13 17:47:44 +08:00
2024-04-08 21:01:50 +08:00
//基础类型的偏特化
template<_ReflCheck_Ctor_NoUClass T>
struct TypeInfoImpl<T> {
using UClass = UClass_Auto<T>;
inline constexpr static UClass StaticClass = UClass::BuildClass();
};
// 函数指针类型的偏特化
template<typename R, typename... Args>
struct TypeInfoImpl<R(*)(Args...)> {
using UClass = UMethod_Auto<R, Args...>;
inline constexpr static UClass StaticClass = UClass::BuildClass();
};
2024-04-09 16:31:09 +08:00
template<_ReflCheck_UClass T>
struct TypeInfoImpl<T> {
2024-04-19 22:02:27 +08:00
using MyUClass = typename T::MyMeta::MyUClass;
2024-04-14 22:45:08 +08:00
inline static MyUClass StaticClass = MyUClass();
2024-04-09 16:31:09 +08:00
};
2024-04-25 21:45:41 +08:00
template<typename T, int N>
struct TypeInfoImpl<T[N]> {
using UClass = UClass_Array<T,N>;
inline constexpr static UClass StaticClass = UClass::BuildClass();
};
2024-04-08 21:01:50 +08:00
}