diff --git a/common/adc_value_holder.h b/common/adc_value_holder.h index 8c0c9c0..b30a026 100644 --- a/common/adc_value_holder.h +++ b/common/adc_value_holder.h @@ -96,8 +96,8 @@ inline std::error_code make_error_code(AdcValueHolderErrorCode ec) class AdcValueHolder { protected: - template - using arg_t = typename traits::adc_func_traits>::ret_t; + // template + // using arg_t = typename traits::adc_func_traits>::ret_t; std::function _getterWrapper; std::function _setterWrapper; @@ -108,12 +108,12 @@ protected: std::type_index _internalTypeIndex; void init(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator) + std::invocable&> auto&& setter, + std::predicate&> auto&& validator) { - using value_t = arg_t; + using value_t = traits::adc_retval_t; - // static_assert(std::is_same_v, "THE getter MUST NOT RETURN void TYPE!!!"); + static_assert(!std::is_same_v, "THE getter MUST NOT RETURN void TYPE!!!"); using g_t = decltype(getter); _getterWrapper = [wrapper = traits::adc_pf_wrapper(std::forward(getter))](std::any& val) { @@ -183,42 +183,37 @@ public: /* CONSTRUCTORS AND DESTRUCTOR */ - AdcValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator) - : _internalTypeIndex(std::type_index(typeid(arg_t))) + template , + typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> + AdcValueHolder(GT&& getter, + std::invocable auto&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + requires std::invocable && std::predicate + : _internalTypeIndex(std::type_index(typeid(VALT))) { - init(std::forward(getter), std::forward(setter), + init(std::forward(getter), std::forward(setter), std::forward(validator)); } - // NOTE: due to using of concepts one cannot use of default value for validator callable!!! - AdcValueHolder(std::invocable<> auto&& getter, std::invocable&> auto&& setter) - : AdcValueHolder(std::forward(getter), - std::forward(setter), - AdcValueHolder::AdcValueHolderDummyValidator>) - { - } - - template AdcValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator, + std::invocable&> auto&& setter, + std::predicate&> auto&& validator, const std::tuple& /* tuple-of-trivially-converting-types */) : AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)) { // setup trivially-defined conversion function - AdcValueHolder::setupTrivialConvertFunc, std::tuple>(this); + AdcValueHolder::setupTrivialConvertFunc, std::tuple>(this); } template AdcValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, + std::invocable&> auto&& setter, const std::tuple& t /* tuple-of-trivially-converting-types */) : AdcValueHolder(std::forward(getter), std::forward(setter), @@ -247,10 +242,13 @@ public: } - AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator = - AdcValueHolder::AdcValueHolderDummyValidator>) + template , + typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> + AdcValueHolder& resetValueHolder(GT&& getter, + std::invocable auto&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + requires std::invocable && std::predicate { _convertFromInternal.clear(); _convertToInternal.clear(); @@ -262,25 +260,17 @@ public: } - AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter) - { - return resetValueHolder(std::forward(getter), std::forward(setter), - AdcValueHolder::AdcValueHolderDummyValidator>); - } - - template AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator, + std::invocable&> auto&& setter, + std::predicate&> auto&& validator, const std::tuple& /* tuple-of-trivially-converting-types */) { resetValueHolder(std::forward(getter), std::forward(setter), std::forward(validator)); // setup trivially-defined conversion function - AdcValueHolder::setupTrivialConvertFunc, std::tuple>(this); + AdcValueHolder::setupTrivialConvertFunc, std::tuple>(this); return *this; } @@ -288,7 +278,7 @@ public: template AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, + std::invocable&> auto&& setter, const std::tuple& t /* tuple-of-trivially-converting-types */) { return resetValueHolder(std::forward(getter), std::forward(setter), @@ -423,28 +413,32 @@ protected: */ -AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter, - std::predicate&> auto&& validator) +template , + typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator)> +AdcValueHolder make_arith_valueholder(GT&& getter, + std::invocable auto&& setter, + VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator) + requires std::invocable && std::predicate { - using val_t = traits::adc_retval_t; + using val_t = traits::adc_retval_t; - static_assert(std::predicate&>, - "INVALID VALIDATOR TYPE!!!"); + // static_assert(std::predicate&>, + // "INVALID VALIDATOR TYPE!!!"); static_assert(std::is_arithmetic_v, "GETTER MUST RETURN AN ARITHMETIC TYPE VALUE!!!"); - return AdcValueHolder(std::forward(getter), std::forward(setter), + return AdcValueHolder(std::forward(getter), std::forward(setter), std::forward(validator), AdcValueHolder::_defaultTrivialConvTypes); } -AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter, - std::invocable&> auto&& setter) -{ - return make_arith_valueholder(std::forward(getter), std::forward(setter), - AdcValueHolder::AdcValueHolderDummyValidator>); -} +// AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter, +// std::invocable&> auto&& setter) +// { +// return make_arith_valueholder(std::forward(getter), std::forward(setter), +// AdcValueHolder::AdcValueHolderDummyValidator>); +// } } // namespace adc diff --git a/tests/adc_valueholder_test.cpp b/tests/adc_valueholder_test.cpp index f65034d..24f6f50 100644 --- a/tests/adc_valueholder_test.cpp +++ b/tests/adc_valueholder_test.cpp @@ -18,7 +18,7 @@ TEST_CASE("[ADC VALUEHOLDER]") return true; }; - // adc::AdcValueHolder vh(getter, setter, validator); + adc::AdcValueHolder vht(getter, setter, adc::AdcValueHolder::_defaultTrivialConvTypes); adc::AdcValueHolder vh(getter, setter, validator); auto vah = adc::make_arith_valueholder(getter, setter);