93 lines
2.6 KiB
C++
93 lines
2.6 KiB
C++
#pragma once
|
|
#include "UTemplate/Type.hpp"
|
|
#include "zstd/sarray.h"
|
|
#include "any.h"
|
|
#include <variant>
|
|
#include <functional>
|
|
using Ubpa::Name;
|
|
using Ubpa::type_name;
|
|
consteval Name FName(const char* buf) {
|
|
return Name(buf);
|
|
}
|
|
namespace refl {
|
|
using zstd::sarray;
|
|
using zstd::svector;
|
|
|
|
using Offset = uint32_t;
|
|
using Method = void*;
|
|
struct MemberData {
|
|
Offset offset{0};
|
|
Any value;
|
|
Any meta;
|
|
constexpr MemberData() :value(), meta() {}
|
|
constexpr MemberData(const Any& value, const Any& meta = {}) : value(value), meta(meta) {}
|
|
constexpr MemberData(Offset offset,const Any& value,const Any& meta) : offset(offset), value(value), meta(meta) {}
|
|
};
|
|
struct MethodData {
|
|
Method fptr{nullptr};
|
|
sarray<Any> value;
|
|
Any meta;
|
|
constexpr MethodData() :value(), meta() {}
|
|
constexpr MethodData(const sarray<Any>& value, const Any& meta = {}) : value(value), meta(meta) {}
|
|
constexpr MethodData(Method fptr,const sarray<Any>& value, const Any& meta) : fptr(fptr), value(value), meta(meta) {}
|
|
};
|
|
enum FieldFlag:uint32_t {
|
|
FIELD_NONE_FLAG = 0,
|
|
FIELD_MEMBER_FLAG = 1 << 0,
|
|
FIELD_ATTRIBUTE_FLAG = 1 << 1,
|
|
FIELD_METHOD_FLAG = 1 << 2,
|
|
FIELD_METHOD_VALUE_FLAG = 1 << 3,
|
|
FIELD_CTOR_FLAG = 1 << 4,
|
|
FIELD_CTOR_VALUE_FLAG = 1 << 5,
|
|
};
|
|
using enum FieldFlag;
|
|
struct FieldPtr {
|
|
union Data
|
|
{
|
|
MemberData member;
|
|
MethodData method;
|
|
constexpr Data() : member() {};
|
|
constexpr Data(const MemberData& member) :member(member) {}
|
|
constexpr Data(const MethodData& method) : method(method) {}
|
|
constexpr Data(Offset offset) :member(offset, {}, {}) {}
|
|
constexpr Data(Offset offset, const Any& value, const Any& meta):member(offset, value, meta){}
|
|
constexpr Data(Method fptr, const sarray<Any>& value, const Any& meta) : method(fptr, value, meta) {}
|
|
};
|
|
Name name;
|
|
const UClass* type{};
|
|
Data data{};
|
|
uint32_t flag{};
|
|
|
|
Offset GetOffset() const{
|
|
if (flag & FIELD_ATTRIBUTE_FLAG) {
|
|
return data.member.offset;
|
|
}
|
|
return 0;
|
|
}
|
|
Any GetValue()const {
|
|
if (flag & FIELD_ATTRIBUTE_FLAG)
|
|
return data.member.value;
|
|
return {};
|
|
}
|
|
Any GetMeta()const {
|
|
if (flag & FIELD_ATTRIBUTE_FLAG)
|
|
return data.member.meta;
|
|
if(flag & FIELD_METHOD_FLAG)
|
|
return data.method.meta;
|
|
return {};
|
|
}
|
|
//unsafe
|
|
bool Invoke(const sarray<Any>& ArgsList)const;
|
|
//safe
|
|
bool Invoke(svector<Any>& ArgsList)const;
|
|
|
|
//const sarray || svector
|
|
template<typename SArgsList>
|
|
bool Invokes(SArgsList& ArgsList)const;
|
|
|
|
template<typename Func, typename... Args>
|
|
auto Call(Func func, Args&&... args)const;
|
|
|
|
sarray<const UClass*> GetParams() const;
|
|
};
|
|
} |