This commit is contained in:
2026-09-07 19:01:44 +03:00
parent ed2a5cac45
commit ef798ddaf2
4 changed files with 64 additions and 62 deletions

View File

@@ -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 -------

View File

@@ -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];

View File

@@ -316,29 +316,24 @@ 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!");
} }
using tp_t = std::tuple<UTs...>; if constexpr (sizeof...(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),
this]<size_t... Is>(std::index_sequence<Is...>) mutable { this]<size_t... Is>(std::index_sequence<Is...>) mutable {
return std::apply( return std::apply(
[this](auto&&... args) { addAttr(std::forward<decltype(args)>(args)...); }, [this](auto&&... args) { addAttr(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::forward<decltype(setter_cap)>(setter_cap)), std::forward<decltype(setter_cap)>(setter_cap)),
std::tuple_cat(std::forward_as_tuple( std::tuple_cat(std::forward_as_tuple(
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>{});
} }

View File

@@ -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 {};
} }