From c84756ce07fd0f5e8cfb46e0b73bb82268b146bc Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Sat, 27 Apr 2024 00:39:58 +0300 Subject: [PATCH] ... --- common/adc_value.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/common/adc_value.h b/common/adc_value.h index 3ba3e88..ca821cc 100644 --- a/common/adc_value.h +++ b/common/adc_value.h @@ -97,6 +97,8 @@ protected: template inline static std::unordered_map> _setterFunc{}; + std::function _clearFunc; + void init(std::invocable<> auto&& getter, std::invocable&> auto&& setter, std::predicate&> auto&& validator) @@ -123,6 +125,11 @@ protected: throw std::system_error(AdcValueHolderErrorCode::ERROR_VALUE_IS_NOT_VALID); } }; + + _clearFunc = [this]() { + _getterFunc.erase(this); + _setterFunc.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) requires std::invocable && std::predicate { + _clearFunc(); + init(std::forward(getter), std::forward(setter), std::forward(validator)); @@ -286,6 +295,12 @@ public: } }; + _clearFunc = [prev_clear = _clearFunc, this]() { + _getterFunc.erase(this); + _setterFunc.erase(this); + prev_clear(); + }; + return *this; }