AdcGenericNetServer, AdcDeviceNetServer, AdcDeviceNetServer::Session and

AdcDeviceNetServerASIO classes now have template parameter 'IdentT' (type
of identificator)
This commit is contained in:
Timur A. Fatkhullin
2024-11-05 18:02:28 +03:00
parent 1794de6acd
commit 4a20eecc02
6 changed files with 251 additions and 181 deletions

View File

@@ -224,20 +224,13 @@ protected:
/* very generic network server */
template <typename IdentT = std::string>
class AdcGenericNetServer : public AdcPosixGenericDaemon, public AdcNetSessionManager
{
public:
typedef std::string server_ident_t;
typedef IdentT server_ident_t;
template <traits::adc_input_char_range R>
AdcGenericNetServer(const R& id) : _serverIdent()
{
if constexpr (std::is_array_v<std::remove_cvref_t<R>>) {
_serverIdent = id;
} else {
_serverIdent = server_ident_t{id.begin(), id.end()};
}
}
AdcGenericNetServer(const server_ident_t& id) : _serverIdent(id) {}
AdcGenericNetServer(const AdcGenericNetServer&) = delete;
@@ -289,6 +282,7 @@ public:
// It must be assumed that this is asynchronous operation!!!
template <interfaces::adc_netsession_c SessionT, typename... AcceptorCtorArgTs>
void start(SessionT::netsession_ident_t id, SessionT::netsession_ctx_t sess_ctx, AcceptorCtorArgTs&&... ctor_args)
requires traits::adc_hashable_c<typename SessionT::netsession_ident_t>
{
if (!_isListening<SessionT>[this][id]) {
auto acceptor = std::make_shared<typename SessionT::netservice_t::acceptor_t>(
@@ -340,7 +334,7 @@ protected:
// inline static std::unordered_map<const AdcGenericNetServer*, bool> _isListening{};
template <interfaces::adc_netsession_c SessionT>
inline static std::unordered_map<const AdcGenericNetServer*,
std::map<const typename SessionT::netsession_ident_t, bool>>
std::unordered_map<typename SessionT::netsession_ident_t, bool>>
_isListening{};
std::vector<std::function<void(const AdcGenericNetServer*)>> _stopListenFunc;
@@ -367,34 +361,16 @@ protected:
};
template <interfaces::adc_netservice_c NetServiceT>
class AdcAbstractNetServer
namespace interfaces
{
public:
struct ServerEvents {
std::function<void(NetServiceT*)> onOpen;
std::function<void(NetServiceT*, std::error_code)> onClose;
std::function<void(NetServiceT*, std::span<const char>)> onData;
std::function<void(NetServiceT*, std::error_code)> onError;
};
AdcAbstractNetServer(ServerEvents&& events) : _serverEvents(std::move(events)) {}
template <typename... AcceptorCtorArgTs>
void listen(const typename NetServiceT::endpoint_t& endpoint, AcceptorCtorArgTs&&... ctor_args)
{
auto acceptor =
std::make_shared<typename NetServiceT::acceptor_t>(endpoint, std::forward<AcceptorCtorArgTs>(ctor_args)...);
}
void stop() {}
protected:
ServerEvents _serverEvents;
typename NetServiceT::acceptor_t _acceptor;
template <typename T>
concept adc_generic_netserver_c = requires {
typename T::server_ident_t;
requires std::derived_from<T, adc::AdcGenericNetServer<typename T::server_ident_t>>;
};
} // namespace interfaces
} // namespace adc