#pragma once /* ABSTRACT DEVICE COMPONENTS LIBRARY */ #include #include #include namespace adc { template class AdcNetServiceAbstractImplementation; template class AdcNetService { protected: std::unique_ptr _implUptr; public: 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 timeout_drtn_t defaultSendTimeout = std::chrono::seconds(5); static constexpr timeout_drtn_t defaultRecvTimeout = std::chrono::seconds(5); AdcNetService(ImplT* impl) : _implUptr(impl) {} AdcNetService(std::unique_ptr impl) : _implUptr(std::move(impl)) {} virtual ~AdcNetService() = default; /* asynchronuos operations */ // open connection template auto asyncConnect(const endpoint_t& end_point, const timeout_drtn_t& timeout = defaultConnectTimeout, ArgTs&&... args) { return _implUptr->asyncConnect(end_point, timeout, std::forward(args)...); } template auto asyncSend(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { return _implUptr->asyncSend(msg, timeout, std::forward(args)...); } template auto asyncReceive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { return _implUptr->asyncReceive(timeout, std::forward(args)...); } /* blocking operations */ template auto connect(const endpoint_t& endpoint, const timeout_drtn_t& timeout = defaultConnectTimeout, ArgTs&&... args) { return _implUptr->connect(endpoint, timeout, std::forward(args)...); } template auto send(const NetMessageT& msg, const timeout_drtn_t& timeout = defaultSendTimeout, ArgTs&&... args) { return _implUptr->send(msg, timeout, std::forward(args)...); } template NetMessageT receive(const timeout_drtn_t& timeout = defaultRecvTimeout, ArgTs&&... args) { return _implUptr->receive(timeout, std::forward(args)...); } template auto close(ArgTs&&... args) { return _implUptr->close(std::forward(args)...); } }; } // namespace adc