zengine-old/engine/3rdparty/zlib/include/refl/detail/field.inl

55 lines
1.5 KiB
Plaintext
Raw Normal View History

2024-04-26 15:26:38 +08:00
#pragma once
2024-04-11 10:13:15 +08:00
#include "uclass.h"
namespace refl {
2024-04-15 19:53:39 +08:00
template<typename Func, typename... Args>
inline auto FieldPtr::Call(Func func, Args&& ...args)const
2024-04-14 22:45:08 +08:00
{
2024-04-15 19:53:39 +08:00
using MemberFunc = decltype(fetch_method_t(func));
2024-04-19 22:02:27 +08:00
MemberFunc fptr = (MemberFunc)data.method.fptr;
2024-04-15 19:53:39 +08:00
return fptr(std::forward<Args>(args)...);
2024-04-14 22:45:08 +08:00
}
inline bool FieldPtr::Invoke(const sarray<Any>& ArgsList)const{
2024-04-11 10:13:15 +08:00
auto Call = type->vtable.Call;
if (Call) {
Call(this, ArgsList);
}
return Call;
}
inline bool FieldPtr::Invoke(svector<Any>& ArgsList)const {
2024-04-11 10:13:15 +08:00
auto Call = type->vtable.Call;
if (Call) {
2024-04-19 22:02:27 +08:00
sarray<const UClass*> params = GetParams();
2024-04-11 10:13:15 +08:00
int paramsSize = params.size();
int argsSize = ArgsList.size();
if (argsSize < paramsSize && flag & FIELD_METHOD_VALUE_FLAG) {
2024-04-19 22:02:27 +08:00
const Any* argsPtr = data.method.value.front();
int valueSize = data.method.value.size();
2024-04-11 10:13:15 +08:00
if (argsSize + valueSize >= paramsSize) {
for (int i = valueSize + argsSize - paramsSize; i < valueSize; i++) {
ArgsList.push_back(*(argsPtr + i));
}
argsSize = paramsSize;
}
}
if (argsSize < paramsSize) {
return false;
}
2024-04-19 22:02:27 +08:00
Any* a = ArgsList.front();
2024-04-16 16:17:13 +08:00
auto p = params.front();
for (auto e = params.back(); p < e; ++p, ++a) {
2024-04-25 21:45:41 +08:00
if (a->cls != *p && !a->Check(*p)) {
2024-04-11 10:13:15 +08:00
return false;
}
}
Call(this, ArgsList);
}
return Call;
}
inline sarray<const UClass*> FieldPtr::GetParams() const {
2024-04-11 10:13:15 +08:00
auto GetParams = type->vtable.GetParams;
if (GetParams) {
return GetParams(type);
}
return{};
}
}