This commit is contained in:
codeboss 2024-11-16 21:55:02 +08:00
parent fe721162ac
commit ba7ac2503d
2 changed files with 19 additions and 10 deletions

View File

@ -3,6 +3,7 @@
#include <functional> #include <functional>
#include <QString> #include <QString>
#include "data_types.h" #include "data_types.h"
#include "validation.h"
namespace Inlet { namespace Inlet {
template<typename... Types> struct SignatureImpl; template<typename... Types> struct SignatureImpl;
@ -15,8 +16,8 @@ namespace Inlet {
} }
void result() const { } void result() const { }
void saveTo(int index, datas::IDataObject &object) { } void saveTo(int index, datas::IDataObject& object) { }
void loadFrom(int index, datas::IDataObject &object) { } void loadFrom(int index, datas::IDataObject& object) { }
}; };
template<typename Ret> struct SignatureImpl<Ret> { template<typename Ret> struct SignatureImpl<Ret> {
private: private:
@ -34,10 +35,10 @@ namespace Inlet {
return _result; return _result;
} }
void saveTo(int index, datas::IDataObject &object) { void saveTo(int index, datas::IDataObject& object) {
datas::dataSet<Ret>(object, u8"RetValue", _result); datas::dataSet<Ret>(object, u8"RetValue", _result);
} }
void loadFrom(int index, datas::IDataObject &object) { void loadFrom(int index, datas::IDataObject& object) {
_result = datas::dataGet<Ret>(object, u8"RetValue"); _result = datas::dataGet<Ret>(object, u8"RetValue");
} }
}; };
@ -50,6 +51,10 @@ namespace Inlet {
SignatureImpl() : SignatureImpl<Ret, Args...>(), _args_value(First()) { } SignatureImpl() : SignatureImpl<Ret, Args...>(), _args_value(First()) { }
SignatureImpl(First a0, Args... args) :SignatureImpl<Ret, Args...>(args...), _args_value(a0) { } SignatureImpl(First a0, Args... args) :SignatureImpl<Ret, Args...>(args...), _args_value(a0) { }
First getArgs0() {
return _args_value;
}
Ret execute(std::function<Ret(First, Args...)> unit) { Ret execute(std::function<Ret(First, Args...)> unit) {
auto unit_wrap = [&](Args... args) { auto unit_wrap = [&](Args... args) {
return unit(_args_value, args...); return unit(_args_value, args...);
@ -58,11 +63,11 @@ namespace Inlet {
} }
void saveTo(int index, datas::IDataObject &object) { void saveTo(int index, datas::IDataObject& object) {
datas::dataSet<First>(object, QString(u8"Args_%1").arg(index), _args_value); datas::dataSet<First>(object, QString(u8"Args_%1").arg(index), _args_value);
SignatureImpl<Ret, Args...>::saveTo(index + 1, object); SignatureImpl<Ret, Args...>::saveTo(index + 1, object);
} }
void loadFrom(int index, datas::IDataObject &object) { void loadFrom(int index, datas::IDataObject& object) {
_args_value = datas::dataGet<First>(object, QString(u8"Args_%1").arg(index)); _args_value = datas::dataGet<First>(object, QString(u8"Args_%1").arg(index));
SignatureImpl<Ret, Args...>::loadFrom(index + 1, object); SignatureImpl<Ret, Args...>::loadFrom(index + 1, object);
} }
@ -118,10 +123,10 @@ namespace Inlet {
void run() { void run() {
_args_value.execute(_func); _args_value.execute(_func);
} }
virtual void saveTo(datas::IDataObject &object) { virtual void saveTo(datas::IDataObject& object) {
_args_value.saveTo(0, object); _args_value.saveTo(0, object);
} }
virtual void loadFrom(datas::IDataObject &object) { virtual void loadFrom(datas::IDataObject& object) {
_args_value.loadFrom(0, object); _args_value.loadFrom(0, object);
} }
}; };
@ -157,10 +162,10 @@ namespace Inlet {
void run() { void run() {
_args_value.execute(_func); _args_value.execute(_func);
} }
virtual void saveTo(datas::IDataObject &object) { virtual void saveTo(datas::IDataObject& object) {
_args_value.saveTo(0, object); _args_value.saveTo(0, object);
} }
virtual void loadFrom(datas::IDataObject &object) { virtual void loadFrom(datas::IDataObject& object) {
_args_value.loadFrom(0, object); _args_value.loadFrom(0, object);
} }
}; };

View File

@ -144,6 +144,10 @@ namespace validate {
template<void* func, typename... types> struct ValidateHelper; template<void* func, typename... types> struct ValidateHelper;
template<void* func, typename return_type, typename... args_type> template<void* func, typename return_type, typename... args_type>
struct ValidateHelper<func, return_type, args_type...> : public ValidateTemplet<args_type...> { struct ValidateHelper<func, return_type, args_type...> : public ValidateTemplet<args_type...> {
quint64 address() const {
return (quint64) func;
}
template<int n> ArgsPosition<n, args_type...> pos() { template<int n> ArgsPosition<n, args_type...> pos() {
return ArgsPosition<n, args_type...>(*this); return ArgsPosition<n, args_type...>(*this);
} }