diff --git a/net/adc_net_concepts.h b/net/adc_net_concepts.h index 010ee1d..2028856 100644 --- a/net/adc_net_concepts.h +++ b/net/adc_net_concepts.h @@ -75,13 +75,13 @@ using adc_common_duration_t = adc_duration_common_type_t&) template - R received(const std::chrono::duration&) + R receive(const std::chrono::duration&) } */ template , // sending message type + typename RMSGT = std::vector, // receiving message type typename DURT = adc_common_duration_t // time duration type > concept adc_netservice_c = diff --git a/net/adc_netproto.h b/net/adc_netproto.h index 0af88ba..7d491f0 100644 --- a/net/adc_netproto.h +++ b/net/adc_netproto.h @@ -108,7 +108,7 @@ struct AdcStopSeqSessionProto { template auto fromProto(const R& r) { - auto N = std::distance(r.begin(), r.end()); + size_t N = std::distance(r.begin(), r.end()); if (N < STOP_SEQ_SIZE) { // one must ensure for input range size correctness // return std::span>(); diff --git a/net/asio/adc_netservice_asio.h b/net/asio/adc_netservice_asio.h index b6101cc..160eedf 100644 --- a/net/asio/adc_netservice_asio.h +++ b/net/asio/adc_netservice_asio.h @@ -31,6 +31,7 @@ #include "../../common/adc_traits.h" #include "../adc_net_concepts.h" +#include "../adc_netproto.h" namespace adc::impl @@ -72,33 +73,19 @@ concept adc_asio_special_comp_token = adc_asio_is_future || adc_asio_is_awaitable || std::same_as, asio::deferred_t>; -// template -// static constexpr bool adc_is_asio_special_comp_token = std::is_same_v, asio::use_future_t<>> -// || -// std::is_same_v, asio::deferred_t> || -// std::is_same_v, -// asio::use_awaitable_t<>>; - -struct adc_asio_async_call_ctx_t { -}; - -// template -// concept adc_completion_token_c = traits::adc_is_callable || std::same_as || -// std::same_as || adc_asio_is_future || -// asio::completion_token_for; +// class adc_asio_async_call_ctx_t +// { +// }; -// template +// template // concept adc_completion_token_c = -// std::same_as || asio::completion_token_for; +// std::same_as || +// (traits::adc_is_callable && +// std::conditional_t, +// std::true_type, +// std::bool_constant>>::value); -template -concept adc_completion_token_c = - std::same_as || - (traits::adc_is_callable && - std::conditional_t, - std::true_type, - std::bool_constant>>::value); template ; - struct asio_async_ctx_t { - bool use_future = false; - std::function accept_comp_token; - std::function connect_comp_token; - std::function send_comp_token; - std::function receive_comp_token; - }; + typedef std::function async_accept_callback_t; + typedef std::function async_connect_callback_t; + typedef std::function async_send_callback_t; + typedef std::function async_receive_callback_t; - class contx_t + + // to satisfy 'adc_netservice_c' concept + class async_call_ctx_t { std::function _errc_comp_token; std::function _errc_msg_comp_token; public: - contx_t() = default; + async_call_ctx_t() = default; - contx_t(contx_t&) = default; - contx_t(contx_t&&) = default; - contx_t(const contx_t&) = default; + async_call_ctx_t(async_call_ctx_t&) = default; + async_call_ctx_t(async_call_ctx_t&&) = default; + async_call_ctx_t(const async_call_ctx_t&) = default; template TokenT> - contx_t(TokenT&& token) + async_call_ctx_t(TokenT&& token) { _errc_comp_token = std::forward(token); } template TokenT> - contx_t(TokenT&& token) + async_call_ctx_t(TokenT&& token) { _errc_msg_comp_token = std::forward(token); } template TokenT> - contx_t& operator=(TokenT&& token) + async_call_ctx_t& operator=(TokenT&& token) { _errc_comp_token = std::forward(token); return *this; } template TokenT> - contx_t& operator=(TokenT&& token) + async_call_ctx_t& operator=(TokenT&& token) { _errc_msg_comp_token = std::forward(token); return *this; @@ -185,8 +171,6 @@ public: } }; - // to satisfy 'adc_netservice_c' concept - using async_call_ctx_t = adc_asio_async_call_ctx_t; static constexpr std::chrono::duration DEFAULT_ACCEPT_TIMEOUT = std::chrono::seconds::max(); static constexpr std::chrono::duration DEFAULT_CONNECT_TIMEOUT = std::chrono::seconds(10); @@ -303,7 +287,7 @@ public: template TokenT, + asio::completion_token_for TokenT, traits::adc_time_duration_c TimeoutT = decltype(DEFAULT_SEND_TIMEOUT)> auto asyncSend(const MessageT& msg, TokenT&& token, const TimeoutT& timeout = DEFAULT_SEND_TIMEOUT) { @@ -346,13 +330,13 @@ public: } - template + template auto asyncReceive(TokenT&& token, const TimeoutT& timeout = DEFAULT_RECEIVE_TIMEOUT) { - static_assert(!std::is_same_v, "'async_call_ctx_t'-TYPE MUST NOT BE USED!"); + constexpr auto is_async_ctx_t = std::same_as, async_call_ctx_t>; // check completion token signature and deduce message type - if constexpr (!adc_asio_special_comp_token) { + if constexpr (!adc_asio_special_comp_token && !is_async_ctx_t) { static_assert(traits::adc_func_traits::arity == 2, "INVALID COMPLETION TOKEN SIGNATURE!"); static_assert(std::is_same_v>, std::error_code>, "INVALID COMPLETION TOKEN SIGNATURE!"); @@ -362,7 +346,7 @@ public: } using msg_t = std::conditional_t< - adc_asio_special_comp_token, RMSGT, + adc_asio_special_comp_token || is_async_ctx_t, RMSGT, std::remove_cvref_t::args_t>>>; // auto s_res = std::make_sharedtemplate search), RMSGT>>(); @@ -639,4 +623,10 @@ protected: } }; + +// static_assert(adc::interfaces::adc_netservice_c>>, +// ""); + +static_assert(adc::interfaces::adc_netsession_proto_c>, ""); + } // namespace adc::impl