zengine-old/engine/3rdparty/zlib/include/refl/detail/field.h

64 lines
1.8 KiB
C
Raw Normal View History

2024-04-03 17:58:02 +08:00
#pragma once
#include "UTemplate/Type.hpp"
2024-04-14 22:45:08 +08:00
#include "../std/sarray.h"
2024-04-19 22:02:27 +08:00
#include "any.h"
2024-04-03 17:58:02 +08:00
#include <variant>
#include <functional>
using Ubpa::Name;
using Ubpa::type_name;
2024-04-22 22:53:41 +08:00
consteval Name FName(const char* buf) {
return Name(buf);
}
2024-04-03 17:58:02 +08:00
namespace refl {
2024-04-06 23:50:17 +08:00
using Offset = uint32_t;
2024-04-13 17:47:44 +08:00
using Method = void*;
2024-04-19 22:02:27 +08:00
struct MemberData {
Offset offset;
Any value;
Any meta;
constexpr MemberData() :offset(0), value(), meta() {}
constexpr MemberData(Offset offset,const Any& value,const Any& meta) : offset(offset), value(value), meta(meta) {}
};
struct MethodData {
Method fptr;
sarray<Any> value;
Any meta;
constexpr MethodData() :fptr(nullptr), value(), meta() {}
constexpr MethodData(Method fptr,const sarray<Any>& value, const Any& meta) : fptr(fptr), value(value), meta(meta) {}
};
2024-04-05 16:03:58 +08:00
enum FieldFlag:uint32_t {
2024-04-09 16:31:09 +08:00
FIELD_NONE_FLAG = 0,
FIELD_MEMBER_FLAG = 1 << 0,
FIELD_ATTRIBUTE_FLAG = 1 << 1,
FIELD_METHOD_FLAG = 1 << 2,
FIELD_METHOD_VALUE_FLAG = 1 << 3
2024-04-05 16:03:58 +08:00
};
2024-04-16 16:17:13 +08:00
using enum FieldFlag;
2024-04-03 17:58:02 +08:00
struct FieldPtr {
2024-04-09 16:31:09 +08:00
union Data
{
2024-04-19 22:02:27 +08:00
MemberData member;
MethodData method;
constexpr Data() : member() {};
constexpr Data(const MemberData& member) :member(member) {}
constexpr Data(const MethodData& method) : method(method) {}
constexpr Data(Offset offset) :member(offset, {}, {}) {}
constexpr Data(Offset offset, const Any& value, const Any& meta):member(offset, value, meta){}
constexpr Data(Method fptr, const sarray<Any>& value, const Any& meta) : method(fptr, value, meta) {}
2024-04-09 16:31:09 +08:00
};
2024-04-03 17:58:02 +08:00
Name name;
2024-04-13 17:47:44 +08:00
const UClass* type{};
Data data{};
uint32_t flag{};
2024-04-11 10:13:15 +08:00
2024-04-15 19:53:39 +08:00
//unsafe
2024-04-19 22:02:27 +08:00
bool Invoke(const sarray<Any>& ArgsList)const;
2024-04-11 10:13:15 +08:00
//safe
2024-04-19 22:02:27 +08:00
bool Invoke(svector<Any>& ArgsList)const;
2024-04-11 10:13:15 +08:00
2024-04-15 19:53:39 +08:00
template<typename Func, typename... Args>
auto Call(Func func, Args&&... args)const;
2024-04-14 22:45:08 +08:00
2024-04-16 16:17:13 +08:00
sarray<const UClass*> GetParams() const;
2024-04-03 17:58:02 +08:00
};
}