#pragma once /* ABSTRACT DEVICE COMPONENTS LIBRARY */ #include #include #include "adc_netmsg.h" namespace adc { namespace traits { template // from https://stackoverflow.com/questions/74383254/concept-that-models-only-the-stdchrono-duration-types concept adc_time_duration_c = requires { [](std::type_identity>) {}(std::type_identity()); }; } // namespace traits /* The class incapsulates network operations */ template class AdcNetService : public ImplT { public: using impl_t = ImplT; using typename ImplT::endpoint_t; using typename ImplT::timeout_t; template AdcNetService(ImplCtorArgTs&&... ctor_args) : impl_t(std::forward(ctor_args)...) { } virtual ~AdcNetService() = default; /* asynchronuos operations */ // start accepting client connections (server side) template auto asyncAccept(const endpoint_t& end_point, const timeout_t& timeout, ArgTs&&... args) { return impl_t::asyncAccept(end_point, timeout, std::forward(args)...); } // open connection (client side) template auto asyncConnect(const endpoint_t& end_point, const timeout_t& timeout, ArgTs&&... args) { return impl_t::asyncConnect(end_point, timeout, std::forward(args)...); } template auto asyncSend(const NetMessageT& msg, const timeout_t& timeout, ArgTs&&... args) { return impl_t::asyncSend(msg, timeout, std::forward(args)...); } template auto asyncReceive(const timeout_t& timeout, ArgTs&&... args) { return impl_t::asyncReceive(timeout, std::forward(args)...); } /* blocking operations (throw exceptions if there is an error) */ template auto connect(const endpoint_t& endpoint, const timeout_t& timeout, ArgTs&&... args) { return impl_t::connect(endpoint, timeout, std::forward(args)...); } template auto send(const NetMessageT& msg, const timeout_t& timeout, ArgTs&&... args) { return impl_t::send(msg, timeout, std::forward(args)...); } template NetMessageT receive(const timeout_t& timeout, ArgTs&&... args) { return impl_t::receive(timeout, std::forward(args)...); } template auto close(ArgTs&&... args) { return impl_t::close(std::forward(args)...); } }; namespace traits { template concept adc_netservice_c = requires { typename T::impl_t; std::derived_from>; }; } // namespace traits } // namespace adc