#pragma once #include #include #include "remote_loopback_base.hpp" #include "transfer_loopback.hpp" namespace saw { template class remote_data { private: id id_; public: remote_data(const id& id): id_{id} {} /** * Wait until data arrives */ error_or> wait(wait_scope& wait); /** * Asynchronously wait for a result */ conveyor> on_receive(); }; /** * Client RPC reference structure */ template class rpc_client { /** * request the data from the remote */ template remote_data request_data(id data); /** @todo * Determine type based on Name */ /* template error_or< id< typename schema_member_type::type > > call(data_or_id inp); */ }; 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: ptr> remote_; ptr> addr_; InterfaceT iface_; DataServers dat_srvs_; public: rpc_server(ptr> remote__, remote_address& addr__, InterfaceT iface__, DataServers dat_srvs__): remote_{remote__}, addr_{addr__}, iface_{std::move(iface__)}, dat_srvs_{dat_srvs__} {} template error_or call(id::type::RequestT> id_param, id::type::ResponseT> id_resp){ using Req = typename schema_member_type::type::RequestT; auto req_dat_ptr = std::get>>(dat_srvs_); auto eo_req_param = req_dat_ptr().find(id_param); if(eo_req_param.is_error()){ return std::move(eo_req_param.get_error()); } auto& req_param = eo_req_param.get_value(); auto eo_answer = iface_.template call(req_param()); if(eo_answer.is_error()){ return std::move(eo_answer.get_error()); } auto& answer = eo_answer.get_value(); using Resp = typename schema_member_type::type::ResponseT; auto resp_dat_ptr = std::get>>(dat_srvs_); auto eo_send = resp_dat_ptr().send(std::move(answer), id_resp); if(eo_send.is_error()){ return std::move(eo_send.get_error()); } return make_void(); } }; }