#pragma once #include "detail/uclass.inl" #include "detail/view.inl" #include "detail/field.inl" #include "detail/convert.inl" #include "detail/meta.inl" #include "macro.h" namespace refl { template consteval FieldPtr StaticCtorField(const MethodData& data = {}) { uint32_t flag = FIELD_CTOR_FLAG; auto cls = &TypeInfo...)>::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}; } template consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberData& data = {}) { Offset offset = data.value.IsValid() ? sizeof(T) : 0; if (data.meta.IsValid()) { offset += data.meta.Size(); } FieldPtr::Data member(offset); uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name,&TypeInfo::StaticClass, member,flag}; } template consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) { uint32_t flag = FIELD_METHOD_FLAG; auto cls = &TypeInfo(*)(real_type_t...)>::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 }; } template consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodData& data = {}) { uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; auto cls = &TypeInfo(*)(const void*, real_type_t...)>::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 }; } template 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(*)(const void*, real_type_t...)>::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 }; } }