From b4a4722583d36ae99ad1b94788ca29a1d40c32a9 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Tue, 30 Apr 2024 15:28:24 +0300 Subject: [PATCH] ... --- common/adc_utils.h | 45 +++++++++++++++++++++++++ common/adc_value.h | 83 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 118 insertions(+), 10 deletions(-) diff --git a/common/adc_utils.h b/common/adc_utils.h index 48b0103..d205819 100644 --- a/common/adc_utils.h +++ b/common/adc_utils.h @@ -388,4 +388,49 @@ public: } }; +namespace constants +{ + +static constexpr char DEFAULT_CONVERTER_DELIMITER[] = " "; + +} // namespace constants + +template +class AdcDefaultValueConverter +{ +public: + template + static SerializedT serialize(const ValueT& value) + { + SerializedT res; + + if constexpr (traits::adc_is_tuple_v) { + AdcCharRangeFromTuple(res, value, DELIMITER); + } else if constexpr (traits::adc_input_char_range) { + AdcCharRangeFromValueRange(res, value, DELIMITER); + } else { + res = AdcTrivialSerializer(value); + } + + return res; + } + + + template + static ValueT deserialize(const SerializedT& svalue) + { + ValueT res; + + if constexpr (traits::adc_is_tuple_v) { + AdcTupleFromCharRange(res, svalue, DELIMITER); + } else if constexpr (traits::adc_output_char_range) { + AdcValueRangeFromCharRange(res, svalue, DELIMITER); + } else { + res = AdcTrivialDeserializer(svalue); + } + + return res; + } +}; + } // namespace adc::utils diff --git a/common/adc_value.h b/common/adc_value.h index 3e8f6ec..d5dc452 100644 --- a/common/adc_value.h +++ b/common/adc_value.h @@ -11,6 +11,7 @@ #include #include "adc_traits.h" +#include "adc_utils.h" namespace adc { @@ -391,13 +392,19 @@ protected: std::function _deserializerWrapper; - template + 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](); + auto val = _getterFunc[this](); return serializer(val); }; @@ -407,28 +414,84 @@ protected: this](const SerializedT& sval) { auto& deserializer = std::get<0>(wrapper); - VALUET val = deserializer(sval); + ValueT val = deserializer(sval); - _setterFunc[this](val); + _setterFunc[this](val); }; } public: + /* CONSTRUCTORS AND DESTRUCTOR */ + template >, typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator), - typename SRT, - typename DSRT> - AdcSerializingValueHolder(GT&& getter, ST&& setter, VT&& validator, SRT&& serializer, DSRT&& deserializer) + 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)) { - using value_t = std::decay_t>; - - initWrappers(std::forward(serializer), std::forward(deserializer)); + 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); } };