#pragma once #include "detail/uclass.inl" #include "detail/view.inl" #include "detail/field.inl" #include "detail/meta.inl" #include "std/sarray.h" #include "macro.h" namespace refl { template consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberDataValue& data = {}) { Offset offset = data.value.IsValid() ? sizeof(T) : 0; if (data.meta.IsValid()) { offset += data.meta.type->size; } FieldPtr::Data member(offset); constexpr uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG; return { name,&TypeInfo::StaticClass, member,flag}; } template consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodDataValue& data = {}) { uint32_t flag = FIELD_METHOD_FLAG; Offset offset = AnyValueList::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.type->size; } FieldPtr::Data method(offset); return { name,&TypeInfo(*)(real_type_t...)>::StaticClass,method, flag }; } template consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodDataValue& data = {}) { uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG; Offset offset = AnyValueList::GetArgsSize(data.value); if (data.meta.IsValid()) { offset += data.meta.type->size; } FieldPtr::Data method(offset); return { name, &TypeInfo(*)(const void*,real_type_t...)>::StaticClass,method,flag }; } //用处不大---------------begin template<_ReflCheck_Meta T> consteval int GetStaticFieldID(const Name& name) { auto fields = T::MyStatic::__MakeStaticFields(); auto first = fields.begin(); for (auto& field : fields) { if (field.name == name) { return &field - &*first; } } return 0; } template<_ReflCheck_Meta T> consteval int GetStaticFieldID(bool(* fptr)(FieldPtr)) { auto fields = T::MyStatic::__MakeStaticFields(); auto first = fields.begin(); for (auto& field : fields) { if (fptr(field)) { return &field - &*first; } } return 0; } template<_ReflCheck_Meta T, auto name> consteval auto GetStaticField() { constexpr auto fields = T::MyMeta::__StaticFields(); using AutoType = decltype(name); if constexpr (std::is_same_v) { return std::get(fields); } else { constexpr auto id = GetStaticFieldID(name.Data()); return std::get(fields); } } //用处不大---------------end }