summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-10-22 14:24:32 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-10-22 14:24:32 +0200
commit98cf3372f2ed4e61ccb0acc522549aaa3d18fd59 (patch)
tree10f876ed648977c6246496801a4525abf123adf1
parentf2a1a3f56768d9aa03796808206f067daa5e0aa0 (diff)
Fixing interface deduction type
-rw-r--r--modules/codec/c++/schema.hpp2
-rw-r--r--modules/remote/c++/remote.hpp23
-rw-r--r--modules/remote/c++/remote_loopback.hpp10
-rw-r--r--modules/remote/c++/remote_loopback_base.hpp4
-rw-r--r--modules/remote/tests/remote_loopback.cpp16
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};
}