zengine/engine/modules/engine/zlib/include/refl/detail/uclass.inl

58 lines
1.6 KiB
Plaintext
Raw Normal View History

2024-07-20 18:04:19 +08:00
#include "uclass.h"
#include "name.h"
2024-07-27 14:24:46 +08:00
#include "type.h"
2024-07-20 18:04:19 +08:00
namespace refl{
template <class T>
2024-07-27 14:24:46 +08:00
concept is_metas_v = requires(const Name & name) { Meta<T>::GetMeta(name); };
2024-07-20 18:04:19 +08:00
template<typename T>
class UClass_Auto : public UClass {
public:
2024-07-24 14:42:14 +08:00
UClass_Auto() : UClass(type_name<T>().View(), sizeof(T)) {
2024-07-20 18:04:19 +08:00
if constexpr (std::is_pointer_v<T>) {
using RT = std::remove_pointer_t<T>;
2024-07-24 14:42:14 +08:00
flag |= CLASS_POINTER_FLAG;
2024-07-20 18:04:19 +08:00
if constexpr (!std::is_same_v<RT, void>) {
2024-07-24 14:42:14 +08:00
parent = &TypeInfo<RT>::StaticClass;
2024-07-20 18:04:19 +08:00
}
}
else if constexpr (is_array_v<T>) {
using RT = is_array_t<T>;
2024-07-24 14:42:14 +08:00
flag = CLASS_ARRAY_FLAG;
2024-07-20 18:04:19 +08:00
if constexpr (std::is_pointer_v<RT>) {
2024-07-24 14:42:14 +08:00
flag |= CLASS_POINTER_FLAG;
2024-07-20 18:04:19 +08:00
}
2024-07-24 14:42:14 +08:00
parent = &TypeInfo<RT>::StaticClass;
2024-07-20 18:04:19 +08:00
}
else {
2024-07-24 14:42:14 +08:00
vtable = new(MemPool)vtable_uclass();
vtable->Construct = &UClass::Construct<T>;
vtable->Destruct = &UClass::Destruct<T>;
2024-07-20 18:04:19 +08:00
}
}
};
2024-07-27 14:24:46 +08:00
template<typename T, typename MetaImpl>
class UClass_Meta : public UClass {
using FieldsType = decltype(MetaImpl::MakeFields());
FieldsType Fields{ MetaImpl::MakeFields() };
UClass_Meta() : UClass(type_name<T>().View(), sizeof(T)) {
if constexpr (has_parent_v<T>) {
parent = &TypeInfo<parent_t<T>>::StaticClass;
}
}
2024-07-24 14:42:14 +08:00
};
2024-07-20 18:04:19 +08:00
template<typename T>
struct TypeInfoImpl {
using MyUClass = UClass_Auto<T>;
2024-07-24 14:42:14 +08:00
inline static MyUClass StaticClass{};
2024-07-20 18:04:19 +08:00
};
2024-07-27 14:24:46 +08:00
template<>
struct TypeInfoImpl<void> {
inline static UClass StaticClass{ type_name<void>().View(), 0 };
};
template<is_meta_v T>
struct TypeInfoImpl<T> {
using MyUClass = UClass_Meta<T, meta_t<T>>;
inline static MyUClass StaticClass{};
};
2024-07-20 18:04:19 +08:00
}