rewrite constructord and resetValueHolder methods to use default

validator
This commit is contained in:
Timur A. Fatkhullin 2024-04-07 01:10:53 +03:00
parent fad61ea1df
commit 01d1685199
2 changed files with 48 additions and 54 deletions

View File

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

View File

@ -18,7 +18,7 @@ TEST_CASE("[ADC VALUEHOLDER]")
return true; return true;
}; };
// adc::AdcValueHolder vh(getter, setter, validator); adc::AdcValueHolder vht(getter, setter, adc::AdcValueHolder::_defaultTrivialConvTypes);
adc::AdcValueHolder vh(getter, setter, validator); adc::AdcValueHolder vh(getter, setter, validator);
auto vah = adc::make_arith_valueholder(getter, setter); auto vah = adc::make_arith_valueholder(getter, setter);