This commit is contained in:
Timur A. Fatkhullin 2024-04-27 00:39:58 +03:00
parent ad8e81896a
commit c84756ce07

View File

@ -97,6 +97,8 @@ protected:
template <typename VT>
inline static std::unordered_map<const AdcValueHolder*, std::function<void(const VT&)>> _setterFunc{};
std::function<void()> _clearFunc;
void init(std::invocable<> auto&& getter,
std::invocable<const traits::adc_retval_t<decltype(getter)>&> auto&& setter,
std::predicate<const traits::adc_retval_t<decltype(getter)>&> auto&& validator)
@ -123,6 +125,11 @@ protected:
throw std::system_error(AdcValueHolderErrorCode::ERROR_VALUE_IS_NOT_VALID);
}
};
_clearFunc = [this]() {
_getterFunc<value_t>.erase(this);
_setterFunc<value_t>.erase(this);
};
}
public:
@ -195,7 +202,7 @@ public:
AdcValueHolder(const AdcValueHolder&) = default;
AdcValueHolder(AdcValueHolder&&) = default;
virtual ~AdcValueHolder() = default;
virtual ~AdcValueHolder() { _clearFunc(); };
/* PUBLIC METHODS */
@ -209,6 +216,8 @@ public:
VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator<VALT>)
requires std::invocable<GT> && std::predicate<VT, const VALT&>
{
_clearFunc();
init(std::forward<decltype(getter)>(getter), std::forward<decltype(setter)>(setter),
std::forward<decltype(validator)>(validator));
@ -286,6 +295,12 @@ public:
}
};
_clearFunc = [prev_clear = _clearFunc, this]() {
_getterFunc<user_t>.erase(this);
_setterFunc<user_t>.erase(this);
prev_clear();
};
return *this;
}