diff options
-rw-r--r-- | modules/remote/c++/transfer_loopback.hpp | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/modules/remote/c++/transfer_loopback.hpp b/modules/remote/c++/transfer_loopback.hpp index bc23498..1a06287 100644 --- a/modules/remote/c++/transfer_loopback.hpp +++ b/modules/remote/c++/transfer_loopback.hpp @@ -45,7 +45,7 @@ public: error_or<void> send(const data<Schema, Encoding>& dat, id<Schema> store_id){ try { - auto insert_res = values_.emplace(std::make_pair(store_id.get_value(), std::move(dat))); + auto insert_res = values_.emplace(std::make_pair(store_id.get_value(), dat)); if(!insert_res.second){ return make_error<err::already_exists>(); } @@ -100,20 +100,48 @@ public: }; template<typename... Schema, typename Encoding> -class data_server<tmpl_group<Schema...>, Encoding, rmt::Loopback> final : public i_data_server<rmt::Loopback> { +class data_server<tmpl_group<Schema...>, Encoding, rmt::Loopback> final { private: - typename impl::data_server_redux<Encoding, typename tmpl_reduce<tmpl_group<Schema...>>::type>::type values_; - ptr<remote<rmt::Loopback>> remote_; remote_address<rmt::Loopback> rmt_address_; + std::tuple<data_server<Schema,Encoding,rmt::Loopback>...> values_; + + struct inner_register_helper { + template<uint64_t i, typename Func> + static error_or<uint64_t> reg_i(ptr<remote<rmt::Loopback>> rmt, ref<remote_address<rmt::Loopback>> addr, ref<std::tuple<data_server<Schema,Encoding,rmt::Loopback>...>> vals){ + + { + auto eov = rmt().register_data_server(addr,std::get<i>(vals)); + if(eov.is_error()){ + return i; + } + } + + if constexpr ( (i+1u) < sizeof...(Schema) ){ + return reg_i<i+1u>(rmt, addr, vals); + } + // This only happens if we reached the last element + return i+1u; + } + + static error_or<uint64_t> reg(ptr<remote<rmt::Loopback>> rmt, ref<remote_address<rmt::Loopback>> addr, + ref<std::tuple<data_server<Schema,Encoding,rmt::Loopback>...>> vals){ + if ( 0u < sizeof...(Schema) ){ + return reg_i<0u>(rmt,addr,vals); + } + return 1u; + } + + static error_or<uint64_t> dereg(ptr<remote<rmt::Loopback>> rmt, ref<remote_address<rmt::Loopback>> addr, ref<std::tuple<data_server<Schema,Encoding,rmt::Loopback>...>> vals){ + return 1u; + } + }; public: - static constexpr std::pair<uint64_t,uint64_t> class_id{schema_hash<tmpl_group<Schema...>>::apply(), schema_hash<Encoding>::apply()}; - - data_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr): + data_server(ptr<remote<rmt::Loopback>> remote__, const remote_address<rmt::Loopback>& addr, std::tuple<data_server<Schema,Encoding>...>&& values__): remote_{remote__}, - rmt_address_{addr} + rmt_address_{addr}, + values_{std::move(values__)} { - remote_().register_data_server(addr,*this); } ~data_server(){ @@ -124,13 +152,6 @@ public: SAW_FORBID_MOVE(data_server); /** - * Return the schema id - */ - std::pair<uint32_t,uint32_t> get_class_id() const override { - return class_id; - } - - /** * Get data from client */ template<typename Sch> |