diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-22 14:24:32 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-10-22 14:24:32 +0200 |
commit | 98cf3372f2ed4e61ccb0acc522549aaa3d18fd59 (patch) | |
tree | 10f876ed648977c6246496801a4525abf123adf1 | |
parent | f2a1a3f56768d9aa03796808206f067daa5e0aa0 (diff) |
Fixing interface deduction type
-rw-r--r-- | modules/codec/c++/schema.hpp | 2 | ||||
-rw-r--r-- | modules/remote/c++/remote.hpp | 23 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback.hpp | 10 | ||||
-rw-r--r-- | modules/remote/c++/remote_loopback_base.hpp | 4 | ||||
-rw-r--r-- | modules/remote/tests/remote_loopback.cpp | 16 |
5 files changed, 40 insertions, 15 deletions
diff --git a/modules/codec/c++/schema.hpp b/modules/codec/c++/schema.hpp index 4bd544b..c2cacd5 100644 --- a/modules/codec/c++/schema.hpp +++ b/modules/codec/c++/schema.hpp @@ -340,7 +340,7 @@ struct schema_func_list_helper { template<typename F0, typename... Funcs> struct schema_func_list_helper<F0,Funcs...> { using Type = typename tmpl_concat< - tmpl_group<typename F0::Request, typename F0::Response>, + tmpl_group<typename F0::ValueType::RequestT, typename F0::ValueType::ResponseT>, typename schema_func_list_helper<Funcs...>::Type >::type; }; diff --git a/modules/remote/c++/remote.hpp b/modules/remote/c++/remote.hpp index 0f508f5..7e846d3 100644 --- a/modules/remote/c++/remote.hpp +++ b/modules/remote/c++/remote.hpp @@ -84,13 +84,32 @@ class rpc_client; namespace impl { template<typename T, typename Encoding, typename Remote> -struct tmpl_group_to_std_data_server_tuple; +struct tmpl_group_to_data_server_ptr_std_tuple; template<typename... T, typename Encoding, typename Remote> -struct tmpl_group_to_std_data_server_ptr_tuple<tmpl_group<T...>, Encoding, Remote> { +struct tmpl_group_to_data_server_ptr_std_tuple<tmpl_group<T...>, Encoding, Remote> { using type = std::tuple<ptr<data_server<T,Encoding,Remote>>...>; }; } +template<typename Remote> +class i_rpc_server { +protected: + virtual ~i_rpc_server() = default; +public: + virtual std::pair<uint32_t,uint32_t> get_class_id() const = 0; + + template<typename To> + error_or<ptr<To>> cast_to(){ + { + auto rhs = get_class_id(); + if(To::class_id.first == rhs.first && To::class_id.second == rhs.second){ + return {ptr<To>{*static_cast<To*>(this)}}; + } + } + + return make_error<err::invalid_state>("Class IDs are not matching."); + } +}; /** * 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 8763b68..c651589 100644 --- a/modules/remote/c++/remote_loopback.hpp +++ b/modules/remote/c++/remote_loopback.hpp @@ -58,19 +58,19 @@ 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; + using DataServers = typename impl::tmpl_group_to_data_server_ptr_std_tuple<TypeGroup, Encode, rmt::Loopback>::type; private: ptr<remote<rmt::Loopback>> remote_; - const ptr<remote_address<rmt::Loopback>> addr_; + ptr<remote_address<rmt::Loopback>> addr_; InterfaceT iface_; DataServers dat_srvs_; public: - rpc_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr__, InterfaceT iface__, DataServers data_srvs__): + rpc_server(ptr<remote<rmt::Loopback>> remote__, remote_address<rmt::Loopback>& addr__, InterfaceT iface__, DataServers dat_srvs__): remote_{remote__}, addr_{addr__}, iface_{std::move(iface__)}, - data_srvs_{data_srvs__} + dat_srvs_{dat_srvs__} {} template<string_literal Lit> @@ -78,7 +78,7 @@ public: id< typename schema_member_type<Lit, Iface>::type::Response > - > call(id<schema_member_type<Lit, Iface>::type::Request> id_param){ + > call(id<typename 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 5664f77..5e5e108 100644 --- a/modules/remote/c++/remote_loopback_base.hpp +++ b/modules/remote/c++/remote_loopback_base.hpp @@ -53,13 +53,13 @@ private: 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){ + 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; + typename rpc_server<Iface,Encoding,rmt::Loopback>::DataServers ret_val; diff --git a/modules/remote/tests/remote_loopback.cpp b/modules/remote/tests/remote_loopback.cpp index 0450c21..d6f1e73 100644 --- a/modules/remote/tests/remote_loopback.cpp +++ b/modules/remote/tests/remote_loopback.cpp @@ -28,16 +28,22 @@ SAW_TEST("Remote Loopback RPC"){ 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_i64_srv = rmt.template data_listen<sch::Int64, encode::Native>(*addr); + SAW_EXPECT(eo_i64_srv.is_value(), std::string{"Couldn't listen: "} + std::string{eo_i64_srv.get_error().get_category()}); + auto& i64_srv = eo_i64_srv.get_value(); - auto eo_rpc_srv = rmt.template listen<sch::TestInterface>(*addr); + auto eo_rpc_srv = rmt.template rpc_listen<sch::TestInterface, encode::Native>(*addr, { + [](data<sch::UInt32, encode::Native> input) -> error_or<data<sch::Int64, encode::Native>> { + data<sch::Int64, encode::Native> rv; + rv.set(input.get() * 2); + return rv; + } + }); 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}; + id<sch::Int64> id64{0u}; } |