From a7bbc6ff8c63e0eea8710889d93281a2458fd7bf Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Wed, 1 Jul 2026 18:26:09 +0300 Subject: [PATCH] ... --- include/snipplib/network/snplib_network.h | 89 ++++++++++++----------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/include/snipplib/network/snplib_network.h b/include/snipplib/network/snplib_network.h index 00cbc25..cd68793 100644 --- a/include/snipplib/network/snplib_network.h +++ b/include/snipplib/network/snplib_network.h @@ -2,7 +2,6 @@ #include #include "../concepts/snplib_concepts.h" -#include "../containers/snplib_hvec.h" namespace snplib { @@ -23,6 +22,21 @@ concept snplib_net_endpoint_c = requires(T t, const T t_const) { }; + +template +concept snplib_net_message_c = requires(T t) { + { t.toBytes() } -> snplib_output_char_range_c; + + // can be constructed from contiguous byte range + requires( + requires { + { T::fromBytes(std::declval>()) } -> std::same_as; + } || + requires { + { T::fromBytes(std::declval>()) } -> std::same_as; + }); +}; + template concept snplib_net_connection_c = requires(T t) { // static constexpr member @@ -46,7 +60,8 @@ concept snplib_net_session_c = std::derived_from; - { t.startSession(std::declval()) } -> snplib_async_retval_c; + // { t.startSession(std::declval()) } -> snplib_async_retval_c; + t.startSession(std::declval()); t.stopSession(); }; @@ -58,73 +73,67 @@ concept snplib_net_listener_c = requires(T t) { std::formattable; []() { [[maybe_unused]] static constexpr auto val = T::id; }(); - snplib_net_session_c; + snplib_net_connection_c; - { t.accept() } -> snplib_async_retval_c; + { t.accept() } -> snplib_async_retval_c; - // { t.accept() } -> snplib_expected_c; // must return std::expected + { t.startListen() } -> snplib_error_c; - // snplib_net_session_c::value_type>; - - { t.start() } -> snplib_error_c; - - t.stop(); + t.stopListen(); }; -struct snplib_netserver_iface_t { - virtual ~snplib_netserver_iface_t() = default; - - template SelfT, snplib_net_listener_c LT> - auto start(this SelfT&& self, LT&& listener) - { - return std::forward(self).start(std::forward(listener)); - } - -protected: - snplib_netserver_iface_t() = default; -}; - template -concept snplib_netserver_c = std::derived_from && requires(T t) { +concept snplib_netserver_c = requires(T t) { // static constexpr member std::formattable; []() { [[maybe_unused]] static constexpr auto val = T::id; }(); // start/stop all listeners - { t.start() } -> snplib_error_c; + t.startServer(); - { t.stop() } -> snplib_error_c; + t.stopServer(); - { t.disconnectClients() } -> snplib_error_c; + t.disconnectClients(); + // { t.startServer() } -> snplib_error_c; + + // { t.stopServer() } -> snplib_error_c; + + // { t.disconnectClients() } -> snplib_error_c; }; /* SINGLE-PROTO*/ -template +template + requires std::same_as class snplib_generic_netserver_t { public: - typedef std::error_code error_t; - - using session_t = typename ListenerT::session_t; + // typedef std::error_code error_t; snplib_generic_netserver_t(std::unique_ptr listener) : _listener(std::move(listener)) {} - error_t start() + auto startServer() { auto err = _listener->start(); if (err) { - return snplib_deduced_error(err, std::make_error_code(std::errc::io_error)); + co_return std::unexpect(snplib_deduced_error(err, std::make_error_code(std::errc::io_error))); } - startListen(); + while (true) { + auto connection = co_await _listener->accept(); + if (connection) { + auto sptr = std::make_shared(); + _sessions.insert(sptr); + sptr->start(std::move(connection.value())); + } + } } - error_t stop() + error_t stopServer() { _listener->stop(); @@ -133,15 +142,7 @@ public: protected: std::unique_ptr _listener{}; - std::set> _sessions{}; - - void startListen() - { - auto sess = co_await _listener->accept(); - if (sess) { - _sessions.insert(sess); - } - } + std::set> _sessions{}; };