diff --git a/common/adc_utils.h b/common/adc_utils.h index c06d4bb..936a9e1 100644 --- a/common/adc_utils.h +++ b/common/adc_utils.h @@ -282,20 +282,57 @@ static auto AdcCharRangeFromTuple(OutputR& res, const std::tuple& tp, Del } -/* - */ -template -class AdcDefaultSerializer +namespace details { - std::string_view _delimiter; +template +class AdcDelimiter +{ public: template - AdcDefaultSerializer(const DT& delimiter = ",") : _delimiter(delimiter.begin(), delimiter.end()) + auto& setDelimiter(const DT& delimiter) + { + _delimiter = std::string{delimiter.begin(), delimiter.end()}; + + return static_cast(*this); + } + + auto& setDelimiter(const char* delimiter) + { + _delimiter = std::string{delimiter}; + + return static_cast(*this); + } + +protected: + template + AdcDelimiter(const DT& delimiter = ",") : _delimiter(delimiter.begin(), delimiter.end()) { } - AdcDefaultSerializer(const char* delimiter = ",") : _delimiter(delimiter) {} + AdcDelimiter(const char* delimiter = ",") : _delimiter(delimiter) {} + + virtual ~AdcDelimiter() = default; + + std::string _delimiter; +}; + +} // namespace details + +/* + */ +template +class AdcDefaultSerializer : public details::AdcDelimiter> +{ + std::string _delimiter; + + using base_t = details::AdcDelimiter>; + +public: + template + AdcDefaultSerializer(const DT& delimiter = ",") : base_t(delimiter) + { + } virtual ~AdcDefaultSerializer() = default; @@ -314,20 +351,40 @@ public: return res; } +}; - template - AdcDefaultSerializer& setDelimiter(const DT& delimiter) + +/* + */ +template +class AdcDefaultDeserializer : public details::AdcDelimiter> +{ + std::string _delimiter; + + using base_t = details::AdcDelimiter>; + +public: + template + AdcDefaultDeserializer(const DT& delimiter = ",") : base_t(delimiter) { - _delimiter = std::string_view{delimiter.begin(), delimiter.end()}; - - return *this; } - AdcDefaultSerializer& setDelimiter(const char* delimiter) - { - _delimiter = std::string_view{delimiter}; + virtual ~AdcDefaultDeserializer() = default; - return *this; + template + T deserialization(const SerializedT& value) + { + T res; + + if constexpr (traits::adc_is_tuple_v) { + AdcTupleFromCharRange(res, value, _delimiter); + } else if constexpr (traits::adc_output_char_range) { + AdcValuRangeFromCharRange(res, value, _delimiter); + } else { + res = AdcTrivialDeserializer(value); + } + + return res; } }; diff --git a/common/adc_value_holder.h b/common/adc_value_holder.h index b30a026..12d5bce 100644 --- a/common/adc_value_holder.h +++ b/common/adc_value_holder.h @@ -433,12 +433,14 @@ AdcValueHolder make_arith_valueholder(GT&& getter, } -// AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter, -// std::invocable&> auto&& setter) -// { -// return make_arith_valueholder(std::forward(getter), std::forward(setter), -// AdcValueHolder::AdcValueHolderDummyValidator>); -// } +/* */ + +template +class AdcSerializingValueHolder : public AdcValueHolder +{ +public: + using AdcValueHolder::AdcValueHolder; +}; } // namespace adc