AdcValueHolder class: tests are passed
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user