#pragma once #include #include #include namespace saw { namespace rmt { struct File {}; } template<> class remote_address { private: std::filesystem::path path_; public: remote_address(const std::filesystem::path& path__): path_{path__} {} std::string get_path_string() const { return path_.string(); } const std::filesystem::path& get_path() const { return path_; } }; template<> class remote { private: SAW_FORBID_COPY(remote); SAW_FORBID_MOVE(remote); std::map>> registered_data_servers_; public: remote() = default; error_or>> parse_address(const std::string_view& path_v){ return heap>(path_v); } template error_or>> data_listen(ref> addr){ auto insert_res = registered_data_servers_.emplace(std::make_pair(addr().get_path_string(),ptr>{})); if(!insert_res.second){ return make_error(); } auto dat_srv = heap>(*this, addr); insert_res.first->second = ptr>{*dat_srv}; return dat_srv; } template conveyor>> data_connect(ref> addr){ auto path_str = addr().get_path_string(); auto find = registered_data_servers_.find(path_str); if(find == registered_data_servers_.end()){ return {make_error()}; } return {heap>({*this},{find->second})}; } /** * Internal deregister function */ error_or deregister_data_server(const std::string& path){ auto erase_op = registered_data_servers_.erase(path); if(erase_op == 0u){ return make_error(); } return make_void(); } }; namespace rmt { struct FileSystem {}; } template<> class remote_address { private: std::filesystem::path path_; public: remote_address(const std::filesystem::path& path__): path_{path__} {} std::string get_path_string() const { return path_.string(); } const std::filesystem::path& get_path() const { return path_; } }; template<> class remote { private: SAW_FORBID_COPY(remote); SAW_FORBID_MOVE(remote); struct key_t { std::string path; uint32_t sch_crc32; uint32_t enc_crc32; bool operator<(const key_t& rhs) const { if(path != rhs.path){ return path < rhs.path; } if(sch_crc32 != rhs.sch_crc32 ){ return sch_crc32 < rhs.sch_crc32; } if(enc_crc32 != rhs.enc_crc32 ){ return enc_crc32 < rhs.enc_crc32; } return false; } }; std::map>> registered_data_servers_; public: remote() = default; error_or>> parse_address(const std::string_view& path_v){ return heap>(path_v); } template error_or>> data_listen(ref> addr){ key_t k; k.path = addr().get_path_string(); constexpr auto crc_pair = data_server::class_id; k.sch_crc32 = crc_pair.first; k.enc_crc32 = crc_pair.second; auto insert_res = registered_data_servers_.emplace(std::make_pair(std::move(k),ptr>{})); if(!insert_res.second){ return make_error(); } auto dat_srv = heap>(*this, addr); insert_res.first->second = ptr>{*dat_srv}; return dat_srv; } /** * Internal deregister function */ error_or deregister_data_server(const std::string& addr, uint32_t sch_crc32, uint32_t enc_crc32){ key_t k; k.path = addr; k.sch_crc32 = sch_crc32; k.enc_crc32 = enc_crc32; auto erase_op = registered_data_servers_.erase(k); if(erase_op == 0u){ return make_error(); } return make_void(); } }; }