From e13f6a5e91ffeac86c32ab3a9048b810b1931061 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Mon, 12 Aug 2024 13:42:48 +0200 Subject: wip --- modules/remote/c++/remote_loopback_base.hpp | 66 +++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 9 deletions(-) (limited to 'modules/remote/c++/remote_loopback_base.hpp') diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp index 9b66fa8..87d4393 100644 --- a/modules/remote/c++/remote_loopback_base.hpp +++ b/modules/remote/c++/remote_loopback_base.hpp @@ -4,18 +4,42 @@ #include +#include + namespace saw { namespace rmt { struct Loopback {}; } +template<> +class remote_address { +private: + data addr_id_; +public: + remote_address(data addr_id__): + addr_id_{addr_id__} + {} + + const data& get_address_id() const { + return addr_id_; + } +}; + template<> class remote { private: struct key_t { std::array data; - bool operator<(const std::array& rhs) const { + template + static key_t create(const remote_address& addr){ + key_t k; + k.data = std::array{addr.get_address_id().get(), schema_hash::apply(), schema_hash::apply()}; + + return k; + } + + bool operator<(const key_t& rhs) const { for(uint64_t i = 0u; i < 3; ++i){ if(data[i] != rhs.data[i]){ return data[i] < rhs.data[i]; @@ -53,11 +77,16 @@ public: */ template error_or>> data_listen(const remote_address& addr){ - auto find = registered_data_servers_.find(addr.get_address_id()); - if(find == registered_data_servers_.end()){ + + auto key_v = key_t::template create(addr); + + auto find = registered_data_servers_.find(key_v); + if(find != registered_data_servers_.end()){ return make_error("Server already bound to this address"); } - return {addr,*this}; + + auto dat_srv = heap>(*this, addr); + return dat_srv; } /** @@ -65,16 +94,22 @@ public: */ template conveyor> data_connect(const remote_address& addr){ - auto class_id = srv.get_class_id(); + constexpr auto class_id = data_server::class_id; key_t key; - key.data = {addr.get_address_id(), class_id.first, class_id.second}; + key.data = std::array{addr.get_address_id().get(), class_id.first, class_id.second}; auto find = registered_data_servers_.find(key); if(find == registered_data_servers_.end()){ return make_error("Server not found"); } + auto eo_dat_srv = find->second().template cast_to>(); + if(eo_dat_srv.is_error()){ + auto& err = eo_dat_srv.get_error(); + return std::move(err); + } + auto dat_srv = eo_dat_srv.get_value(); - + return data_client{dat_srv}; } /** @@ -84,13 +119,26 @@ public: auto class_id = srv.get_class_id(); key_t key; - key.data = {addr.get_address_id(), class_id.first, class_id.second}; - auto insert = registered_data_servers_.emplace(std::make_pair(key, {srv})); + key.data = std::array{addr.get_address_id().get(), class_id.first, class_id.second}; + + auto insert = registered_data_servers_.emplace(std::make_pair(key, ptr>{srv})); if(insert.second){ return make_error("Server already bound to this address"); } return make_void(); } + + error_or deregister_data_server(const remote_address& addr, i_data_server& srv){ + auto class_id = srv.get_class_id(); + key_t key; + key.data = std::array{addr.get_address_id().get(), class_id.first, class_id.second}; + auto erase = registered_data_servers_.erase(key); + if(erase == 0u){ + return make_error("Server not found"); + } + + return make_void(); + } }; } -- cgit v1.2.3