#pragma once #include "detail/uclass.inl" #include "detail/container.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(T(*ptr)(Args...), const MethodData& data = {}) { uint32_t flag = FIELD_CTOR_FLAG; Offset offset = AnyArgs::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.Size(); } FieldPtr::Data method(offset); return {FName("Ctor"), nullptr, 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, nullptr , member , flag}; } template consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) { uint32_t flag = FIELD_METHOD_FLAG; Offset offset = AnyArgs::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.Size(); } FieldPtr::Data method(offset); return { name,nullptr,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; Offset offset = AnyArgs::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.Size(); } FieldPtr::Data method(offset); return { name, nullptr,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; Offset offset = AnyArgs::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.Size(); } FieldPtr::Data method(offset); return { name, nullptr, method,flag }; } }