diff --git a/net/adc_net_concepts.h b/net/adc_net_concepts.h index 42b09bc..46c45a8 100644 --- a/net/adc_net_concepts.h +++ b/net/adc_net_concepts.h @@ -11,8 +11,41 @@ ABSTRACT DEVICE COMPONENTS LIBRARY #include "../common/adc_traits.h" -/* DEFINITIONS OF NETWORK CONPONENTS INTERFACES */ +/* 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; @@ -49,3 +82,39 @@ concept adc_netservice_c = requires(SRVT srv, const SRVT srv_const) { }(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()); +};