...
This commit is contained in:
parent
ca46e89536
commit
c21490091d
@ -42,8 +42,8 @@ concept adc_input_char_range = std::ranges::input_range<R>;
|
|||||||
|
|
||||||
|
|
||||||
// deduce returned type of callable
|
// deduce returned type of callable
|
||||||
template <typename T>
|
// template <typename T>
|
||||||
using adc_retval_t = std::invoke_result_t<std::remove_cvref_t<T>>;
|
// using adc_retval_t = std::invoke_result_t<std::remove_cvref_t<T>>;
|
||||||
|
|
||||||
|
|
||||||
// helper classes
|
// helper classes
|
||||||
@ -87,10 +87,16 @@ struct adc_func_traits<R (C::*)(Args...) const> : adc_func_traits_helper_t<R, Ar
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename F>
|
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
|
// deduce type
|
||||||
template <typename T>
|
template <typename T>
|
||||||
using adc_deduced_type =
|
using adc_deduced_type =
|
||||||
|
|||||||
@ -245,8 +245,8 @@ public:
|
|||||||
|
|
||||||
template <typename FromFuncT, typename ToFuncT>
|
template <typename FromFuncT, typename ToFuncT>
|
||||||
AdcValueHolder& addConvertFunc(FromFuncT&& func_from_internal, ToFuncT&& func_to_internal)
|
AdcValueHolder& addConvertFunc(FromFuncT&& func_from_internal, ToFuncT&& func_to_internal)
|
||||||
// requires std::invocable<FromFuncT, std::remove_cvref_t<traits::adc_retval_t<ToFuncT>>> &&
|
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>>>
|
std::invocable<ToFuncT, std::remove_cvref_t<traits::adc_retval_t<FromFuncT>>>
|
||||||
{
|
{
|
||||||
using from_sig_t = typename traits::adc_func_traits<FromFuncT>;
|
using from_sig_t = typename traits::adc_func_traits<FromFuncT>;
|
||||||
using to_sig_t = typename traits::adc_func_traits<ToFuncT>;
|
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)),
|
_getterFunc<user_t>[this] = [wrapper = traits::adc_pf_wrapper(std::forward<FromFuncT>(func_from_internal)),
|
||||||
this]() {
|
this]() {
|
||||||
if (_getterFunc<value_t>[this]) {
|
auto& getter = _getterFunc<value_t>[this];
|
||||||
auto val = _getterFunc<value_t>[this]();
|
if (getter) {
|
||||||
// return std::get<0>(wrapper)(val); // convert from internal type
|
auto val = getter();
|
||||||
return std::get<0>(wrapper)(_getterFunc<value_t>[this]()); // convert from internal type
|
return std::get<0>(wrapper)(val); // convert from internal type
|
||||||
}
|
}
|
||||||
// invalid conversion function signature
|
// invalid conversion function signature
|
||||||
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);
|
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)),
|
_setterFunc<user_t>[this] = [wrapper = traits::adc_pf_wrapper(std::forward<ToFuncT>(func_to_internal)),
|
||||||
this](const user_t& val) {
|
this](const user_t& val) {
|
||||||
value_t value = std::get<0>(wrapper)(val); // convert to internal type
|
value_t value = std::get<0>(wrapper)(val); // convert to internal type
|
||||||
if (_setterFunc<value_t>[this]) {
|
auto& setter = _setterFunc<value_t>[this];
|
||||||
_setterFunc<value_t>[this](value);
|
if (setter) {
|
||||||
|
setter(value);
|
||||||
} else {
|
} else {
|
||||||
// invalid conversion function signature
|
// invalid conversion function signature
|
||||||
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);
|
throw std::system_error(AdcValueHolderErrorCode::ERROR_INTERNAL_TYPE_MISMATCH);
|
||||||
|
|||||||
@ -76,9 +76,8 @@ TEST_CASE("[ADC VALUEHOLDER]")
|
|||||||
// v = sval->c_str();
|
// v = sval->c_str();
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
auto lls = [](const char* v) { return std::string(v); };
|
||||||
vsh.addConvertFunc([&str](const std::string&) { return str.c_str(); },
|
vsh.addConvertFunc([&str](const std::string&) { return str.c_str(); }, lls);
|
||||||
[](const char* v) { return std::string(v); });
|
|
||||||
|
|
||||||
vsh = "NEW VALUE";
|
vsh = "NEW VALUE";
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user