#include "uclass.h" namespace refl { template inline auto FieldPtr::Call(Func func, Args&& ...args)const { using MemberFunc = decltype(fetch_method_t(func)); MemberFunc fptr = (MemberFunc)data.method.fptr; return fptr(std::forward(args)...); } bool FieldPtr::Invoke(const sarray& ArgsList)const{ auto Call = type->vtable.Call; if (Call) { Call(this, ArgsList); } return Call; } bool FieldPtr::Invoke(svector& ArgsList)const { auto Call = type->vtable.Call; if (Call) { sarray params = GetParams(); int paramsSize = params.size(); int argsSize = ArgsList.size(); if (argsSize < paramsSize && flag & FIELD_METHOD_VALUE_FLAG) { const Any* argsPtr = data.method.value.front(); int valueSize = data.method.value.size(); 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; } Any* a = ArgsList.front(); auto p = params.front(); for (auto e = params.back(); p < e; ++p, ++a) { if (a->cls != *p && !a->Check(*p)) { return false; } } Call(this, ArgsList); } return Call; } sarray FieldPtr::GetParams() const { auto GetParams = type->vtable.GetParams; if (GetParams) { return GetParams(type); } return{}; } }