diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-12 13:42:48 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-12 13:42:48 +0200 |
commit | e13f6a5e91ffeac86c32ab3a9048b810b1931061 (patch) | |
tree | 1eec0e8f5ca6edfd99581f5b175371a21c8f652b /modules/remote/c++/remote_loopback_base.hpp | |
parent | b9a4cf706cf0145c814ef5987dad21ebc4172ac6 (diff) |
wip
Diffstat (limited to 'modules/remote/c++/remote_loopback_base.hpp')
-rw-r--r-- | modules/remote/c++/remote_loopback_base.hpp | 66 |
1 files changed, 57 insertions, 9 deletions
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 <map> +#include <forstio/codec/schema_hash.hpp> + namespace saw { namespace rmt { struct Loopback {}; } template<> +class remote_address<rmt::Loopback> { +private: + data<schema::UInt64> addr_id_; +public: + remote_address(data<schema::UInt64> addr_id__): + addr_id_{addr_id__} + {} + + const data<schema::UInt64>& get_address_id() const { + return addr_id_; + } +}; + +template<> class remote<rmt::Loopback> { private: struct key_t { std::array<uint64_t,3> data; - bool operator<(const std::array<uint64_t,3>& rhs) const { + template<typename Schema, typename Encoding> + static key_t create(const remote_address<rmt::Loopback>& addr){ + key_t k; + k.data = std::array<uint64_t,3>{addr.get_address_id().get(), schema_hash<Schema>::apply(), schema_hash<Encoding>::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<typename Schema, typename Encode> error_or<own<data_server<Schema, Encode, rmt::Loopback>>> data_listen(const remote_address<rmt::Loopback>& addr){ - auto find = registered_data_servers_.find(addr.get_address_id()); - if(find == registered_data_servers_.end()){ + + auto key_v = key_t::template create<Schema,Encode>(addr); + + auto find = registered_data_servers_.find(key_v); + if(find != registered_data_servers_.end()){ return make_error<err::already_exists>("Server already bound to this address"); } - return {addr,*this}; + + auto dat_srv = heap<data_server<Schema, Encode, rmt::Loopback>>(*this, addr); + return dat_srv; } /** @@ -65,16 +94,22 @@ public: */ template<typename Schema, typename Encode> conveyor<data_client<Schema, Encode, rmt::Loopback>> data_connect(const remote_address<rmt::Loopback>& addr){ - auto class_id = srv.get_class_id(); + constexpr auto class_id = data_server<Schema, Encode, rmt::Loopback>::class_id; key_t key; - key.data = {addr.get_address_id(), class_id.first, class_id.second}; + key.data = std::array<uint64_t,3>{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<err::not_found>("Server not found"); } + auto eo_dat_srv = find->second().template cast_to<data_server<Schema, Encode, rmt::Loopback>>(); + 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<Schema, Encode, rmt::Loopback>{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<uint64_t,3>{addr.get_address_id().get(), class_id.first, class_id.second}; + + auto insert = registered_data_servers_.emplace(std::make_pair(key, ptr<i_data_server<rmt::Loopback>>{srv})); if(insert.second){ return make_error<err::already_exists>("Server already bound to this address"); } return make_void(); } + + error_or<void> deregister_data_server(const remote_address<rmt::Loopback>& addr, i_data_server<rmt::Loopback>& srv){ + auto class_id = srv.get_class_id(); + key_t key; + key.data = std::array<uint64_t,3>{addr.get_address_id().get(), class_id.first, class_id.second}; + auto erase = registered_data_servers_.erase(key); + if(erase == 0u){ + return make_error<err::not_found>("Server not found"); + } + + return make_void(); + } }; } |