#pragma once #include "meta.h" #include "uclass.h" namespace refl { template inline FieldPtr Meta::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberDataValue& data) { MemberData member; member.offset = reinterpret_cast(&(reinterpret_cast(0)->*ptr)); if (AnyValue arg = data.value; arg.IsValid()) { arg.type->InitObject(memory); arg.type->CopyObject(memory, arg.ptr); member.value = Any(memory, arg.cls).ConvertTo(&TypeInfo*>::StaticClass); memory += arg.type->size; } if (AnyValue arg = data.meta; arg.IsValid()) { arg.type->InitObject(memory); arg.type->CopyObject(memory, arg.ptr); member.meta = Any(memory, arg.cls); memory += arg.type->size; } constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name, &TypeInfo::StaticClass, member,flag}; } template inline FieldPtr Meta::MethodField(R(*ptr)(Args...), const Name& name, char*& memory, const MethodDataValue& data) { MethodData method; uint32_t flag = FIELD_METHOD_FLAG; auto cls = &TypeInfo(*)(real_type_t...)>::StaticClass; if (auto& args = data.value; !args.empty()) { flag |= FIELD_METHOD_VALUE_FLAG; AnyValueList argsValue(args, memory); argsValue.ConvertArgs(cls->vtable.GetParams(cls)); method.value = argsValue.ToSArray(); memory += AnyValueList::GetArgsSize(args); } if (AnyValue arg = data.meta; arg.IsValid()) { arg.type->InitObject(memory); arg.type->CopyObject(memory, arg.ptr); method.meta = Any(memory, arg.cls); memory += arg.type->size; } method.fptr = { *(Method*)&ptr }; return { name, cls, method,flag }; } template inline FieldPtr Meta::MethodField(R(T::*ptr)(Args...),const Name& name, char*& memory, const MethodDataValue& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; auto cls = &TypeInfo(*)(const void*, real_type_t...)>::StaticClass; if (auto& args = data.value; !args.empty()) { flag |= FIELD_METHOD_VALUE_FLAG; AnyValueList argsValue(args, memory); argsValue.ConvertArgs(cls->vtable.GetParams(cls)); method.value = argsValue.ToSArray(); memory += AnyValueList::GetArgsSize(args); } if (AnyValue arg = data.meta; arg.IsValid()) { arg.type->InitObject(memory); arg.type->CopyObject(memory, arg.ptr); method.meta = Any(memory, arg.cls); memory += arg.type->size; } method.fptr = { *(Method*)&ptr }; return { name, cls, method,flag }; } }