AdcValueHolder class: tests are passed

This commit is contained in:
Timur A. Fatkhullin
2024-03-24 23:48:52 +03:00
parent a963db2900
commit fad61ea1df
2 changed files with 178 additions and 48 deletions

View File

@@ -97,7 +97,6 @@ class AdcValueHolder
{
protected:
template <typename T>
// using arg_t = typename traits::adc_func_traits<T>::ret_t;
using arg_t = typename traits::adc_func_traits<std::remove_reference_t<T>>::ret_t;
std::function<void(std::any&)> _getterWrapper;
@@ -158,7 +157,21 @@ protected:
public:
// default trivial types (just arithmetic ones)
constexpr static std::tuple<char, short, int, long, long long, float, double> _defaultTrivialConvTypes{};
constexpr static std::tuple<bool,
char,
short,
int,
long,
long long,
unsigned char,
unsigned short,
unsigned int,
unsigned long,
unsigned long long,
float,
double,
long double>
_defaultTrivialConvTypes{};
// always-true validator
// constexpr static auto AdcValueHolderDummyValidator = [](const auto&) { return true; };
@@ -172,8 +185,7 @@ public:
AdcValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator =
AdcValueHolder::AdcValueHolderDummyValidator<arg_t<decltype(getter)>>)
std::predicate<const arg_t<decltype(getter)>&> auto&& validator)
: _internalTypeIndex(std::type_index(typeid(arg_t<decltype(getter)>)))
{
init(std::forward<decltype(getter)>(getter), std::forward<decltype(setter)>(setter),
@@ -181,12 +193,20 @@ public:
}
// 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>
AdcValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
const std::tuple<Ts...>& trivialConvTypes,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator =
AdcValueHolder::AdcValueHolderDummyValidator<arg_t<decltype(getter)>>)
std::predicate<const arg_t<decltype(getter)>&> auto&& validator,
const std::tuple<Ts...>& /* tuple-of-trivially-converting-types */)
: AdcValueHolder(std::forward<decltype(getter)>(getter),
std::forward<decltype(setter)>(setter),
std::forward<decltype(validator)>(validator))
@@ -196,6 +216,18 @@ public:
}
template <typename... Ts>
AdcValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
const std::tuple<Ts...>& t /* tuple-of-trivially-converting-types */)
: AdcValueHolder(std::forward<decltype(getter)>(getter),
std::forward<decltype(setter)>(setter),
AdcValueHolder::AdcValueHolderDummyValidator<traits::adc_retval_t<decltype(getter)>>,
t)
{
}
AdcValueHolder(const AdcValueHolder&) = default;
AdcValueHolder(AdcValueHolder&&) = default;
@@ -215,10 +247,10 @@ public:
}
AdcValueHolder& resetValueHolder(
std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator = AdcValueHolderDummyValidator)
AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator =
AdcValueHolder::AdcValueHolderDummyValidator<arg_t<decltype(getter)>>)
{
_convertFromInternal.clear();
_convertToInternal.clear();
@@ -230,12 +262,19 @@ 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>
AdcValueHolder& resetValueHolder(
std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
const std::tuple<Ts...>& trivialConvTypes,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator = AdcValueHolderDummyValidator)
AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
std::predicate<const arg_t<decltype(getter)>&> auto&& validator,
const std::tuple<Ts...>& /* tuple-of-trivially-converting-types */)
{
resetValueHolder(std::forward<decltype(getter)>(getter), std::forward<decltype(setter)>(setter),
std::forward<decltype(validator)>(validator));
@@ -247,11 +286,22 @@ public:
}
template <typename... Ts>
AdcValueHolder& resetValueHolder(std::invocable<> auto&& getter,
std::invocable<const arg_t<decltype(getter)>&> auto&& setter,
const std::tuple<Ts...>& t /* tuple-of-trivially-converting-types */)
{
return resetValueHolder(std::forward<decltype(getter)>(getter), std::forward<decltype(setter)>(setter),
AdcValueHolder::AdcValueHolderDummyValidator<traits::adc_retval_t<decltype(getter)>>,
t);
}
template <typename UT>
AdcValueHolder& addConvertFunc(std::invocable<std::any&> auto&& func_to_internal,
std::invocable<std::any&> auto&& func_from_internal)
{
static_assert(std::is_same_v<UT, void>, "void IS NOT VALID TYPE!!!");
static_assert(!std::is_same_v<UT, void>, "void IS NOT VALID TYPE!!!");
auto t_index = std::type_index(typeid(UT));
@@ -286,9 +336,13 @@ public:
template <typename UT>
operator UT()
{
using v_t = std::remove_reference_t<UT>;
using val_t = std::conditional_t<std::is_array_v<v_t>, std::add_pointer_t<std::remove_extent_t<v_t>>, v_t>;
std::any val;
auto t_index = std::type_index(typeid(UT));
// auto t_index = std::type_index(typeid(UT));
auto t_index = std::type_index(typeid(val_t));
auto it = _convertFromInternal.find(t_index);
if (it == _convertFromInternal.end()) {
@@ -298,15 +352,21 @@ public:
_getterWrapper(val);
it->second(val); // call conversion function
return std::any_cast<UT>(val);
// return std::any_cast<UT>(val);
return std::any_cast<val_t>(val);
}
template <typename UT>
AdcValueHolder& operator=(const UT& value)
AdcValueHolder& operator=(UT&& value)
{
std::any val = std::make_any<UT>(value);
using v_t = std::remove_reference_t<UT>;
using val_t = std::conditional_t<std::is_array_v<v_t>, std::add_pointer_t<std::remove_extent_t<v_t>>, v_t>;
auto t_index = std::type_index(typeid(UT));
// std::any val = std::make_any<UT>(value);
std::any val = std::make_any<val_t>(value);
// auto t_index = std::type_index(typeid(UT));
auto t_index = std::type_index(typeid(val_t));
auto it = _convertToInternal.find(t_index);
if (it == _convertToInternal.end()) {
@@ -358,5 +418,33 @@ protected:
};
/*
factory functions
*/
AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter,
std::invocable<const traits::adc_retval_t<decltype(getter)>&> auto&& setter,
std::predicate<const traits::adc_retval_t<decltype(getter)>&> auto&& validator)
{
using val_t = traits::adc_retval_t<decltype(getter)>;
static_assert(std::predicate<decltype(validator), const traits::adc_retval_t<decltype(getter)>&>,
"INVALID VALIDATOR TYPE!!!");
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),
std::forward<decltype(validator)>(validator), AdcValueHolder::_defaultTrivialConvTypes);
}
AdcValueHolder make_arith_valueholder(std::invocable<> auto&& getter,
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),
AdcValueHolder::AdcValueHolderDummyValidator<traits::adc_retval_t<decltype(getter)>>);
}
} // namespace adc