#pragma once #include "meta.h" #include "uclass.h" #include "convert.h" namespace refl { template void NewCtor(void* mem, Args... args) { new (mem) T(std::forward(args)...); } template inline FieldPtr MetaHelp::CtorField(T(*ptr)(Args...), char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_CTOR_FLAG; constexpr auto cls = &TypeInfo...)>::StaticClass; if (data.value.valid()) { flag |= FIELD_CTOR_VALUE_FLAG; AnyArgs args(data.value, cls->GetParams(), memory); method.value = args.ToSArray(); memory += args.Size(); } if (data.meta.IsValid()) { method.meta = data.meta.Change(memory); Convert::Construct(method.meta, data.meta); memory += data.meta.Size(); } method.fptr = { (Method)&NewCtor }; return { FName("Ctor"), cls, method,flag}; } template inline FieldPtr MetaHelp::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data) { MemberData member; auto cls = &TypeInfo::StaticClass; member.offset = reinterpret_cast(&(reinterpret_cast(0)->*ptr)); if (data.value.IsValid()) { member.value = Any(memory, cls); assert(Convert::Construct(member.value, data.value)); memory += member.value.Size(); } if (data.meta.IsValid()) { member.meta = data.meta.Change(memory); Convert::Construct(member.meta, data.meta); memory += data.meta.Size(); } constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name, cls, member,flag}; } template inline FieldPtr MetaHelp::MethodField(R(*ptr)(Args...), const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_METHOD_FLAG; constexpr auto cls = &TypeInfo(*)(real_type_t...)>::StaticClass; if (data.value.valid()) { flag |= FIELD_METHOD_VALUE_FLAG; AnyArgs args(data.value, cls->GetParams(), memory); method.value = args.ToSArray(); memory += args.Size(); } if (data.meta.IsValid()) { method.meta = data.meta.Change(memory); Convert::Construct(method.meta, data.meta); memory += data.meta.Size(); } method.fptr = { *(Method*)&ptr }; return { name, cls, method,flag }; } template inline FieldPtr MetaHelp::MethodField(R(T::*ptr)(Args...),const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; constexpr auto cls = &TypeInfo(*)(const void*, real_type_t...)>::StaticClass; if (data.value.valid()) { flag |= FIELD_METHOD_VALUE_FLAG; AnyArgs args(data.value, cls->GetParams(), memory); method.value = args.ToSArray(); memory += args.Size(); } if (data.meta.IsValid()) { method.meta = data.meta.Change(memory); Convert::Construct(method.meta, data.meta); memory += data.meta.Size(); } method.fptr = { *(Method*)&ptr }; return { name, cls, method,flag }; } template inline FieldPtr MetaHelp::MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data) { MethodData method; uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; constexpr auto cls = &TypeInfo(*)(const void*, real_type_t...)>::StaticClass; if (data.value.valid()) { flag |= FIELD_METHOD_VALUE_FLAG; AnyArgs args(data.value, cls->GetParams(), memory); method.value = args.ToSArray(); memory += args.Size(); } if (data.meta.IsValid()) { method.meta = data.meta.Change(memory); Convert::Construct(method.meta, data.meta); memory += data.meta.Size(); } method.fptr = { *(Method*)&ptr }; return { name, cls, method,flag }; } }