summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-09-03 17:41:37 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-09-03 17:41:37 +0200
commit3fd0aed1c6efa031c1b457fd953a5128c66ad2f1 (patch)
tree8f8fe8a48addfd0e840d6c04acbac1d617be0f6b
parent63e525a09ac46cb3db7a7680ac4134454f346e40 (diff)
Reworking tmpl_group data_servers
-rw-r--r--modules/remote/c++/transfer_loopback.hpp53
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>