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

58 lines
2.2 KiB
C
Raw Normal View History

2024-04-08 21:01:50 +08:00
#include "detail/uclass.inl"
#include "detail/view.inl"
2024-04-11 10:13:15 +08:00
#include "detail/field.inl"
2024-04-09 16:31:09 +08:00
namespace refl {
/* 成员变量需要定义默认值吗那为什么不在initObjec里初始化?*/
template<typename T, typename Obj>
2024-04-13 17:47:44 +08:00
consteval FieldPtr MakeStaticField(T Obj::* ptr, Name name) {
2024-04-09 16:31:09 +08:00
FieldPtr::Default value;
2024-04-13 17:47:44 +08:00
FieldPtr::Data member = { nullptr };
2024-04-09 16:31:09 +08:00
constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG;
return { name, &TypeInfo<T>::StaticClass, member, value, flag };
}
template<typename R, typename ...Args>
2024-04-13 17:47:44 +08:00
consteval FieldPtr MakeStaticField(R(*ptr)(Args...), Name name/*, const std::vector<ArgsValue>& args = {}*/) {
2024-04-09 16:31:09 +08:00
uint32_t flag = FIELD_METHOD_FLAG;
FieldPtr::Default value;
2024-04-13 17:47:44 +08:00
/*if (args.size() > 0) {
2024-04-09 16:31:09 +08:00
flag |= FIELD_METHOD_VALUE_FLAG;
static const ArgsValueList argsValue(args);
value.method = []() ->std::pair<ArgsView*, int> {
return { argsValue.ptr , argsValue.num };
};
2024-04-13 17:47:44 +08:00
}*/
FieldPtr::Data method = { nullptr };
2024-04-09 22:26:33 +08:00
return { name, &TypeInfo<real_type_t<R>(*)(real_type_t<Args>...)>::StaticClass, method, value, flag };
2024-04-09 16:31:09 +08:00
}
template<typename T, typename R, typename ...Args>
2024-04-13 17:47:44 +08:00
consteval FieldPtr MakeStaticField(R(T::* ptr)(Args...), Name name/*, const std::vector<ArgsValue>& args = {}*/) {
2024-04-09 16:31:09 +08:00
uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
FieldPtr::Default value;
2024-04-13 17:47:44 +08:00
/*if (args.size() > 0) {
2024-04-09 16:31:09 +08:00
flag |= FIELD_METHOD_VALUE_FLAG;
static const ArgsValueList argsValue(args);
value.method = []() ->std::pair<ArgsView*, int> {
return { argsValue.ptr , argsValue.num };
};
2024-04-13 17:47:44 +08:00
}*/
//Method fptr = nullptr;
FieldPtr::Data method = { nullptr };
2024-04-09 22:26:33 +08:00
return { name, &TypeInfo<real_type_t<R>(*)(const void*,real_type_t<Args>...)>::StaticClass, method, value,flag };
2024-04-09 16:31:09 +08:00
}
2024-04-13 17:47:44 +08:00
template<typename ...Args>
consteval auto MakeTuple(Args&&... args) {
return std::make_tuple(args...);
}
template<typename ...Args>
auto MakeStaticFields(const std::tuple<Args...>& args) {
constexpr std::size_t N = sizeof...(Args);
std::array<FieldPtr, N> fields{};
for (std::size_t i = 0; i < N; ++i) {
auto& arg = std::get<0>(args);
auto a1 = std::get<0>(arg);
auto a2 = std::get<1>(arg);
//fields[i] = MakeStaticField(std::get<0>(arg), std::get<1>(arg));
}
return fields;
}
2024-04-09 16:31:09 +08:00
}