From f2a1a3f56768d9aa03796808206f067daa5e0aa0 Mon Sep 17 00:00:00 2001 From: Claudius 'keldu' Holeksa Date: Mon, 21 Oct 2024 17:52:46 +0200 Subject: Working towards proper rpc reference example --- modules/core/c++/templates.hpp | 9 +++++++++ modules/remote/c++/remote.hpp | 10 ++++++++++ modules/remote/c++/remote_loopback.hpp | 27 ++++++++++++++++++++------- modules/remote/c++/remote_loopback_base.hpp | 20 ++++++++++++++++++-- modules/remote/tests/remote_loopback.cpp | 29 +++++++++++++++++++++++++++++ 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 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 +struct tmpl_group_pack_type; + +template +struct tmpl_group_pack_type> { + using type = typename parameter_pack_type::type; +}; + template 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 class rpc_client; +namespace impl { +template +struct tmpl_group_to_std_data_server_tuple; + +template +struct tmpl_group_to_std_data_server_ptr_tuple, Encoding, Remote> { + using type = std::tuple>...>; +}; +} + /** * 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 { */ }; - template class rpc_server { public: using InterfaceT = interface; + using TypeGroup = typename schema_iface_type_group::Type; + using DataServers = typename impl::tmpl_group_to_data_server_ptr_std_tuple::type; private: - const remote_address* addr_; + ptr> remote_; + const ptr> addr_; InterfaceT iface_; + DataServers dat_srvs_; + public: - rpc_server(const remote_address& addr__, InterfaceT iface__): - addr_{&addr__}, - iface_{std::move(iface__)} + rpc_server(ptr> remote__, const remote_address& addr__, InterfaceT iface__, DataServers data_srvs__): + remote_{remote__}, + addr_{addr__}, + iface_{std::move(iface__)}, + data_srvs_{data_srvs__} {} - // error_or> - // conveyor<> call + template + error_or< + id< + typename schema_member_type::type::Response + > + > call(id::type::Request> id_param){ + + return make_error(); + } }; } 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>> registered_data_servers_; + std::map>> registered_rpc_servers_; + + template + error_or find_data_servers_ele(typename rpc_server::DataServers>& ret_val){ + + } + + template + error_or::DataServers> find_data_servers(){ + typename rpc_server::DataServers> ret_val; + + + + return ret_val; + } public: /** * Resolves an address for the remote @@ -68,8 +83,9 @@ public: * Start listening */ template - rpc_server rpc_listen(const remote_address& addr, typename rpc_server::InterfaceT iface){ - return {addr, std::move(iface)}; + error_or>> rpc_listen(const remote_address& addr, typename rpc_server::InterfaceT iface){ + + return heap>({*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; + + 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(*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(*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(*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 id32{0u}; + id id64{0u}; + +} + SAW_TEST("Remote Loopback Data"){ using namespace saw; -- cgit v1.2.3