From bc8c6b64ec2faf088c158ee659e67d860fe4d77b Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 1 Oct 2026 00:39:19 +0300 Subject: [PATCH] ... --- include/snipplib/concepts/snplib_concepts.h | 56 +++++++++++++++------ include/snipplib/network/snplib_network.h | 4 +- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/include/snipplib/concepts/snplib_concepts.h b/include/snipplib/concepts/snplib_concepts.h index aa07435..43bbd09 100644 --- a/include/snipplib/concepts/snplib_concepts.h +++ b/include/snipplib/concepts/snplib_concepts.h @@ -198,15 +198,36 @@ concept ret_expected_type_c = requires { // result of asynchronous callable template > -struct has_co_await_operator : std::false_type {}; +struct has_co_await_operator : std::false_type { +}; template -struct has_co_await_operator().operator co_await())>> : std::true_type {}; +struct has_co_await_operator().operator co_await())>> : std::true_type { +}; template constexpr bool has_co_await_operator_v = has_co_await_operator::value; +template +struct deduced_awaitable_ret_type; + +template +struct deduced_awaitable_ret_type { + using type = decltype(std::declval().operator co_await())>().await_resume()); +}; + + +template +struct deduced_awaitable_ret_type { + using type = decltype(std::declval().await_resume()); +}; + + +template +using deduced_awaitable_ret_type_t = typename deduced_awaitable_ret_type>::type; + + template concept result_awaiter_c = requires(T t, std::coroutine_handle<> hndl) { { t.await_ready() } -> std::convertible_to; @@ -229,28 +250,33 @@ concept result_awaitable_c = requires(T t) { // { t.operator co_await() } -> result_awaiter_c; // }; + +template +concept awaitable_c = (!has_co_await_operator_v || requires { + std::declval().operator co_await())>().await_resume(); + }) && (has_co_await_operator_v || requires { std::declval().await_resume(); }); + + + template -concept awaitable_type_c = +concept awaitable_ret_type_c = (!has_co_await_operator_v || std::same_as().operator co_await())>().await_resume()), RT>) && (has_co_await_operator_v || std::same_as().await_resume()), RT>); -static_assert(awaitable_type_c>, "!!!"); +static_assert(awaitable_ret_type_c>, "!!!"); +static_assert(awaitable_c>, "!!!"); + +template +concept awaitable_ret_expected_type_c = awaitable_c && ret_expected_type_c, RT>; + -template -concept async_retval_c = result_awaitable_c().operator co_await())> || requires { - [] -> auto { - T t; - co_await t; - }(); -}; // template // concept async_retval_c = result_awaiter_c().operator co_await()), UT>; -// template -// concept async_retval_c = result_awaitable_c && ret_expected_c; -}; // namespace snplib +template +concept async_retval_c = result_awaitable_c && ret_expected_c; @@ -267,4 +293,4 @@ concept logger_c = requires(T t) { -} // namespace snplib \ No newline at end of file +}; // namespace snplib \ No newline at end of file diff --git a/include/snipplib/network/snplib_network.h b/include/snipplib/network/snplib_network.h index d7c87ff..50d3e1b 100644 --- a/include/snipplib/network/snplib_network.h +++ b/include/snipplib/network/snplib_network.h @@ -71,9 +71,9 @@ concept net_connection_c = requires(T t) { typename T::error_t; // { t.send(std::declval()) } -> async_retval_c; - { t.send(std::declval()) } -> awaitable_type_c; + { t.send(std::declval()) } -> awaitable_ret_type_c; // { t.recv() } -> async_retval_c; - { t.recv() } -> awaitable_type_c; + { t.recv() } -> awaitable_ret_type_c; // [] { // typename T::message_t msg;