diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-21 17:52:46 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-21 17:52:46 +0200 |
commit | f2a1a3f56768d9aa03796808206f067daa5e0aa0 (patch) | |
tree | dfda93c68047a36c89e2a7af2000337c18e5558b | |
parent | 545abfe5eb973c83ee38a799add02605c05af26d (diff) |
Working towards proper rpc reference example
-rw-r--r-- | modules/core/c++/templates.hpp | 9 | ||||
-rw-r--r-- | modules/remote/c++/remote.hpp | 10 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback.hpp | 27 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback_base.hpp | 20 | ||||
-rw-r--r-- | 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 <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; |