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
|
|
|
|
}
|