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

75 lines
2.5 KiB
C
Raw Normal View History

2024-04-16 16:17:13 +08:00
#pragma once
2024-04-08 21:01:50 +08:00
#include "detail/uclass.inl"
#include "detail/view.inl"
2024-04-11 10:13:15 +08:00
#include "detail/field.inl"
2024-04-19 22:02:27 +08:00
#include "detail/meta.inl"
2024-04-14 22:45:08 +08:00
#include "std/sarray.h"
2024-04-16 16:17:13 +08:00
#include "macro.h"
2024-04-09 16:31:09 +08:00
namespace refl {
template<typename T, typename Obj>
2024-04-19 22:02:27 +08:00
consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberDataValue& data = {}) {
Offset offset = data.value.IsValid() ? sizeof(T) : 0;
if (data.meta.IsValid()) {
offset += data.meta.type->size;
}
FieldPtr::Data member(offset);
2024-04-09 16:31:09 +08:00
constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG;
2024-04-19 22:02:27 +08:00
return { name,&TypeInfo<T>::StaticClass, member,flag};
2024-04-09 16:31:09 +08:00
}
template<typename R, typename ...Args>
2024-04-19 22:02:27 +08:00
consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodDataValue& data = {}) {
2024-04-09 16:31:09 +08:00
uint32_t flag = FIELD_METHOD_FLAG;
2024-04-19 22:02:27 +08:00
Offset offset = AnyValueList::GetArgsSize(data.value);
if (data.meta.IsValid()) {
offset += data.meta.type->size;
}
FieldPtr::Data method(offset);
return { name,&TypeInfo<real_type_t<R>(*)(real_type_t<Args>...)>::StaticClass,method, flag };
2024-04-09 16:31:09 +08:00
}
template<typename T, typename R, typename ...Args>
2024-04-19 22:02:27 +08:00
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodDataValue& data = {}) {
2024-04-09 16:31:09 +08:00
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
2024-04-19 22:02:27 +08:00
Offset offset = AnyValueList::GetArgsSize(data.value);
if (data.meta.IsValid()) {
offset += data.meta.type->size;
}
FieldPtr::Data method(offset);
return { name, &TypeInfo<real_type_t<R>(*)(const void*,real_type_t<Args>...)>::StaticClass,method,flag };
2024-04-09 16:31:09 +08:00
}
2024-04-15 19:53:39 +08:00
//用处不大---------------begin
2024-04-19 22:02:27 +08:00
template<_ReflCheck_Meta T>
consteval int GetStaticFieldID(const Name& name) {
auto fields = T::MyStatic::__MakeStaticFields();
2024-04-14 22:45:08 +08:00
auto first = fields.begin();
for (auto& field : fields) {
if (field.name == name) {
return &field - &*first;
}
}
return 0;
2024-04-13 17:47:44 +08:00
}
2024-04-19 22:02:27 +08:00
template<_ReflCheck_Meta T>
2024-04-15 19:53:39 +08:00
consteval int GetStaticFieldID(bool(* fptr)(FieldPtr)) {
2024-04-19 22:02:27 +08:00
auto fields = T::MyStatic::__MakeStaticFields();
2024-04-14 22:45:08 +08:00
auto first = fields.begin();
for (auto& field : fields) {
if (fptr(field)) {
return &field - &*first;
}
2024-04-13 17:47:44 +08:00
}
2024-04-14 22:45:08 +08:00
return 0;
2024-04-13 17:47:44 +08:00
}
2024-04-19 22:02:27 +08:00
template<_ReflCheck_Meta T, auto name>
2024-04-15 19:53:39 +08:00
consteval auto GetStaticField() {
2024-04-19 22:02:27 +08:00
constexpr auto fields = T::MyMeta::__StaticFields();
2024-04-15 19:53:39 +08:00
using AutoType = decltype(name);
if constexpr (std::is_same_v<AutoType, int>) {
return std::get<name>(fields);
}
else {
2024-04-19 22:02:27 +08:00
constexpr auto id = GetStaticFieldID<T>(name.Data());
2024-04-15 19:53:39 +08:00
return std::get<id>(fields);
}
}
//用处不大---------------end
2024-04-09 16:31:09 +08:00
}