From b9a4cf706cf0145c814ef5987dad21ebc4172ac6 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Sun, 11 Aug 2024 16:07:52 +0200 Subject: wip --- modules/remote/c++/remote_loopback.hpp | 2 ++ modules/remote/c++/remote_loopback_base.hpp | 30 +++++++++++++++++++-- modules/remote/c++/transfer_loopback.hpp | 41 ++++++++++++++++++++++++++++- 3 files changed, 70 insertions(+), 3 deletions(-) (limited to 'modules/remote/c++') diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp index 400a076..17f1bfe 100644 --- a/modules/remote/c++/remote_loopback.hpp +++ b/modules/remote/c++/remote_loopback.hpp @@ -81,6 +81,8 @@ public: {} // error_or> + conveyor< + > call }; } diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp index 660180d..9b66fa8 100644 --- a/modules/remote/c++/remote_loopback_base.hpp +++ b/modules/remote/c++/remote_loopback_base.hpp @@ -12,7 +12,20 @@ struct Loopback {}; template<> class remote { private: - std::map>> registered_data_servers_; + struct key_t { + std::array data; + + bool operator<(const std::array& rhs) const { + for(uint64_t i = 0u; i < 3; ++i){ + if(data[i] != rhs.data[i]){ + return data[i] < rhs.data[i]; + } + } + return false; + } + }; + + std::map>> registered_data_servers_; public: /** * Resolves an address for the remote @@ -52,6 +65,15 @@ public: */ template conveyor> data_connect(const remote_address& addr){ + auto class_id = srv.get_class_id(); + key_t key; + key.data = {addr.get_address_id(), 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"); + } + } @@ -60,11 +82,15 @@ public: */ error_or register_data_server(const remote_address& addr, i_data_server& srv){ - auto insert = registered_data_servers_.emplace(std::make_pair(addr.get_address_id(), {srv})); + 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})); if(insert.second){ return make_error("Server already bound to this address"); } + return make_void(); } }; } diff --git a/modules/remote/c++/transfer_loopback.hpp b/modules/remote/c++/transfer_loopback.hpp index d205776..55a43fa 100644 --- a/modules/remote/c++/transfer_loopback.hpp +++ b/modules/remote/c++/transfer_loopback.hpp @@ -12,14 +12,53 @@ struct Loopback {}; template<> class remote; +template +class data_server final : public i_data_server { +private: + //typename + using type = std::unordered_map>; + type values_; + + ptr> remote_; + remote_address rmt_address_; +public: + data_server(ptr> remote__, const remote_address& addr): + remote_{remote__}, + rmt_address_{addr} + { + remote_().register_server(addr); + } + + ~data_server(){ + remote_().deregister_server(addr); + } + + SAW_FORBID_COPY(data_server); + SAW_FORBID_MOVE(data_server); + + /** + * Return the schema id + */ + std::pair get_class_id() const override { + uint32_t schema_hash = schema_hash::apply(); + uint32_t encode_hash = schema_hash::apply(); + + return std::make_pair(schema_hash, encode_hash); + } +}; + template class data_server, Encoding, rmt::Loopback> final : public i_data_server { private: typename impl::data_server_redux>::type>::type values_; ptr> remote_; + remote_address rmt_address_; public: - data_server(remote_address& addr){ + data_server(ptr> remote__, const remote_address& addr): + remote_{remote__}, + rmt_address_{addr} + { remote_().register_server(addr); } -- cgit v1.2.3