summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-07-29 14:53:48 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-07-29 14:53:48 +0200
commit44f6a2ec37e35cf96419885be27afeab9ea84ec5 (patch)
treecbdd97513095ece2c1f23433b8e15196b147e7cc /modules
parent773fffb0c3596c93ae1522f6ef5eaaed4ad54e14 (diff)
wip
Diffstat (limited to 'modules')
-rw-r--r--modules/codec/c++/data.hpp4
-rw-r--r--modules/codec/c++/schema_hash.hpp27
-rw-r--r--modules/core/c++/templates.hpp4
-rw-r--r--modules/remote/c++/remote_loopback.hpp34
-rw-r--r--modules/remote/c++/remote_loopback_base.hpp63
-rw-r--r--modules/remote/c++/transfer.hpp6
-rw-r--r--modules/remote/c++/transfer_loopback.hpp19
7 files changed, 116 insertions, 41 deletions
diff --git a/modules/codec/c++/data.hpp b/modules/codec/c++/data.hpp
index a17f123..8e92622 100644
--- a/modules/codec/c++/data.hpp
+++ b/modules/codec/c++/data.hpp
@@ -21,7 +21,9 @@ struct Default {};
}
namespace encode {
-struct Native {};
+struct Native {
+ static constexpr string_literal name = "encode::Native";
+};
}
template<typename Schema, typename Encode, typename Storage = storage::Default>
class codec;
diff --git a/modules/codec/c++/schema_hash.hpp b/modules/codec/c++/schema_hash.hpp
index 4b537e1..d653bf4 100644
--- a/modules/codec/c++/schema_hash.hpp
+++ b/modules/codec/c++/schema_hash.hpp
@@ -15,7 +15,9 @@ struct hash_literal {
template<typename Schema>
struct schema_hash_seed {
- static_assert(always_false<Schema>, "Not schema_hashable");
+ static constexpr uint32_t apply(uint32_t seed){
+ return hash_literal<Schema::name>::apply(seed);
+ }
};
template<>
@@ -125,6 +127,29 @@ struct schema_hash_seed<schema::Tuple<T...>> {
}
};
+template<typename... T>
+struct schema_hash_seed<tmpl_group<T...>> {
+ template<uint64_t i>
+ static constexpr uint32_t apply_ele(uint32_t seed){
+ using Type = typename parameter_pack_type<i,T...>::type;
+
+ seed = schema_hash_seed<Type>::apply(seed);
+ if constexpr ( (i+1u) < sizeof...(T) ){
+ return apply_ele<i+1u>(seed);
+ }
+
+ return seed;
+ }
+
+ static constexpr uint32_t apply(uint32_t seed){
+ seed = hash_literal<tmpl_group<T...>::name>::apply(seed);
+ if constexpr (sizeof...(T)>0u){
+ seed = apply_ele<0u>(seed);
+ }
+ return seed;
+ }
+};
+
template<typename V, string_literal K>
struct schema_hash_seed<schema::Member<V,K>> {
using Schema = schema::Member<V,K>;
diff --git a/modules/core/c++/templates.hpp b/modules/core/c++/templates.hpp
index 70836ae..9f629da 100644
--- a/modules/core/c++/templates.hpp
+++ b/modules/core/c++/templates.hpp
@@ -9,7 +9,9 @@ namespace saw {
* This type is meant for grouping of template types
*/
template <class... T>
-struct tmpl_group {};
+struct tmpl_group {
+ static constexpr string_literal name = "tmpl_group";
+};
template<typename T, typename U>
struct tmpl_concat;
diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp
index ea4eb8e..400a076 100644
--- a/modules/remote/c++/remote_loopback.hpp
+++ b/modules/remote/c++/remote_loopback.hpp
@@ -83,38 +83,4 @@ public:
// error_or<id<>>
};
-template<>
-class remote<rmt::Loopback> {
-private:
- std::map<uint64_t, i_data_server<>> registered_data_servers_;
-public:
- /**
- * Resolves an address for the remote
- */
- error_or<own<remote_address<rmt::Loopback>>> parse_address(data<schema::UInt64> id){
- return heap<remote_address<rmt::Loopback>>(id);
- }
-
- /**
- * Connect to a remote
- */
- template<typename Iface, typename Encode, typename Storage>
- conveyor<rpc_client<Iface, Encode, Storage, rmt::Loopback>> connect(const remote_address<rmt::Loopback>& addr);
-
- /**
- * Start listening
- */
- template<typename Iface, typename Encode, typename Storage>
- rpc_server<Iface, Encode, Storage, rmt::Loopback> listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,Storage,rmt::Loopback>::InterfaceT iface){
- return {addr, std::move(iface)};
- }
-
- /**
- * Start data server
- */
- template<typename Encode>
- data_server<Encode> data_listen(const remote_address<rmt::Loopback>& addr){
- return {addr,*this};
- }
-};
}
diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp
index 823c516..660180d 100644
--- a/modules/remote/c++/remote_loopback_base.hpp
+++ b/modules/remote/c++/remote_loopback_base.hpp
@@ -1,7 +1,70 @@
#pragma once
+#include "remote.hpp"
+
+#include <map>
+
namespace saw {
namespace rmt {
struct Loopback {};
}
+
+template<>
+class remote<rmt::Loopback> {
+private:
+ std::map<uint64_t, ptr<i_data_server<rmt::Loopback>>> registered_data_servers_;
+public:
+ /**
+ * Resolves an address for the remote
+ */
+ error_or<own<remote_address<rmt::Loopback>>> parse_address(data<schema::UInt64> id){
+ return heap<remote_address<rmt::Loopback>>(id);
+ }
+
+ /**
+ * Connect to a remote
+ */
+ template<typename Iface, typename Encode, typename Storage>
+ conveyor<rpc_client<Iface, Encode, Storage, rmt::Loopback>> connect(const remote_address<rmt::Loopback>& addr);
+
+ /**
+ * Start listening
+ */
+ template<typename Iface, typename Encode, typename Storage>
+ rpc_server<Iface, Encode, Storage, rmt::Loopback> listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,Storage,rmt::Loopback>::InterfaceT iface){
+ return {addr, std::move(iface)};
+ }
+
+ /**
+ * Start data server
+ */
+ 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()){
+ return make_error<err::already_exists>("Server already bound to this address");
+ }
+ return {addr,*this};
+ }
+
+ /**
+ * Connect to a data server
+ */
+ template<typename Schema, typename Encode>
+ conveyor<data_client<Schema, Encode, rmt::Loopback>> data_connect(const remote_address<rmt::Loopback>& addr){
+
+ }
+
+ /**
+ * Internal function
+ */
+ error_or<void> register_data_server(const remote_address<rmt::Loopback>& addr, i_data_server<rmt::Loopback>& srv){
+
+ auto insert = registered_data_servers_.emplace(std::make_pair(addr.get_address_id(), {srv}));
+ if(insert.second){
+ return make_error<err::already_exists>("Server already bound to this address");
+ }
+
+ }
+};
}
diff --git a/modules/remote/c++/transfer.hpp b/modules/remote/c++/transfer.hpp
index ea61d56..32416de 100644
--- a/modules/remote/c++/transfer.hpp
+++ b/modules/remote/c++/transfer.hpp
@@ -1,10 +1,14 @@
#pragma once
+#include <map>
+
namespace saw {
template<typename Remote>
class i_data_server {
protected:
- virtual ~i_data_server() = default;
+ ~i_data_server() = default;
+public:
+ virtual std::pair<uint32_t,uint32_t> get_class_id() const = 0;
};
template<typename Schema, typename Encoding, typename Remote>
diff --git a/modules/remote/c++/transfer_loopback.hpp b/modules/remote/c++/transfer_loopback.hpp
index 2e01509..d205776 100644
--- a/modules/remote/c++/transfer_loopback.hpp
+++ b/modules/remote/c++/transfer_loopback.hpp
@@ -9,25 +9,38 @@ namespace rmt {
struct Loopback {};
}
+template<>
+class remote<rmt::Loopback>;
+
template<typename... Schema, typename Encoding>
-class data_server<tmpl_group<Schema...>, Encoding, rmt::Loopback> {
+class data_server<tmpl_group<Schema...>, Encoding, rmt::Loopback> final : public i_data_server<rmt::Loopback> {
private:
typename impl::data_server_redux<Encoding, storage::Default, typename tmpl_reduce<tmpl_group<Schema...>>::type>::type values_;
ptr<remote<rmt::Loopback>> remote_;
public:
data_server(remote_address<rmt::Loopback>& addr){
- remote->register_server(addr);
+ remote_().register_server(addr);
}
~data_server(){
- remote->deregister_server(addr);
+ remote_().deregister_server(addr);
}
SAW_FORBID_COPY(data_server);
SAW_FORBID_MOVE(data_server);
/**
+ * Return the schema id
+ */
+ std::pair<uint32_t,uint32_t> get_class_id() const override {
+ uint32_t schema_hash = schema_hash<tmpl_group<Schema...>>::apply();
+ uint32_t encode_hash = schema_hash<Encoding>::apply();
+
+ return std::make_pair(schema_hash, encode_hash);
+ }
+
+ /**
* Get data from client
*/
template<typename Sch>