From 0d64e0cf446d36e111a32f383d5dd066877d81c8 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Wed, 1 May 2024 17:17:05 +0300 Subject: [PATCH] ... --- common/adc_traits.h | 4 +++- common/adc_utils.h | 4 ++++ common/adc_value.h | 8 ++++++++ device/adc_device_command.h | 27 +++++++++++++++++---------- tests/adc_valueholder_test.cpp | 6 +++--- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/common/adc_traits.h b/common/adc_traits.h index b317504..0bec9da 100644 --- a/common/adc_traits.h +++ b/common/adc_traits.h @@ -55,6 +55,7 @@ struct adc_func_traits_helper_t { using ret_t = R; using args_t = std::tuple<>; using arg1_t = void; + static constexpr size_t arity = 0; }; template @@ -62,6 +63,7 @@ struct adc_func_traits_helper_t { using ret_t = R; using args_t = std::tuple; using arg1_t = Arg; + static constexpr size_t arity = sizeof...(Args) + 1; }; @@ -109,7 +111,7 @@ using adc_func_arg1_t = typename adc_func_traits::arg1_t; template using adc_deduced_type = std::conditional_t && !std::is_const_v>, - T, + T&, std::remove_cvref_t>; diff --git a/common/adc_utils.h b/common/adc_utils.h index d205819..0722d88 100644 --- a/common/adc_utils.h +++ b/common/adc_utils.h @@ -419,6 +419,10 @@ public: template static ValueT deserialize(const SerializedT& svalue) { + if constexpr (std::is_void_v) { + return; + } + ValueT res; if constexpr (traits::adc_is_tuple_v) { diff --git a/common/adc_value.h b/common/adc_value.h index 5db7f6d..19e97cd 100644 --- a/common/adc_value.h +++ b/common/adc_value.h @@ -382,9 +382,11 @@ protected: static_assert(std::is_convertible_v, ValueT>, "INVALID RETURNED TYPE OF DESERIALIZING CALLABLE!!!"); + _serializerWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(serializer)), this]() { auto& serializer = std::get<0>(wrapper); + auto val = _getterFunc[this](); return serializer(val); @@ -486,6 +488,8 @@ public: AdcValueHolder::resetValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)); initWrappers>(std::forward(serializer), std::forward(deserializer)); + + return *this; } @@ -507,6 +511,8 @@ public: std::forward(validator), std::tuple{}); initWrappers>(std::forward(serializer), std::forward(deserializer)); + + return *this; } template (getter), std::forward(setter), std::tuple{}); initWrappers>(std::forward(serializer), std::forward(deserializer)); + + return *this; } diff --git a/device/adc_device_command.h b/device/adc_device_command.h index 50081c9..cce481d 100644 --- a/device/adc_device_command.h +++ b/device/adc_device_command.h @@ -9,7 +9,8 @@ #include #include -#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 _commandArgUptr; + std::unique_ptr> _commandArgUptr; std::function _execFuncWrapper; std::function _deserializerWrapper; + template + constexpr static SerializedT AdcDeviceCommandDummySerializer(const T&) + { + return SerializedT(); + } + public: typedef IdentT ident_t; typedef SerializedT serialized_t; template + typename ARGT = traits::adc_func_arg1_t, + typename DeserializerT = decltype(utils::AdcDefaultValueConverter<>::deserialize), + typename ValidatorT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> AdcDeviceCommand(const IdentT& ident, ExecFuncT&& exec_func, - DeserializerT&& deserializer, - ValidatorT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + DeserializerT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize, + ValidatorT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) : _ident(ident), _commandArgUptr() { using sign_t = traits::adc_func_traits; - static_assert(std::tuple_size_v > 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) { // command with argument + if constexpr (sign_t::arity) { // command with argument using value_t = typename sign_t::arg1_t; static_assert(std::predicate, "INVALID TYPE OF VALIDATOR"); @@ -60,7 +67,7 @@ public: auto command_arg = std::shared_ptr(value_t()); - _commandArgUptr = std::make_unique( + _commandArgUptr = std::make_unique>( [command_arg]() { return *command_arg; }, [command_arg](const value_t& value) { *command_arg = value; }, std::forward(validator)); diff --git a/tests/adc_valueholder_test.cpp b/tests/adc_valueholder_test.cpp index a64311c..dc4ea37 100644 --- a/tests/adc_valueholder_test.cpp +++ b/tests/adc_valueholder_test.cpp @@ -192,9 +192,9 @@ TEST_CASE("[ADC VALUEHOLDER]") // fl = vsh; // std::cout << "VSH: " << fl << "\n"; - // svh.resetValueHolder(gdbl, sdbl, vdbl, adc::AdcValueHolder::_defaultTrivialConvTypes); - svh.resetValueHolder([]() { return dbl_val; }, [](const double& v) { dbl_val = v; }, - [](const double&) { return true; }, adc::AdcValueHolder::_defaultTrivialConvTypes); + svh.resetValueHolder(gdbl, sdbl, vdbl, adc::AdcValueHolder::_defaultTrivialConvTypes); + // svh.resetValueHolder([]() { return dbl_val; }, [](const double& v) { dbl_val = v; }, + // [](const double&) { return true; }, adc::AdcValueHolder::_defaultTrivialConvTypes); std::cout << "SERIALIZED: " << svh.serialize() << "\n"; svh.deserialize("123.123"); res = svh;