This commit is contained in:
Timur A. Fatkhullin 2024-04-15 01:11:31 +03:00
parent ca46e89536
commit c21490091d
3 changed files with 20 additions and 14 deletions

View File

@ -42,8 +42,8 @@ concept adc_input_char_range = std::ranges::input_range<R>;
// deduce returned type of callable
template <typename T>
using adc_retval_t = std::invoke_result_t<std::remove_cvref_t<T>>;
// template <typename T>
// using adc_retval_t = std::invoke_result_t<std::remove_cvref_t<T>>;
// helper classes
@ -87,10 +87,16 @@ struct adc_func_traits<R (C::*)(Args...) const> : adc_func_traits_helper_t<R, Ar
};
template <typename F>
struct adc_func_traits : adc_func_traits<decltype(&F::operator())> {
struct adc_func_traits : adc_func_traits<decltype(&std::remove_reference_t<F>::operator())> {
};
template <typename T>
using adc_retval_t = typename adc_func_traits<T>::ret_t;
template <typename T>
using adc_func_arg1_t = typename adc_func_traits<T>::arg1_t;
// deduce type
template <typename T>
using adc_deduced_type =

View File

@ -245,8 +245,8 @@ public:
template <typename FromFuncT, typename ToFuncT>
AdcValueHolder& addConvertFunc(FromFuncT&& func_from_internal, ToFuncT&& func_to_internal)
// requires std::invocable<FromFuncT, std::remove_cvref_t<traits::adc_retval_t<ToFuncT>>> &&
// std::invocable<ToFuncT, std::remove_cvref_t<traits::adc_retval_t<FromFuncT>>>
requires std::invocable<FromFuncT, std::remove_cvref_t<traits::adc_retval_t<ToFuncT>>> &&
std::invocable<ToFuncT, std::remove_cvref_t<traits::adc_retval_t<FromFuncT>>>
{
using from_sig_t = typename traits::adc_func_traits<FromFuncT>;
using to_sig_t = typename traits::adc_func_traits<ToFuncT>;
@ -266,10 +266,10 @@ public:
_getterFunc<user_t>[this] = [wrapper = traits::adc_pf_wrapper(std::forward<FromFuncT>(func_from_internal)),
this]() {
if (_getterFunc<value_t>[this]) {
auto val = _getterFunc<value_t>[this]();
// return std::get<0>(wrapper)(val); // convert from internal type
return std::get<0>(wrapper)(_getterFunc<value_t>[this]()); // convert from internal type
auto& getter = _getterFunc<value_t>[this];
if (getter) {
auto val = getter();
return std::get<0>(wrapper)(val); // convert from internal type
}
// invalid conversion function signature
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);
@ -279,8 +279,9 @@ public:
_setterFunc<user_t>[this] = [wrapper = traits::adc_pf_wrapper(std::forward<ToFuncT>(func_to_internal)),
this](const user_t& val) {
value_t value = std::get<0>(wrapper)(val); // convert to internal type
if (_setterFunc<value_t>[this]) {
_setterFunc<value_t>[this](value);
auto& setter = _setterFunc<value_t>[this];
if (setter) {
setter(value);
} else {
// invalid conversion function signature
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);

View File

@ -76,9 +76,8 @@ TEST_CASE("[ADC VALUEHOLDER]")
// v = sval->c_str();
// });
vsh.addConvertFunc([&str](const std::string&) { return str.c_str(); },
[](const char* v) { return std::string(v); });
auto lls = [](const char* v) { return std::string(v); };
vsh.addConvertFunc([&str](const std::string&) { return str.c_str(); }, lls);
vsh = "NEW VALUE";