...
This commit is contained in:
@@ -5,6 +5,8 @@ project(adclib LANGUAGES CXX DESCRIPTION "Abstract Device Components Library")
|
|||||||
set(CMAKE_CXX_STANDARD 23)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
option(ADCLIB_BUILD_EXAM "Build examples" ON)
|
option(ADCLIB_BUILD_EXAM "Build examples" ON)
|
||||||
|
|
||||||
# ------- dependencies -------
|
# ------- dependencies -------
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ int main()
|
|||||||
std::println("add arith RW-attr with id='{}' (val={})", id1, i);
|
std::println("add arith RW-attr with id='{}' (val={})", id1, i);
|
||||||
dev.addArithAttr(
|
dev.addArithAttr(
|
||||||
id1, [&i]() -> adc_result_t<int> { return i; },
|
id1, [&i]() -> adc_result_t<int> { return i; },
|
||||||
[&i](int ii) -> adc_error_t {
|
[&i](int const& ii) -> adc_error_t {
|
||||||
i = ii;
|
i = ii;
|
||||||
return AdcDeviceErrorCode::ERROR_OK;
|
return AdcDeviceErrorCode::ERROR_OK;
|
||||||
});
|
});
|
||||||
@@ -32,22 +32,22 @@ int main()
|
|||||||
std::println("add RO-attr with id='{}' (val={})", id2, d);
|
std::println("add RO-attr with id='{}' (val={})", id2, d);
|
||||||
dev.addAttr(id2, [&d]() -> adc_result_t<double> { return d; }, nullptr);
|
dev.addAttr(id2, [&d]() -> adc_result_t<double> { return d; }, nullptr);
|
||||||
|
|
||||||
std::println("add RW-attr with id='{}' (val={})", id3, s);
|
// std::println("add RW-attr with id='{}' (val={})", id3, s);
|
||||||
dev.addAttr(
|
// dev.addAttr(
|
||||||
id3, [&s]() -> adc_result_t<std::string> { return s; },
|
// id3, [&s]() -> adc_result_t<std::string> { return s; },
|
||||||
[&s](std::string const& sv) -> adc_error_t {
|
// [&s](std::string const& sv) -> adc_error_t {
|
||||||
s = sv;
|
// s = sv;
|
||||||
return {};
|
// return {};
|
||||||
},
|
// },
|
||||||
[](std::string const& v) -> adc_result_t<const char*> { return v.c_str(); },
|
// [](std::string const& v) -> adc_result_t<const char*> { return v.c_str(); },
|
||||||
[](const char* p) -> adc_result_t<std::string> { return std::string(p); }
|
// [](const char* p) -> adc_result_t<std::string> { return std::string(p); }
|
||||||
// [&s](adc_result_t<std::string> const&) -> adc_result_t<const char*> { return s.c_str(); },
|
// // [&s](adc_result_t<std::string> const&) -> adc_result_t<const char*> { return s.c_str(); },
|
||||||
// [&s](adc_result_t<const char*> const& p) mutable -> adc_result_t<std::string> {
|
// // [&s](adc_result_t<const char*> const& p) mutable -> adc_result_t<std::string> {
|
||||||
// // s = p.value();
|
// // // s = p.value();
|
||||||
// // return s;
|
// // // return s;
|
||||||
// return std::string(p.value());
|
// // return std::string(p.value());
|
||||||
// }
|
// // }
|
||||||
);
|
// );
|
||||||
|
|
||||||
std::print("get '{}'-attr value as native int:\t", id1);
|
std::print("get '{}'-attr value as native int:\t", id1);
|
||||||
adc_result_t<int> ri = dev[id1];
|
adc_result_t<int> ri = dev[id1];
|
||||||
|
|||||||
@@ -316,6 +316,7 @@ public:
|
|||||||
static_assert(std::invocable<ST, v_t const&>, "Invalid setter argument type!");
|
static_assert(std::invocable<ST, v_t const&>, "Invalid setter argument type!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if constexpr (sizeof...(UTs)) {
|
||||||
using tp_t = std::tuple<UTs...>;
|
using tp_t = std::tuple<UTs...>;
|
||||||
|
|
||||||
[&id, getter_cap = std::forward<GT>(getter), setter_cap = std::forward<ST>(setter),
|
[&id, getter_cap = std::forward<GT>(getter), setter_cap = std::forward<ST>(setter),
|
||||||
@@ -329,16 +330,10 @@ public:
|
|||||||
decltype(_attrGetter)::template trivial_conv_from<v_t, std::tuple_element_t<Is, tp_t>>,
|
decltype(_attrGetter)::template trivial_conv_from<v_t, std::tuple_element_t<Is, tp_t>>,
|
||||||
decltype(_attrGetter)::template trivial_conv_to<v_t, std::tuple_element_t<Is, tp_t>>)...)));
|
decltype(_attrGetter)::template trivial_conv_to<v_t, std::tuple_element_t<Is, tp_t>>)...)));
|
||||||
}(std::make_index_sequence<sizeof...(UTs)>{});
|
}(std::make_index_sequence<sizeof...(UTs)>{});
|
||||||
|
} else {
|
||||||
// [&id, setter_cap = std::forward<ST>(setter), this]<size_t... Is>(std::index_sequence<Is...>) mutable {
|
_attrGetter.push(id, std::forward<GT>(getter));
|
||||||
// return std::apply(
|
_attrSetter.push(id, std::forward<ST>(setter));
|
||||||
// [this](auto&&... args) { addAttr(std::forward<decltype(args)>(args)...); },
|
}
|
||||||
// std::tuple_cat(
|
|
||||||
// std::forward_as_tuple(id, std::forward<decltype(setter_cap)>(setter_cap)),
|
|
||||||
// std::tuple_cat(std::forward_as_tuple(
|
|
||||||
// decltype(_attrSetter)::template trivial_conv_from<v_t, std::tuple_element_t<Is, tp_t>>,
|
|
||||||
// decltype(_attrSetter)::template trivial_conv_to<v_t, std::tuple_element_t<Is, tp_t>>)...)));
|
|
||||||
// }(std::make_index_sequence<sizeof...(UTs)>{});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -386,7 +381,8 @@ public:
|
|||||||
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
||||||
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
||||||
|
|
||||||
using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
// using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
||||||
|
using u_t = std::invoke_result_t<from_fn_t>::value_type;
|
||||||
|
|
||||||
// static_assert(requires(v_t v, u_t u) { u = v; }, "Invalid deduced user type!");
|
// static_assert(requires(v_t v, u_t u) { u = v; }, "Invalid deduced user type!");
|
||||||
|
|
||||||
@@ -407,7 +403,9 @@ public:
|
|||||||
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
||||||
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
||||||
|
|
||||||
using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
// using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
||||||
|
using u_t = std::invoke_result_t<from_fn_t>::value_type;
|
||||||
|
|
||||||
|
|
||||||
// static_assert(requires(v_t v, u_t u) { v = u; }, "Invalid deduced user type!");
|
// static_assert(requires(v_t v, u_t u) { v = u; }, "Invalid deduced user type!");
|
||||||
|
|
||||||
@@ -429,7 +427,9 @@ public:
|
|||||||
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
using from_fn_t = std::decay_t<std::tuple_element_t<I, TpT>>;
|
||||||
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
using to_fn_t = std::decay_t<std::tuple_element_t<I + 1, TpT>>;
|
||||||
|
|
||||||
using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
// using u_t = adclib_attr_user_deduced_t<v_t, from_fn_t, to_fn_t>;
|
||||||
|
using u_t = std::invoke_result_t<from_fn_t>::value_type;
|
||||||
|
|
||||||
|
|
||||||
// static_assert(requires(v_t v, u_t u) { v = u; }, "Invalid deduced user type!");
|
// static_assert(requires(v_t v, u_t u) { v = u; }, "Invalid deduced user type!");
|
||||||
|
|
||||||
@@ -446,17 +446,17 @@ public:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
std::apply(
|
std::apply([this](auto&&... args) { _attrGetter.push(std::forward<decltype(args)>(args)...); },
|
||||||
[this](auto&&... args) { _attrGetter.push(std::forward<decltype(args)>(args)...); },
|
std::tuple_cat(
|
||||||
std::tuple_cat(std::forward_as_tuple(id, std::forward<decltype(getter_cap)>(getter_cap)),
|
std::forward_as_tuple(id, std::forward<decltype(getter_cap)>(getter_cap)),
|
||||||
std::tuple_cat(std::forward_as_tuple(gt_cnv_from_func.template operator()<Is>(tp),
|
std::tuple_cat(std::forward_as_tuple(gt_cnv_from_func.template operator()<2 * Is>(tp),
|
||||||
gt_cnv_to_func.template operator()<Is>(tp))...)));
|
gt_cnv_to_func.template operator()<2 * Is>(tp))...)));
|
||||||
|
|
||||||
std::apply(
|
std::apply([this](auto&&... args) { _attrSetter.push(std::forward<decltype(args)>(args)...); },
|
||||||
[this](auto&&... args) { _attrSetter.push(std::forward<decltype(args)>(args)...); },
|
std::tuple_cat(
|
||||||
std::tuple_cat(std::forward_as_tuple(id, std::forward<decltype(setter_cap)>(setter_cap)),
|
std::forward_as_tuple(id, std::forward<decltype(setter_cap)>(setter_cap)),
|
||||||
std::tuple_cat(std::forward_as_tuple(st_cnv_from_func.template operator()<Is>(tp),
|
std::tuple_cat(std::forward_as_tuple(st_cnv_from_func.template operator()<2 * Is>(tp),
|
||||||
st_cnv_to_func.template operator()<Is>(tp))...)));
|
st_cnv_to_func.template operator()<2 * Is>(tp))...)));
|
||||||
}(std::make_index_sequence<NFUNCS / 2>{});
|
}(std::make_index_sequence<NFUNCS / 2>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,18 +75,18 @@ public:
|
|||||||
error_t fromCharRange(snplib::snplib_input_char_range_c auto&& bytes)
|
error_t fromCharRange(snplib::snplib_input_char_range_c auto&& bytes)
|
||||||
requires(!std::same_as<CharRangeT, std::remove_cvref_t<decltype(bytes)>>)
|
requires(!std::same_as<CharRangeT, std::remove_cvref_t<decltype(bytes)>>)
|
||||||
{
|
{
|
||||||
auto err = fromCharRange(
|
// auto err = fromCharRange(
|
||||||
std::forward<decltype(bytes)>(bytes),
|
// std::forward<decltype(bytes)>(bytes),
|
||||||
{.keyval_delim = ADCLIB_NETMSG_KEYWORD_PARAM_DELIM, .valseq_delim = ADCLIB_NETMSG_PARAM_PARAM_DELIM});
|
// {.keyval_delim = ADCLIB_NETMSG_KEYWORD_PARAM_DELIM, .valseq_delim = ADCLIB_NETMSG_PARAM_PARAM_DELIM});
|
||||||
|
|
||||||
if (err) {
|
// if (err) {
|
||||||
return err;
|
// return err;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (!std::ranges::contains(ADCLIB_NETMSG_VALID_KEYWORDS, key())) {
|
// if (!std::ranges::contains(ADCLIB_NETMSG_VALID_KEYWORDS, key())) {
|
||||||
this->_isValid = false;
|
// this->_isValid = false;
|
||||||
// return an error here!!!
|
// // return an error here!!!
|
||||||
}
|
// }
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user