...
This commit is contained in:
@@ -9,7 +9,8 @@
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include "../common/adc_value_holder.h"
|
||||
// #include "../common/adc_value_holder.h"
|
||||
#include "../common/adc_value.h"
|
||||
|
||||
/*
|
||||
|
||||
@@ -24,31 +25,37 @@ class AdcDeviceCommand
|
||||
protected:
|
||||
IdentT _ident;
|
||||
|
||||
std::unique_ptr<AdcValueHolder> _commandArgUptr;
|
||||
std::unique_ptr<AdcSerializingValueHolder<SerializedT>> _commandArgUptr;
|
||||
|
||||
std::function<void()> _execFuncWrapper;
|
||||
std::function<void(std::any&)> _deserializerWrapper;
|
||||
|
||||
template <typename T>
|
||||
constexpr static SerializedT AdcDeviceCommandDummySerializer(const T&)
|
||||
{
|
||||
return SerializedT();
|
||||
}
|
||||
|
||||
public:
|
||||
typedef IdentT ident_t;
|
||||
typedef SerializedT serialized_t;
|
||||
|
||||
|
||||
template <typename ExecFuncT,
|
||||
typename DeserializerT,
|
||||
typename ValidatorT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)>
|
||||
typename ARGT = traits::adc_func_arg1_t<ExecFuncT>,
|
||||
typename DeserializerT = decltype(utils::AdcDefaultValueConverter<>::deserialize<ARGT, SerializedT>),
|
||||
typename ValidatorT = decltype(AdcValueHolder::AdcValueHolderDummyValidator<ARGT>)>
|
||||
AdcDeviceCommand(const IdentT& ident,
|
||||
ExecFuncT&& exec_func,
|
||||
DeserializerT&& deserializer,
|
||||
ValidatorT&& validator = AdcValueHolder::AdcValueHolderDummyValidator)
|
||||
DeserializerT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize<ARGT, SerializedT>,
|
||||
ValidatorT&& validator = AdcValueHolder::AdcValueHolderDummyValidator<ARGT>)
|
||||
: _ident(ident), _commandArgUptr()
|
||||
{
|
||||
using sign_t = traits::adc_func_traits<ExecFuncT>;
|
||||
|
||||
static_assert(std::tuple_size_v<typename sign_t::args_t> > 1,
|
||||
"COMMAND EXECUTION FUNCTION MUST ACCEPT 0 OR EXACTLY 1 ARGUMENT!!!");
|
||||
static_assert(sign_t::arity > 1, "COMMAND EXECUTION FUNCTION MUST ACCEPT 0 OR EXACTLY 1 ARGUMENT!!!");
|
||||
|
||||
if constexpr (std::tuple_size_v<typename sign_t::args_t>) { // command with argument
|
||||
if constexpr (sign_t::arity) { // command with argument
|
||||
using value_t = typename sign_t::arg1_t;
|
||||
|
||||
static_assert(std::predicate<ValidatorT, const value_t&>, "INVALID TYPE OF VALIDATOR");
|
||||
@@ -60,7 +67,7 @@ public:
|
||||
|
||||
auto command_arg = std::shared_ptr<value_t>(value_t());
|
||||
|
||||
_commandArgUptr = std::make_unique<AdcValueHolder>(
|
||||
_commandArgUptr = std::make_unique<AdcSerializingValueHolder<SerializedT>>(
|
||||
[command_arg]() { return *command_arg; }, [command_arg](const value_t& value) { *command_arg = value; },
|
||||
std::forward<ValidatorT>(validator));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user