zengine-old/engine/3rdparty/zlib/include/refl/detail/meta.inl
2024-04-19 22:02:27 +08:00

70 lines
2.6 KiB
C++

#pragma once
#include "meta.h"
#include "uclass.h"
namespace refl {
template<typename T, typename Obj>
inline FieldPtr Meta::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberDataValue& data)
{
MemberData member;
member.offset = reinterpret_cast<std::size_t>(&(reinterpret_cast<const Obj*>(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<real_type_t<T>*>::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<T>::StaticClass, member,flag};
}
template<typename R, typename ...Args>
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<R>(*)(real_type_t<Args>...)>::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<typename T, typename R, typename ...Args>
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<real_type_t<R>(*)(const void*, real_type_t<Args>...)>::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 };
}
}