summaryrefslogtreecommitdiff
path: root/modules/remote/c++/remote_loopback_base.hpp
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-12 13:42:48 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-12 13:42:48 +0200
commite13f6a5e91ffeac86c32ab3a9048b810b1931061 (patch)
tree1eec0e8f5ca6edfd99581f5b175371a21c8f652b /modules/remote/c++/remote_loopback_base.hpp
parentb9a4cf706cf0145c814ef5987dad21ebc4172ac6 (diff)
wip
Diffstat (limited to 'modules/remote/c++/remote_loopback_base.hpp')
-rw-r--r--modules/remote/c++/remote_loopback_base.hpp66
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();
+ }
};
}