#pragma once #include "field.h" namespace refl { template consteval auto fetch_method_t(R(T::*)(Args...)) { using MethodType = R(*)(const void*, Args...); return MethodType{ nullptr }; } template consteval auto fetch_method_t(R(*)(Args...)) { using MethodType = R(*)(Args...); return MethodType{ nullptr }; } template consteval int fetch_tuple_elm_size(int first = 0) { using T = std::tuple_element::type; if constexpr (std::is_same_v) { return 0; } else { return Index >= first ? sizeof(T) : 0; } } template consteval int fetch_tuple_size(std::index_sequence, int first = 0) { int size = 0; (..., (size += fetch_tuple_elm_size(first))); return size; } template consteval int fetch_meta_size() { auto fields = T::__MakeStaticFields(); int size = 0; for (auto& field : fields) { size += field.data.member.offset; } if (size == 0) { size = 1; } return size; } enum MetaFlag :uint32_t { META_NONE_FLAG = 0, META_SERIZLE_FLAG = 1 << 0, META_UI_FLAG = 1 << 0, }; class UClass; class MetaHelp { public: template static FieldPtr CtorField(T(*ptr)(Args...), char*& memory, const MethodData& data = {}); template static FieldPtr MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data = {}); template static FieldPtr MethodField(R(*ptr)(Args...), const Name& name,char*& memory, const MethodData& data = {}); template static FieldPtr MethodField(R(T::*ptr)(Args...), const Name& name,char*& memory, const MethodData& data = {}); template static FieldPtr MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data = {}); }; }