summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-10-21 17:52:46 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-10-21 17:52:46 +0200
commitf2a1a3f56768d9aa03796808206f067daa5e0aa0 (patch)
treedfda93c68047a36c89e2a7af2000337c18e5558b
parent545abfe5eb973c83ee38a799add02605c05af26d (diff)
Working towards proper rpc reference example
-rw-r--r--modules/core/c++/templates.hpp9
-rw-r--r--modules/remote/c++/remote.hpp10
-rw-r--r--modules/remote/c++/remote_loopback.hpp27
-rw-r--r--modules/remote/c++/remote_loopback_base.hpp20
-rw-r--r--modules/remote/tests/remote_loopback.cpp29
5 files changed, 86 insertions, 9 deletions
diff --git a/modules/core/c++/templates.hpp b/modules/core/c++/templates.hpp
index fc9d368..921fabb 100644
--- a/modules/core/c++/templates.hpp
+++ b/modules/core/c++/templates.hpp
@@ -11,6 +11,7 @@ namespace saw {
template <class... T>
struct tmpl_group {
static constexpr string_literal name = "tmpl_group";
+ static constexpr uint64_t size = sizeof...(T);
};
/**
@@ -112,6 +113,14 @@ struct parameter_pack_value {
static_assert(i < sizeof...(Values), "Provided index is too large for list");
};
+template<uint64_t I, typename T>
+struct tmpl_group_pack_type;
+
+template<uint64_t I, typename... T>
+struct tmpl_group_pack_type<I, tmpl_group<T...>> {
+ using type = typename parameter_pack_type<I, T...>::type;
+};
+
template<typename T, T... V>
struct ct_multiply;
diff --git a/modules/remote/c++/remote.hpp b/modules/remote/c++/remote.hpp
index 807213e..0f508f5 100644
--- a/modules/remote/c++/remote.hpp
+++ b/modules/remote/c++/remote.hpp
@@ -82,6 +82,16 @@ class remote_data;
template<typename Iface, typename Encoding, typename Remote>
class rpc_client;
+namespace impl {
+template<typename T, typename Encoding, typename Remote>
+struct tmpl_group_to_std_data_server_tuple;
+
+template<typename... T, typename Encoding, typename Remote>
+struct tmpl_group_to_std_data_server_ptr_tuple<tmpl_group<T...>, Encoding, Remote> {
+ using type = std::tuple<ptr<data_server<T,Encoding,Remote>>...>;
+};
+}
+
/**
* Implementation of a remote server on the backend
*/
diff --git a/modules/remote/c++/remote_loopback.hpp b/modules/remote/c++/remote_loopback.hpp
index 308bdc6..8763b68 100644
--- a/modules/remote/c++/remote_loopback.hpp
+++ b/modules/remote/c++/remote_loopback.hpp
@@ -53,22 +53,35 @@ class rpc_client<Iface, Encoding, rmt::Loopback> {
*/
};
-
template<typename Iface, typename Encode>
class rpc_server<Iface, Encode, rmt::Loopback> {
public:
using InterfaceT = interface<Iface, Encode>;
+ using TypeGroup = typename schema_iface_type_group<Iface>::Type;
+ using DataServers = typename impl::tmpl_group_to_data_server_ptr_std_tuple<TypeGroup>::type;
private:
- const remote_address<rmt::Loopback>* addr_;
+ ptr<remote<rmt::Loopback>> remote_;
+ const ptr<remote_address<rmt::Loopback>> addr_;
InterfaceT iface_;
+ DataServers dat_srvs_;
+
public:
- rpc_server(const remote_address<rmt::Loopback>& addr__, InterfaceT iface__):
- addr_{&addr__},
- iface_{std::move(iface__)}
+ rpc_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr__, InterfaceT iface__, DataServers data_srvs__):
+ remote_{remote__},
+ addr_{addr__},
+ iface_{std::move(iface__)},
+ data_srvs_{data_srvs__}
{}
- // error_or<id<>>
- // conveyor<> call
+ template<string_literal Lit>
+ error_or<
+ id<
+ typename schema_member_type<Lit, Iface>::type::Response
+ >
+ > call(id<schema_member_type<Lit, Iface>::type::Request> id_param){
+
+ return make_error<err::not_implemented>();
+ }
};
}
diff --git a/modules/remote/c++/remote_loopback_base.hpp b/modules/remote/c++/remote_loopback_base.hpp
index 6ca244f..5664f77 100644
--- a/modules/remote/c++/remote_loopback_base.hpp
+++ b/modules/remote/c++/remote_loopback_base.hpp
@@ -50,6 +50,21 @@ private:
};
std::map<key_t, ptr<i_data_server<rmt::Loopback>>> registered_data_servers_;
+ std::map<key_t, ptr<i_rpc_server<rmt::Loopback>>> registered_rpc_servers_;
+
+ template<typename Iface, typename Encoding, uint64_t I>
+ error_or<void> find_data_servers_ele(typename rpc_server<Iface,Encoding,rmt::Loopback>::DataServers>& ret_val){
+
+ }
+
+ template<typename Iface, typename Encoding>
+ error_or<typename rpc_server<Iface, Encoding, rmt::Loopback>::DataServers> find_data_servers(){
+ typename rpc_server<Iface,Encoding,rmt::Loopback>::DataServers> ret_val;
+
+
+
+ return ret_val;
+ }
public:
/**
* Resolves an address for the remote
@@ -68,8 +83,9 @@ public:
* Start listening
*/
template<typename Iface, typename Encode>
- rpc_server<Iface, Encode, rmt::Loopback> rpc_listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,rmt::Loopback>::InterfaceT iface){
- return {addr, std::move(iface)};
+ error_or<own<rpc_server<Iface, Encode, rmt::Loopback>>> rpc_listen(const remote_address<rmt::Loopback>& addr, typename rpc_server<Iface,Encode,rmt::Loopback>::InterfaceT iface){
+
+ return heap<rpc_server<Iface,Encode,rmt::Loopback>>({*this}, addr, std::move(iface));
}
/**
diff --git a/modules/remote/tests/remote_loopback.cpp b/modules/remote/tests/remote_loopback.cpp
index 61ff0bc..0450c21 100644
--- a/modules/remote/tests/remote_loopback.cpp
+++ b/modules/remote/tests/remote_loopback.cpp
@@ -12,6 +12,35 @@ using TestInterface = Interface<
}
+SAW_TEST("Remote Loopback RPC"){
+ using namespace saw;
+
+ event_loop loop;
+ wait_scope wait{loop};
+
+ remote<rmt::Loopback> rmt;
+
+ auto eov = rmt.parse_address(0u);
+ SAW_EXPECT(eov.is_value(), "Didn't parse correctly");
+ auto& addr = eov.get_value();
+
+ auto eo_u32_srv = rmt.template data_listen<sch::UInt32, encode::Native>(*addr);
+ SAW_EXPECT(eo_u32_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_u32_srv.get_error().get_category()});
+ auto& u32_srv = eo_u32_srv.get_value();
+
+ auto eo_u64_srv = rmt.template data_listen<sch::UInt64, encode::Native>(*addr);
+ SAW_EXPECT(eo_u64_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_u64_srv.get_error().get_category()});
+ auto& u64_srv = eo_u64_srv.get_value();
+
+ auto eo_rpc_srv = rmt.template listen<sch::TestInterface>(*addr);
+ SAW_EXPECT(eo_rpc_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_rpc_srv.get_error().get_category()});
+ auto& rpc_srv = eo_rpc_srv.get_value();
+
+ id<sch::UInt32> id32{0u};
+ id<sch::UInt64> id64{0u};
+
+}
+
SAW_TEST("Remote Loopback Data"){
using namespace saw;