This commit is contained in:
Timur A. Fatkhullin 2024-04-30 11:47:42 +03:00
parent 7737edc77f
commit b6edadee03
2 changed files with 26 additions and 26 deletions

View File

@ -379,7 +379,7 @@ public:
if constexpr (traits::adc_is_tuple_v<T>) { if constexpr (traits::adc_is_tuple_v<T>) {
AdcTupleFromCharRange(res, value, _delimiter); AdcTupleFromCharRange(res, value, _delimiter);
} else if constexpr (traits::adc_output_char_range<T>) { } else if constexpr (traits::adc_output_char_range<T>) {
AdcValuRangeFromCharRange(res, value, _delimiter); AdcValueRangeFromCharRange(res, value, _delimiter);
} else { } else {
res = AdcTrivialDeserializer<T>(value); res = AdcTrivialDeserializer<T>(value);
} }

View File

@ -387,46 +387,46 @@ template <typename SerializedT = std::string>
class AdcSerializingValueHolder : public AdcValueHolder class AdcSerializingValueHolder : public AdcValueHolder
{ {
protected: protected:
std::function<SerializedT()> _serializerWrapper = []() { std::function<SerializedT()> _serializerWrapper;
};
std::function<void(const SerializedT&)> _deserializerWrapper; std::function<void(const SerializedT&)> _deserializerWrapper;
template <typename GT, typename ST, typename VT, typename SRT, typename DSRT> template <typename VALUET, typename SRT, typename DSRT>
void init(GT&& getter, ST&& setter, VT&& validator, SRT&& serializer, DSRT&& deserializer) void initWrappers(SRT&& serializer, DSRT&& deserializer)
{ {
_serializerWrapper = [wrapper = _serializerWrapper = [wrapper = traits::adc_pf_wrapper(std::forward<SRT>(serializer)), this]() {
traits::adc_pf_wrapper(std::forward<GT>(getter), std::forward<SRT>(serializer))]() { auto& serializer = std::get<0>(wrapper);
auto& getter = std::get<0>(wrapper);
auto& serializer = std::get<1>(wrapper); auto val = _getterFunc<VALUET>[this]();
auto val = getter();
return serializer(val); return serializer(val);
}; };
using v_t = traits::adc_retval_t<GT>; _serializerWrapper = [wrapper = traits::adc_pf_wrapper(std::forward<DSRT>(deserializer)),
this](const SerializedT& sval) {
auto& deserializer = std::get<0>(wrapper);
_serializerWrapper = [wrapper = VALUET val = deserializer(sval);
traits::adc_pf_wrapper(std::forward<ST>(setter), std::forward<VT>(validator),
std::forward<DSRT>(deserializer))](const SerializedT& sval) {
auto& setter = std::get<0>(wrapper);
auto& validator = std::get<1>(wrapper);
auto& deserializer = std::get<2>(wrapper);
v_t val = deserializer(sval); _setterFunc<VALUET>[this](val);
if (validator(val)) {
setter(val);
} else {
throw std::system_error(AdcValueHolderErrorCode::ERROR_VALUE_IS_NOT_VALID);
}
}; };
} }
public: public:
using AdcValueHolder::AdcValueHolder; template <typename GT,
typename ST,
typename VALT = std::decay_t<traits::adc_retval_t<GT>>,
typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator<VALT>),
typename SRT,
typename DSRT>
AdcSerializingValueHolder(GT&& getter, ST&& setter, VT&& validator, SRT&& serializer, DSRT&& deserializer)
: AdcValueHolder(std::forward<GT>(getter), std::forward<ST>(setter), std::forward<VT>(validator))
{
using value_t = std::decay_t<traits::adc_retval_t<GT>>;
initWrappers<value_t>(std::forward<SRT>(serializer), std::forward<DSRT>(deserializer));
}
virtual ~AdcSerializingValueHolder() = default; virtual ~AdcSerializingValueHolder() = default;
}; };