zengine-old/engine/3rdparty/zlib/include/refl/detail/meta.inl

109 lines
3.8 KiB
Plaintext
Raw Normal View History

2024-04-19 22:02:27 +08:00
#pragma once
#include "meta.h"
#include "uclass.h"
2024-04-25 21:45:41 +08:00
#include "convert.h"
2024-04-19 22:02:27 +08:00
namespace refl {
2024-06-12 22:07:45 +08:00
template<typename T, typename ...Args>
2024-06-14 22:24:52 +08:00
void NewCtor(void* mem, Args... args) {
new (mem) T(std::forward<Args>(args)...);
}
template<typename T, typename ...Args>
2024-06-25 20:26:46 +08:00
inline FieldPtr MetaHelp::CtorField(T(*ptr)(Args...), char*& memory, const MethodData& data)
2024-06-12 22:07:45 +08:00
{
MethodData method;
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_CTOR_FLAG;
constexpr auto cls = &TypeInfo<void(*)(const void*, real_type_t<Args>...)>::StaticClass;
2024-06-14 22:24:52 +08:00
if (data.value.valid()) {
2024-06-12 22:07:45 +08:00
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();
}
2024-06-14 22:24:52 +08:00
method.fptr = { (Method)&NewCtor<T, Args...> };
2024-06-12 22:07:45 +08:00
return { FName("Ctor"), cls, method,flag};
}
2024-04-19 22:02:27 +08:00
template<typename T, typename Obj>
2024-06-21 22:21:32 +08:00
inline FieldPtr MetaHelp::MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data)
2024-04-19 22:02:27 +08:00
{
MemberData member;
2024-06-14 22:24:52 +08:00
auto cls = &TypeInfo<T>::StaticClass;
2024-04-19 22:02:27 +08:00
member.offset = reinterpret_cast<std::size_t>(&(reinterpret_cast<const Obj*>(0)->*ptr));
2024-04-25 21:45:41 +08:00
if (data.value.IsValid()) {
member.value = Any(memory, cls);
assert(Convert::Construct(member.value, data.value));
memory += member.value.Size();
2024-04-19 22:02:27 +08:00
}
2024-04-25 21:45:41 +08:00
if (data.meta.IsValid()) {
member.meta = data.meta.Change(memory);
Convert::Construct(member.meta, data.meta);
memory += data.meta.Size();
2024-04-19 22:02:27 +08:00
}
constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG;
2024-04-25 21:45:41 +08:00
return { name, cls, member,flag};
2024-04-19 22:02:27 +08:00
}
template<typename R, typename ...Args>
2024-06-21 22:21:32 +08:00
inline FieldPtr MetaHelp::MethodField(R(*ptr)(Args...), const Name& name, char*& memory, const MethodData& data)
2024-04-19 22:02:27 +08:00
{
MethodData method;
uint32_t flag = FIELD_METHOD_FLAG;
2024-04-25 21:45:41 +08:00
constexpr auto cls = &TypeInfo<real_type_t<R>(*)(real_type_t<Args>...)>::StaticClass;
2024-06-12 22:07:45 +08:00
if (data.value.valid()) {
2024-04-19 22:02:27 +08:00
flag |= FIELD_METHOD_VALUE_FLAG;
2024-04-25 21:45:41 +08:00
AnyArgs args(data.value, cls->GetParams(), memory);
method.value = args.ToSArray();
memory += args.Size();
2024-04-19 22:02:27 +08:00
}
2024-04-25 21:45:41 +08:00
if (data.meta.IsValid()) {
method.meta = data.meta.Change(memory);
Convert::Construct(method.meta, data.meta);
memory += data.meta.Size();
2024-04-19 22:02:27 +08:00
}
method.fptr = { *(Method*)&ptr };
return { name, cls, method,flag };
}
template<typename T, typename R, typename ...Args>
2024-06-21 22:21:32 +08:00
inline FieldPtr MetaHelp::MethodField(R(T::*ptr)(Args...),const Name& name, char*& memory, const MethodData& data)
2024-04-19 22:02:27 +08:00
{
MethodData method;
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
2024-04-25 21:45:41 +08:00
constexpr auto cls = &TypeInfo<real_type_t<R>(*)(const void*, real_type_t<Args>...)>::StaticClass;
2024-06-12 22:07:45 +08:00
if (data.value.valid()) {
2024-04-19 22:02:27 +08:00
flag |= FIELD_METHOD_VALUE_FLAG;
2024-04-25 21:45:41 +08:00
AnyArgs args(data.value, cls->GetParams(), memory);
method.value = args.ToSArray();
memory += args.Size();
2024-04-19 22:02:27 +08:00
}
2024-04-25 21:45:41 +08:00
if (data.meta.IsValid()) {
method.meta = data.meta.Change(memory);
Convert::Construct(method.meta, data.meta);
memory += data.meta.Size();
2024-04-19 22:02:27 +08:00
}
method.fptr = { *(Method*)&ptr };
return { name, cls, method,flag };
}
2024-06-16 22:52:45 +08:00
template<typename T, typename R, typename ...Args>
2024-06-21 22:21:32 +08:00
inline FieldPtr MetaHelp::MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data)
2024-06-16 22:52:45 +08:00
{
MethodData method;
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
constexpr auto cls = &TypeInfo<real_type_t<R>(*)(const void*, real_type_t<Args>...)>::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 };
}
2024-04-19 22:02:27 +08:00
}