This commit is contained in:
2024-09-11 18:20:57 +03:00
parent 56bf7abcb7
commit 8ae489f1c5
3 changed files with 101 additions and 46 deletions

View File

@@ -14,7 +14,7 @@ ABSTRACT DEVICE COMPONENTS LIBRARY
/* DEFINITIONS OF NETWORK COMPONENTS INTERFACES */
namespace adc::traits
namespace adc::interfaces
{
@@ -92,7 +92,7 @@ template <typename SRVT,
typename RMSGT = std::string, // receiving message type
typename DURT = adc_common_duration_t // time duration type
>
concept adc_netservice_c = adc_input_char_range<SMSGT> && adc_output_char_range<RMSGT> && adc_time_duration_c<DURT> &&
concept adc_netservice_c = traits::adc_input_char_range<SMSGT> && traits::adc_output_char_range<RMSGT> && adc_time_duration_c<DURT> &&
requires(SRVT srv, const SRVT srv_const) {
typename SRVT::netservice_ident_t;
@@ -103,53 +103,27 @@ concept adc_netservice_c = adc_input_char_range<SMSGT> && adc_output_char_range<
typename SRVT::endpoint_t;
// asynchronous (non-blocking) operations
asyncAccept(std::declval<const typename SRVT::endpoint_t&>(),
srv.asyncAccept(std::declval<const typename SRVT::endpoint_t&>(),
std::declval<typename SRVT::async_ctx_t&>(), std::declval<const DURT&>());
asyncConnect(std::declval<const typename SRVT::endpoint_t&>(),
srv.asyncConnect(std::declval<const typename SRVT::endpoint_t&>(),
std::declval<typename SRVT::async_ctx_t&>(), std::declval<const DURT&>());
asyncSend(std::declval<const SMSGT&>(), std::declval<typename SRVT::async_ctx_t&>(),
srv.asyncSend(std::declval<const SMSGT&>(), std::declval<typename SRVT::async_ctx_t&>(),
std::declval<const DURT&>());
asyncReceive(std::declval<typename SRVT::async_ctx_t&>(), std::declval<const DURT&>());
srv.asyncReceive(std::declval<typename SRVT::async_ctx_t&>(), std::declval<const DURT&>());
// synchronous (blocking) operations
accept(std::declval<const typename SRVT::endpoint_t&>(), std::declval<const DURT&>());
srv.accept(std::declval<const typename SRVT::endpoint_t&>(), std::declval<const DURT&>());
connect(std::declval<const typename SRVT::endpoint_t&>(), std::declval<const DURT&>());
srv.connect(std::declval<const typename SRVT::endpoint_t&>(), std::declval<const DURT&>());
send(std::declval<const SMSGT&>(), std::declval<const DURT&>());
srv.send(std::declval<const SMSGT&>(), std::declval<const DURT&>());
{ receive(std::declval<const DURT&>()) } -> std::same_as<RMSGT>;
{ srv.receive(std::declval<const DURT &>()) } -> std::same_as<RMSGT>;
// requires requires {
// [](SRVT& srv_obj, const typename SRVT::endpoint_t& endpoint, const typename
// SRVT::async_ctx_t& ctx,
// const DURT& 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));
// []<adc::traits::adc_input_char_range R>(SRVT& srv_obj, const R& msg, const
// typename SRVT::async_ctx_t& ctx,
// const DURT& timeout) {
// srv_obj.asyncSend(msg, ctx, timeout);
// srv_obj.send(msg, timeout);
// }(srv, std::span<const char>(), typename SRVT::async_ctx_t(),
// std::chrono::seconds(1));
// []<adc::traits::adc_output_char_range R>(SRVT& srv_obj, R& msg, const typename
// SRVT::async_ctx_t& ctx,
// const DURT& timeout) {
// srv_obj.asyncReceive(ctx, timeout);
// msg = srv_obj.receive(timeout);
// }(srv, std::string(), typename SRVT::async_ctx_t(), std::chrono::seconds(1));
// };
srv.shutdown();
};
@@ -171,21 +145,35 @@ concept adc_netsession_c =
/* NETWORK SESSION-LEVEL PROTOCOL */
template <typename SESS_PROTOT>
concept adc_netsession_proto_c = requires(SESS_PROTOT proto, const SESS_PROTOT proto_const) {
template <typename SESS_PROTOT,
typename BUFFT = std::string_view>
concept adc_netsession_proto_c = traits::adc_input_char_range<BUFFT> && 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<typename SESS_PROTOT::proto_ident_t>;
[]<std::input_iterator IT>(const SESS_PROTOT& proto, IT begin, IT end) -> std::tuple<IT, IT, bool> {
return proto.parse(begin, end);
};
// typename SESS_PROTOT::search_result_t;
// search for the first occurence of valid protocol sequence in input user byte sequence
// the method must return std::tuple<begin, end, flag>:
// start - input range iterator of the sequence first byte
// stop - input range iterator of the sequence end ("after-the-last" byte!!!)
// flag - true if valid sequence was found, false - otherwise
{
proto.search(std::declval<const BUFFT&>())
} -> std::same_as<std::tuple<std::ranges::iterator_t<BUFFT>, std::ranges::iterator_t<BUFFT>, bool>>;
// construct netsession protocol representation of input user byte sequence
// the method must return a range of char range views or output char range
{ proto.toProto(std::declval<const BUFFT &>()) } -> traits::adc_range_of_view_or_output_char_range;
// return user byte sequence from input netsession protocol representation
// the method must return a view of char range or output char range
{ proto.fromProto(std::declval<const BUFFT &>()) } -> traits::adc_view_or_output_char_range;
// must return a view of R-range!
[]<std::ranges::range R>(SESS_PROTOT obj, const R& r) -> std::ranges::view auto { return obj.from(r); }(
proto, std::string());
};
} // namespace adc::traits
} // namespace adc::interfaces