#pragma once /* ABSTRACT DEVICE COMPONENTS LIBRARY */ #include #include #include "../common/adc_traits.h" /* DEFINITIONS OF NETWORK COMPONENTS INTERFACES */ /* struct NetService { typedef ImplementationDependentT netservice_ident_t; typedef ImplementationDependentT async_ctx_t; typedef ImplementationDependentT endpoint_t; template auto asyncAccept(const endpoint_t&, const async_ctx_t&, const std::chrono::duration&) template auto asyncConnect(const endpoint_t&, const async_ctx_t&, const std::chrono::duration&) template auto asyncSend(const R&, const async_ctx_t&, const std::chrono::duration&) template auto asyncReceived(const async_ctx_t&, const std::chrono::duration&) template auto accept(const endpoint_t&, const async_ctx_t&, const std::chrono::duration&) template auto connect(const endpoint_t&, const async_ctx_t&, const std::chrono::duration&) template auto send(const R&, const std::chrono::duration&) template R received(const std::chrono::duration&) } */ template concept adc_netservice_c = requires(SRVT srv, const SRVT srv_const) { typename SRVT::netservice_ident_t; // netservice_ident_t ident() const { srv_const.ident() } -> std::same_as; typename SRVT::async_ctx_t; typename SRVT::endpoint_t; requires requires { [](SRVT& srv_obj, const typename SRVT::endpoint_t& endpoint, const typename SRVT::async_ctx_t& ctx, const std::chrono::duration& timeout) { srv_obj.asyncAccept(endpoint, ctx, timeout); srv_obj.asyncConnect(endpoint, ctx, timeout); srv_obj.accept(endpoint, timeout); srv_obj.connect(endpoint, timeout); }(srv, typename SRVT::endpoint_t(), typename SRVT::async_ctx_t(), std::chrono::seconds(1)); []( SRVT& srv_obj, const R& msg, const typename SRVT::async_ctx_t& ctx, const std::chrono::duration& timeout) { srv_obj.asyncSend(msg, ctx, timeout); srv_obj.send(msg, timeout); }(srv, std::span(), typename SRVT::async_ctx_t(), std::chrono::seconds(1)); []( SRVT& srv_obj, R& msg, const typename SRVT::async_ctx_t& ctx, const std::chrono::duration& timeout) { srv_obj.asyncReceive(ctx, timeout); msg = srv_obj.receive(timeout); }(srv, std::string(), typename SRVT::async_ctx_t(), std::chrono::seconds(1)); }; }; /* NETWORK SESSION */ template concept adc_netsession_c = std::derived_from> && requires(SESST sess, const SESST sess_const) { typename SESST::netsession_ident_t; // netsession_ident_t ident() const { sess_const.ident() } -> std::same_as; sess.start(); sess.stop(); }; /* NETWORK SESSION-LEVEL PROTOCOL */ template concept adc_netsession_proto_c = requires(SESS_PROTOT proto, const SESS_PROTOT proto_const) { typename SESS_PROTOT::proto_ident_t; // proto_ident_t ident() const (const method) { proto_const.ident() } -> std::same_as; [](const SESS_PROTOT &proto, IT begin, IT end) -> std::tuple { return proto.parse(begin, end); }; // must return a view of R-range! [](SESS_PROTOT obj, const R &r) -> std::ranges::view auto { return obj.from(r); }(proto, std::string()); };