#pragma once /* ABSTRACT DEVICE COMPONENTS LIBRARY */ #include #include #include "adc_netmsg.h" namespace adc { template class AdcNetService { protected: ImplT _impl; public: using impl_t = ImplT; using typename ImplT::endpoint_t; using timeout_clock_t = std::chrono::steady_clock; using timeout_drtn_t = timeout_clock_t::duration; static constexpr timeout_drtn_t defaultConnectTimeout = std::chrono::seconds(5); // static constexpr std::chrono::duration defaultConnectTimeout = std::chrono::seconds(5); static constexpr timeout_drtn_t defaultSendTimeout = std::chrono::seconds(5); static constexpr timeout_drtn_t defaultRecvTimeout = std::chrono::seconds(5); template AdcNetService(ImplCtorArgTs&&... ctor_args) : _impl(std::forward(ctor_args)...) { } virtual ~AdcNetService() = default; /* asynchronuos operations */ // open connection template auto asyncConnect(const endpoint_t& end_point, const timeout_drtn_t& timeout = defaultConnectTimeout, ArgTs&&... args) { return _impl.asyncConnect(end_point, timeout, std::forward(args)...); } template auto asyncSend(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { return _impl.asyncSend(msg, timeout, std::forward(args)...); } template auto asyncReceive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { return _impl.asyncReceive(timeout, std::forward(args)...); } /* blocking operations */ template auto connect(const endpoint_t& endpoint, const timeout_drtn_t& timeout = defaultConnectTimeout, ArgTs&&... args) { return _impl.connect(endpoint, timeout, std::forward(args)...); } template auto send(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { return _impl.send(msg, timeout, std::forward(args)...); } template NetMessageT receive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { return _impl.receive(timeout, std::forward(args)...); } template auto close(ArgTs&&... args) { return _impl.close(std::forward(args)...); } }; namespace traits { template concept adc_netservice_c = requires { typename T::impl_t; std::derived_from>; }; } // namespace traits } // namespace adc