diff --git a/common/adc_traits.h b/common/adc_traits.h index 0d77013..b317504 100644 --- a/common/adc_traits.h +++ b/common/adc_traits.h @@ -67,7 +67,7 @@ struct adc_func_traits_helper_t { // callable traits -template +template struct adc_func_traits; template @@ -87,9 +87,17 @@ struct adc_func_traits : adc_func_traits_helper_t -struct adc_func_traits : adc_func_traits::operator())> { +// struct adc_func_traits : adc_func_traits::operator())> { +struct adc_func_traits>> : adc_func_traits { }; +template +struct adc_func_traits : adc_func_traits { +}; + +template +struct adc_func_traits : adc_func_traits { +}; template using adc_retval_t = typename adc_func_traits::ret_t; diff --git a/common/adc_value.h b/common/adc_value.h index d5dc452..5db7f6d 100644 --- a/common/adc_value.h +++ b/common/adc_value.h @@ -92,6 +92,9 @@ inline std::error_code make_error_code(AdcValueHolderErrorCode ec) class AdcValueHolder { protected: + template + using ret_value_t = std::decay_t>; + template inline static std::unordered_map> _getterFunc{}; @@ -101,10 +104,10 @@ protected: std::function _clearFunc; void init(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator) + std::invocable&> auto&& setter, + std::predicate&> auto&& validator) { - using value_t = std::decay_t>; + using value_t = ret_value_t; static_assert(!std::is_same_v, "THE getter MUST NOT RETURN void TYPE!!!"); @@ -162,7 +165,7 @@ public: /* CONSTRUCTORS AND DESTRUCTOR */ template , + typename VALT = ret_value_t, typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> AdcValueHolder(GT&& getter, std::invocable auto&& setter, @@ -176,21 +179,21 @@ public: template AdcValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator, + std::invocable&> auto&& setter, + std::predicate&> auto&& validator, const std::tuple& /* tuple-of-trivially-converting-types */) : AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)) { // setup trivially-defined conversion function - AdcValueHolder::setupTrivialConvertFunc, std::tuple>(); + AdcValueHolder::setupTrivialConvertFunc, std::tuple>(); } template AdcValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, + std::invocable&> auto&& setter, const std::tuple& t /* tuple-of-trivially-converting-types */) : AdcValueHolder(std::forward(getter), std::forward(setter), @@ -209,13 +212,11 @@ public: /* PUBLIC METHODS */ - template , - typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> + template >)> AdcValueHolder& resetValueHolder(GT&& getter, - std::invocable auto&& setter, - VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) - requires std::invocable && std::predicate + std::invocable&> auto&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator>) + requires std::invocable && std::predicate&> { _clearFunc(); @@ -228,15 +229,15 @@ public: template AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator, + std::invocable&> auto&& setter, + std::predicate&> auto&& validator, const std::tuple& /* tuple-of-trivially-converting-types */) { resetValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)); // setup trivially-defined conversion function - setupTrivialConvertFunc, std::tuple>(); + setupTrivialConvertFunc, std::tuple>(); return *this; } @@ -244,24 +245,26 @@ public: template AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, + std::invocable&> auto&& setter, const std::tuple& t /* tuple-of-trivially-converting-types */) { return resetValueHolder(std::forward(getter), std::forward(setter), - AdcValueHolder::AdcValueHolderDummyValidator>, - t); + AdcValueHolder::AdcValueHolderDummyValidator>, t); } template AdcValueHolder& addConvertFunc(FromFuncT&& func_from_internal, ToFuncT&& func_to_internal) - requires std::invocable>> && - std::invocable>> + requires std::invocable&> && + std::invocable&> { - using from_sig_t = typename traits::adc_func_traits; - using to_sig_t = typename traits::adc_func_traits; - using value_t = std::decay_t; // internal value type - using user_t = std::decay_t; + // using from_sig_t = typename traits::adc_func_traits; + // using to_sig_t = typename traits::adc_func_traits; + // using value_t = std::decay_t; // internal value type + // using user_t = std::decay_t; + + using value_t = ret_value_t; // it must be internal value type + using user_t = ret_value_t; _getterFunc[this] = [wrapper = traits::adc_pf_wrapper(std::forward(func_from_internal)), this]() { @@ -319,8 +322,8 @@ public: auto setter = _setterFunc[this]; if (setter) { - // setter(std::forward(value)); - setter(value); + setter(std::forward(value)); + // setter(value); } else { throw std::system_error(AdcValueHolderErrorCode::ERROR_NO_CONV_FUNC); } @@ -357,6 +360,181 @@ protected: }; + +/* */ + +template +class AdcSerializingValueHolder : public AdcValueHolder +{ +protected: + std::function _serializerWrapper; + + std::function _deserializerWrapper; + + template + void initWrappers(SRT&& serializer, DSRT&& deserializer) + requires std::invocable && std::invocable + + { + static_assert(std::is_convertible_v, SerializedT>, + "INVALID RETURNED TYPE OF SERIALIZING CALLABLE!!!"); + + 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); + }; + + + _deserializerWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(deserializer)), + this](const SerializedT& sval) { + auto& deserializer = std::get<0>(wrapper); + + ValueT val = deserializer(sval); + + _setterFunc[this](val); + }; + } + +public: + /* CONSTRUCTORS AND DESTRUCTOR */ + + template , + typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator), + typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize)> + AdcSerializingValueHolder(GT&& getter, + ST&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) + requires std::invocable && std::invocable && std::predicate && + std::invocable && std::invocable + : AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)) + { + initWrappers(std::forward(serializer), std::forward(deserializer)); + } + + + template , + typename VT, + typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize), + typename... Ts> + AdcSerializingValueHolder(GT&& getter, + ST&& setter, + VT&& validator, + const std::tuple&, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) + : AdcValueHolder(std::forward(getter), + std::forward(setter), + std::forward(validator), + std::tuple{}) + { + initWrappers(std::forward(serializer), std::forward(deserializer)); + } + + + + template , + typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize), + typename... Ts> + AdcSerializingValueHolder(GT&& getter, + ST&& setter, + const std::tuple&, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) + : AdcValueHolder(std::forward(getter), + std::forward(setter), + AdcValueHolder::AdcValueHolderDummyValidator, + std::tuple{}) + { + initWrappers(std::forward(serializer), std::forward(deserializer)); + } + + + virtual ~AdcSerializingValueHolder() = default; + + + /* PUBLIC METHODS */ + + template >), + typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize>), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize, SerializedT>)> + AdcSerializingValueHolder& resetValueHolder( + GT&& getter, + ST&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator>, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize>, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize, SerializedT>) + { + AdcValueHolder::resetValueHolder(std::forward(getter), std::forward(setter), + std::forward(validator)); + initWrappers>(std::forward(serializer), std::forward(deserializer)); + } + + + template ::serialize>), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize, SerializedT>), + typename... Ts> + AdcSerializingValueHolder& resetValueHolder( + GT&& getter, + ST&& setter, + VT&& validator, + const std::tuple&, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize>, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize, SerializedT>) + { + AdcValueHolder::resetValueHolder(std::forward(getter), std::forward(setter), + std::forward(validator), std::tuple{}); + + initWrappers>(std::forward(serializer), std::forward(deserializer)); + } + + template ::serialize>), + typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize, SerializedT>), + typename... Ts> + AdcSerializingValueHolder& resetValueHolder( + GT&& getter, + ST&& setter, + const std::tuple&, + SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize>, + DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize, SerializedT>) + { + AdcValueHolder::resetValueHolder(std::forward(getter), std::forward(setter), std::tuple{}); + + initWrappers>(std::forward(serializer), std::forward(deserializer)); + } + + + SerializedT serialize() { return _serializerWrapper(); } + + void deserialize(const SerializedT& sval) { _deserializerWrapper(sval); } + + using AdcValueHolder::operator=; +}; + + /* factory functions @@ -382,117 +560,5 @@ AdcValueHolder make_arith_valueholder(GT&& getter, } -/* */ - -template -class AdcSerializingValueHolder : public AdcValueHolder -{ -protected: - std::function _serializerWrapper; - - std::function _deserializerWrapper; - - template - void initWrappers(SRT&& serializer, DSRT&& deserializer) - { - static_assert(std::is_convertible_v, SerializedT>, - "INVALID RETURNED TYPE OF SERIALIZING CALLABLE!!!"); - - 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); - }; - - - _serializerWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(deserializer)), - this](const SerializedT& sval) { - auto& deserializer = std::get<0>(wrapper); - - ValueT val = deserializer(sval); - - _setterFunc[this](val); - }; - } - -public: - /* CONSTRUCTORS AND DESTRUCTOR */ - - template >, - typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator), - typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), - typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize)> - AdcSerializingValueHolder(GT&& getter, - ST&& setter, - VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator, - SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, - DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) - requires std::invocable && std::invocable && std::invocable - : AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)) - { - initWrappers(std::forward(serializer), std::forward(deserializer)); - } - - - template >, - typename VT, - typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), - typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize), - typename... Ts> - AdcSerializingValueHolder(GT&& getter, - ST&& setter, - VT&& validator, - const std::tuple&, - SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, - DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) - : AdcValueHolder(std::forward(getter), - std::forward(setter), - std::forward(validator), - std::tuple{}) - { - initWrappers(std::forward(serializer), std::forward(deserializer)); - } - - - - template >, - typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), - typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize), - typename... Ts> - AdcSerializingValueHolder(GT&& getter, - ST&& setter, - const std::tuple&, - SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, - DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) - : AdcValueHolder(std::forward(getter), - std::forward(setter), - AdcValueHolder::AdcValueHolderDummyValidator, - std::tuple{}) - { - initWrappers(std::forward(serializer), std::forward(deserializer)); - } - - - virtual ~AdcSerializingValueHolder() = default; - - - /* PUBLIC METHODS */ - - SerializedT serialize() { return _serializerWrapper(); } - - void deserialize(const SerializedT& sval) { _deserializerWrapper(sval); } -}; - } // namespace adc diff --git a/tests/adc_valueholder_test.cpp b/tests/adc_valueholder_test.cpp index 1cab9e0..a64311c 100644 --- a/tests/adc_valueholder_test.cpp +++ b/tests/adc_valueholder_test.cpp @@ -8,6 +8,31 @@ // #include "../common/adc_value_holder.h" #include "../common/adc_value.h" + +static double dbl_val = 99.99; + +double gdbl() +{ + return dbl_val; +} + + +void sdbl(const double& v) +{ + dbl_val = v; +} + + +bool vdbl(const double& v) +{ + if (v < 1.0) { + return false; + } + + return true; +} + + TEST_CASE("[ADC VALUEHOLDER]") { int int_val = 10; @@ -149,4 +174,29 @@ TEST_CASE("[ADC VALUEHOLDER]") std::cout << "ZZ = " << zz << "\n"; std::cout << "ELAPS: " << std::chrono::duration_cast(t2 - t1).count() << " mksec\n"; + + + + adc::AdcSerializingValueHolder svh(getter, setter, validator, adc::AdcValueHolder::_defaultTrivialConvTypes); + + svh = 77.65412; + + std::cout << "SERIALIZED: " << svh.serialize() << "\n"; + + svh.deserialize("123"); + float fl = svh; + std::cout << "DESERIALIZED: " << fl << "\n"; + + // vsh.resetValueHolder(gdbl, sdbl, vdbl, adc::AdcValueHolder::_defaultTrivialConvTypes); + + // 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); + std::cout << "SERIALIZED: " << svh.serialize() << "\n"; + svh.deserialize("123.123"); + res = svh; + std::cout << "DESERIALIZED: " << res << "\n"; }