2024-04-16 16:17:13 +08:00
|
|
|
#pragma once
|
2024-04-08 21:01:50 +08:00
|
|
|
#include "detail/uclass.inl"
|
2024-06-24 00:26:52 +08:00
|
|
|
#include "detail/container.inl"
|
2024-04-08 21:01:50 +08:00
|
|
|
#include "detail/view.inl"
|
2024-04-11 10:13:15 +08:00
|
|
|
#include "detail/field.inl"
|
2024-04-25 21:45:41 +08:00
|
|
|
#include "detail/convert.inl"
|
2024-04-19 22:02:27 +08:00
|
|
|
#include "detail/meta.inl"
|
2024-04-16 16:17:13 +08:00
|
|
|
#include "macro.h"
|
2024-04-09 16:31:09 +08:00
|
|
|
namespace refl {
|
2024-06-12 22:07:45 +08:00
|
|
|
template<typename T, typename... Args>
|
2024-06-14 22:24:52 +08:00
|
|
|
consteval FieldPtr StaticCtorField(const MethodData& data = {}) {
|
2024-06-12 22:07:45 +08:00
|
|
|
uint32_t flag = FIELD_CTOR_FLAG;
|
|
|
|
|
auto cls = &TypeInfo<void(*)(void*, real_type_t<Args>...)>::StaticClass;
|
|
|
|
|
Offset offset = AnyArgs::GetArgsSize(data.value, cls->GetParams());
|
|
|
|
|
if (data.meta.IsValid()) {
|
|
|
|
|
offset += data.meta.Size();
|
|
|
|
|
}
|
|
|
|
|
FieldPtr::Data method(offset);
|
|
|
|
|
return {FName("Ctor"),cls,method, flag};
|
|
|
|
|
}
|
2024-04-09 16:31:09 +08:00
|
|
|
template<typename T, typename Obj>
|
2024-04-25 21:45:41 +08:00
|
|
|
consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberData& data = {}) {
|
2024-04-19 22:02:27 +08:00
|
|
|
Offset offset = data.value.IsValid() ? sizeof(T) : 0;
|
|
|
|
|
if (data.meta.IsValid()) {
|
2024-04-25 21:45:41 +08:00
|
|
|
offset += data.meta.Size();
|
2024-04-19 22:02:27 +08:00
|
|
|
}
|
|
|
|
|
FieldPtr::Data member(offset);
|
2024-04-25 21:45:41 +08:00
|
|
|
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-25 21:45:41 +08:00
|
|
|
consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
2024-04-09 16:31:09 +08:00
|
|
|
uint32_t flag = FIELD_METHOD_FLAG;
|
2024-04-25 21:45:41 +08:00
|
|
|
auto cls = &TypeInfo<real_type_t<R>(*)(real_type_t<Args>...)>::StaticClass;
|
|
|
|
|
Offset offset = AnyArgs::GetArgsSize(data.value, cls->GetParams());
|
2024-04-19 22:02:27 +08:00
|
|
|
if (data.meta.IsValid()) {
|
2024-04-25 21:45:41 +08:00
|
|
|
offset += data.meta.Size();
|
2024-04-19 22:02:27 +08:00
|
|
|
}
|
|
|
|
|
FieldPtr::Data method(offset);
|
2024-04-25 21:45:41 +08:00
|
|
|
return { name,cls,method, flag };
|
2024-04-09 16:31:09 +08:00
|
|
|
}
|
|
|
|
|
template<typename T, typename R, typename ...Args>
|
2024-04-25 21:45:41 +08:00
|
|
|
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodData& data = {}) {
|
2024-04-09 16:31:09 +08:00
|
|
|
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
2024-04-25 21:45:41 +08:00
|
|
|
auto cls = &TypeInfo<real_type_t<R>(*)(const void*, real_type_t<Args>...)>::StaticClass;
|
|
|
|
|
Offset offset = AnyArgs::GetArgsSize(data.value, cls->GetParams());
|
2024-04-19 22:02:27 +08:00
|
|
|
if (data.meta.IsValid()) {
|
2024-04-25 21:45:41 +08:00
|
|
|
offset += data.meta.Size();
|
2024-04-19 22:02:27 +08:00
|
|
|
}
|
|
|
|
|
FieldPtr::Data method(offset);
|
2024-04-25 21:45:41 +08:00
|
|
|
return { name, cls,method,flag };
|
2024-06-16 22:52:45 +08:00
|
|
|
}
|
|
|
|
|
template<typename T, typename R, typename ...Args>
|
|
|
|
|
consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...)const, const Name& name, const MethodData& data = {}) {
|
|
|
|
|
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
|
|
|
|
|
auto cls = &TypeInfo<real_type_t<R>(*)(const void*, real_type_t<Args>...)>::StaticClass;
|
|
|
|
|
Offset offset = AnyArgs::GetArgsSize(data.value, cls->GetParams());
|
|
|
|
|
if (data.meta.IsValid()) {
|
|
|
|
|
offset += data.meta.Size();
|
|
|
|
|
}
|
|
|
|
|
FieldPtr::Data method(offset);
|
|
|
|
|
return { name, cls,method,flag };
|
2024-04-09 16:31:09 +08:00
|
|
|
}
|
|
|
|
|
}
|