From ef798ddaf2ee9befed1ef1a61693056f3a98bd17 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Mon, 7 Sep 2026 19:01:44 +0300 Subject: [PATCH] ... --- CMakeLists.txt | 2 + examples/device_exam.cpp | 34 ++++++++-------- include/adclib/adclib_device1.h | 70 ++++++++++++++++----------------- include/adclib/adclib_netmsg.h | 20 +++++----- 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c64b2e..fc46377 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,8 @@ project(adclib LANGUAGES CXX DESCRIPTION "Abstract Device Components Library") set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + option(ADCLIB_BUILD_EXAM "Build examples" ON) # ------- dependencies ------- diff --git a/examples/device_exam.cpp b/examples/device_exam.cpp index ba32095..6dc2c50 100644 --- a/examples/device_exam.cpp +++ b/examples/device_exam.cpp @@ -17,7 +17,7 @@ int main() std::println("add arith RW-attr with id='{}' (val={})", id1, i); dev.addArithAttr( id1, [&i]() -> adc_result_t { return i; }, - [&i](int ii) -> adc_error_t { + [&i](int const& ii) -> adc_error_t { i = ii; return AdcDeviceErrorCode::ERROR_OK; }); @@ -32,22 +32,22 @@ int main() std::println("add RO-attr with id='{}' (val={})", id2, d); dev.addAttr(id2, [&d]() -> adc_result_t { return d; }, nullptr); - std::println("add RW-attr with id='{}' (val={})", id3, s); - dev.addAttr( - id3, [&s]() -> adc_result_t { return s; }, - [&s](std::string const& sv) -> adc_error_t { - s = sv; - return {}; - }, - [](std::string const& v) -> adc_result_t { return v.c_str(); }, - [](const char* p) -> adc_result_t { return std::string(p); } - // [&s](adc_result_t const&) -> adc_result_t { return s.c_str(); }, - // [&s](adc_result_t const& p) mutable -> adc_result_t { - // // s = p.value(); - // // return s; - // return std::string(p.value()); - // } - ); + // std::println("add RW-attr with id='{}' (val={})", id3, s); + // dev.addAttr( + // id3, [&s]() -> adc_result_t { return s; }, + // [&s](std::string const& sv) -> adc_error_t { + // s = sv; + // return {}; + // }, + // [](std::string const& v) -> adc_result_t { return v.c_str(); }, + // [](const char* p) -> adc_result_t { return std::string(p); } + // // [&s](adc_result_t const&) -> adc_result_t { return s.c_str(); }, + // // [&s](adc_result_t const& p) mutable -> adc_result_t { + // // // s = p.value(); + // // // return s; + // // return std::string(p.value()); + // // } + // ); std::print("get '{}'-attr value as native int:\t", id1); adc_result_t ri = dev[id1]; diff --git a/include/adclib/adclib_device1.h b/include/adclib/adclib_device1.h index b2fb5a7..55dbb85 100644 --- a/include/adclib/adclib_device1.h +++ b/include/adclib/adclib_device1.h @@ -316,29 +316,24 @@ public: static_assert(std::invocable, "Invalid setter argument type!"); } - using tp_t = std::tuple; + if constexpr (sizeof...(UTs)) { + using tp_t = std::tuple; - [&id, getter_cap = std::forward(getter), setter_cap = std::forward(setter), - this](std::index_sequence) mutable { - return std::apply( - [this](auto&&... args) { addAttr(std::forward(args)...); }, - std::tuple_cat( - std::forward_as_tuple(id, std::forward(getter_cap), - std::forward(setter_cap)), - std::tuple_cat(std::forward_as_tuple( - decltype(_attrGetter)::template trivial_conv_from>, - decltype(_attrGetter)::template trivial_conv_to>)...))); - }(std::make_index_sequence{}); - - // [&id, setter_cap = std::forward(setter), this](std::index_sequence) mutable { - // return std::apply( - // [this](auto&&... args) { addAttr(std::forward(args)...); }, - // std::tuple_cat( - // std::forward_as_tuple(id, std::forward(setter_cap)), - // std::tuple_cat(std::forward_as_tuple( - // decltype(_attrSetter)::template trivial_conv_from>, - // decltype(_attrSetter)::template trivial_conv_to>)...))); - // }(std::make_index_sequence{}); + [&id, getter_cap = std::forward(getter), setter_cap = std::forward(setter), + this](std::index_sequence) mutable { + return std::apply( + [this](auto&&... args) { addAttr(std::forward(args)...); }, + std::tuple_cat( + std::forward_as_tuple(id, std::forward(getter_cap), + std::forward(setter_cap)), + std::tuple_cat(std::forward_as_tuple( + decltype(_attrGetter)::template trivial_conv_from>, + decltype(_attrGetter)::template trivial_conv_to>)...))); + }(std::make_index_sequence{}); + } else { + _attrGetter.push(id, std::forward(getter)); + _attrSetter.push(id, std::forward(setter)); + } } // @@ -386,7 +381,8 @@ public: using from_fn_t = std::decay_t>; using to_fn_t = std::decay_t>; - using u_t = adclib_attr_user_deduced_t; + // using u_t = adclib_attr_user_deduced_t; + using u_t = std::invoke_result_t::value_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>; using to_fn_t = std::decay_t>; - using u_t = adclib_attr_user_deduced_t; + // using u_t = adclib_attr_user_deduced_t; + using u_t = std::invoke_result_t::value_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>; using to_fn_t = std::decay_t>; - using u_t = adclib_attr_user_deduced_t; + // using u_t = adclib_attr_user_deduced_t; + using u_t = std::invoke_result_t::value_type; + // static_assert(requires(v_t v, u_t u) { v = u; }, "Invalid deduced user type!"); @@ -446,17 +446,17 @@ public: }; }; - std::apply( - [this](auto&&... args) { _attrGetter.push(std::forward(args)...); }, - std::tuple_cat(std::forward_as_tuple(id, std::forward(getter_cap)), - std::tuple_cat(std::forward_as_tuple(gt_cnv_from_func.template operator()(tp), - gt_cnv_to_func.template operator()(tp))...))); + std::apply([this](auto&&... args) { _attrGetter.push(std::forward(args)...); }, + std::tuple_cat( + std::forward_as_tuple(id, std::forward(getter_cap)), + std::tuple_cat(std::forward_as_tuple(gt_cnv_from_func.template operator()<2 * Is>(tp), + gt_cnv_to_func.template operator()<2 * Is>(tp))...))); - std::apply( - [this](auto&&... args) { _attrSetter.push(std::forward(args)...); }, - std::tuple_cat(std::forward_as_tuple(id, std::forward(setter_cap)), - std::tuple_cat(std::forward_as_tuple(st_cnv_from_func.template operator()(tp), - st_cnv_to_func.template operator()(tp))...))); + std::apply([this](auto&&... args) { _attrSetter.push(std::forward(args)...); }, + std::tuple_cat( + std::forward_as_tuple(id, std::forward(setter_cap)), + std::tuple_cat(std::forward_as_tuple(st_cnv_from_func.template operator()<2 * Is>(tp), + st_cnv_to_func.template operator()<2 * Is>(tp))...))); }(std::make_index_sequence{}); } diff --git a/include/adclib/adclib_netmsg.h b/include/adclib/adclib_netmsg.h index f41e428..81430c4 100644 --- a/include/adclib/adclib_netmsg.h +++ b/include/adclib/adclib_netmsg.h @@ -75,18 +75,18 @@ public: error_t fromCharRange(snplib::snplib_input_char_range_c auto&& bytes) requires(!std::same_as>) { - auto err = fromCharRange( - std::forward(bytes), - {.keyval_delim = ADCLIB_NETMSG_KEYWORD_PARAM_DELIM, .valseq_delim = ADCLIB_NETMSG_PARAM_PARAM_DELIM}); + // auto err = fromCharRange( + // std::forward(bytes), + // {.keyval_delim = ADCLIB_NETMSG_KEYWORD_PARAM_DELIM, .valseq_delim = ADCLIB_NETMSG_PARAM_PARAM_DELIM}); - if (err) { - return err; - } + // if (err) { + // return err; + // } - if (!std::ranges::contains(ADCLIB_NETMSG_VALID_KEYWORDS, key())) { - this->_isValid = false; - // return an error here!!! - } + // if (!std::ranges::contains(ADCLIB_NETMSG_VALID_KEYWORDS, key())) { + // this->_isValid = false; + // // return an error here!!! + // } return {}; }