zengine-old/engine/3rdparty/zlib/include/refl/detail/field.inl
2024-04-11 10:13:15 +08:00

45 lines
1.1 KiB
C++

#include "uclass.h"
namespace refl {
bool FieldPtr::Invoke(const std::vector<ArgsView>& ArgsList)const{
auto Call = type->vtable.Call;
if (Call) {
Call(this, ArgsList);
}
return Call;
}
bool FieldPtr::Invoke(std::vector<ArgsView>& ArgsList)const {
auto Call = type->vtable.Call;
if (Call) {
auto params = GetParams();
int paramsSize = params.size();
int argsSize = ArgsList.size();
if (argsSize < paramsSize && flag & FIELD_METHOD_VALUE_FLAG) {
auto [argsPtr, valueSize] = value.method();
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;
}
for (int i = 0; i < paramsSize; i++) {
if (ArgsList[i].cls != params[i] && !ArgsList[i].ConvertTo(params[i])) {
return false;
}
}
Call(this, ArgsList);
}
return Call;
}
std::vector<const UClass*> FieldPtr::GetParams() const {
auto GetParams = type->vtable.GetParams;
if (GetParams) {
return GetParams(type);
}
return{};
}
}