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

65 lines
2.0 KiB
C
Raw Permalink Normal View History

2024-04-19 22:02:27 +08:00
#pragma once
#include "field.h"
namespace refl {
template<typename T, typename R, typename ...Args>
consteval auto fetch_method_t(R(T::*)(Args...)) {
using MethodType = R(*)(const void*, Args...);
return MethodType{ nullptr };
}
template<typename R, typename ...Args>
consteval auto fetch_method_t(R(*)(Args...)) {
using MethodType = R(*)(Args...);
return MethodType{ nullptr };
}
2024-06-25 20:26:46 +08:00
template<typename Tuple, int Index>
consteval int fetch_tuple_elm_size(int first = 0) {
using T = std::tuple_element<Index, Tuple>::type;
if constexpr (std::is_same_v<T, void>) {
return 0;
}
else {
return Index >= first ? sizeof(T) : 0;
}
}
template<typename Tuple, std::size_t... Is>
consteval int fetch_tuple_size(std::index_sequence<Is...>, int first = 0) {
int size = 0;
(..., (size += fetch_tuple_elm_size<Tuple, Is>(first)));
return size;
}
2024-04-19 22:02:27 +08:00
template<typename T>
consteval int fetch_meta_size() {
auto fields = T::__MakeStaticFields();
int size = 0;
for (auto& field : fields) {
size += field.data.member.offset;
}
2024-04-26 15:26:38 +08:00
if (size == 0) {
size = 1;
}
2024-04-19 22:02:27 +08:00
return size;
}
enum MetaFlag :uint32_t {
META_NONE_FLAG = 0,
META_SERIZLE_FLAG = 1 << 0,
META_UI_FLAG = 1 << 0,
};
class UClass;
2024-06-21 22:21:32 +08:00
class MetaHelp {
2024-04-19 22:02:27 +08:00
public:
2024-06-12 22:07:45 +08:00
template<typename T, typename... Args>
2024-06-25 20:26:46 +08:00
static FieldPtr CtorField(T(*ptr)(Args...), char*& memory, const MethodData& data = {});
2024-06-12 22:07:45 +08:00
2024-04-19 22:02:27 +08:00
template<typename T, typename Obj>
2024-04-25 21:45:41 +08:00
static FieldPtr MemberField(T Obj::* ptr, const Name& name, char*& memory, const MemberData& data = {});
2024-04-19 22:02:27 +08:00
template<typename R, typename ...Args>
2024-04-25 21:45:41 +08:00
static FieldPtr MethodField(R(*ptr)(Args...), const Name& name,char*& memory, const MethodData& data = {});
2024-04-19 22:02:27 +08:00
template<typename T,typename R, typename ...Args>
2024-04-25 21:45:41 +08:00
static FieldPtr MethodField(R(T::*ptr)(Args...), const Name& name,char*& memory, const MethodData& data = {});
2024-06-16 22:52:45 +08:00
template<typename T, typename R, typename ...Args>
static FieldPtr MethodField(R(T::* ptr)(Args...)const, const Name& name, char*& memory, const MethodData& data = {});
2024-04-19 22:02:27 +08:00
};
}