From 93ab48db81212dce05a353081472f579fea80aa7 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Tue, 10 Mar 2026 20:50:15 +0300 Subject: [PATCH] Unprotected version of servers storage --- data/src/lib.rs | 10 +------ data/src/unprotected.rs | 63 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 data/src/unprotected.rs diff --git a/data/src/lib.rs b/data/src/lib.rs index c4422dd..429d802 100644 --- a/data/src/lib.rs +++ b/data/src/lib.rs @@ -1,10 +1,2 @@ mod cycled_buffer; - -use std::collections::HashSet; -use bgtu_networks_2_gui_abstract::ServersStorage as ServersGuiCtx; -use bgtu_networks_2_network_abstract::{Address, ServersContext as ServersNetworkCtx}; -use crate::cycled_buffer::CycledBuffer; - -struct ServersStorage { - map: HashSet>)> -} +mod unprotected; \ No newline at end of file diff --git a/data/src/unprotected.rs b/data/src/unprotected.rs new file mode 100644 index 0000000..11ea8fd --- /dev/null +++ b/data/src/unprotected.rs @@ -0,0 +1,63 @@ +use crate::cycled_buffer::CycledBuffer; +use bgtu_networks_2_gui_abstract::ServersStorage as ServersGuiCtx; +use bgtu_networks_2_network_abstract::{Address, ServersContext as ServersNetworkCtx}; +use std::collections::HashMap; +use std::hash::Hash; + +pub struct ServersStorage { + history_capacity: usize, + last_stored_req_id: u64, + map: HashMap>)>, +} + +impl ServersStorage { + fn _get_offset(&self, req_id: u64) -> usize { + return self.last_stored_req_id.wrapping_sub(req_id) as usize; + } +} + +impl ServersNetworkCtx for ServersStorage { + fn start_measuring(&mut self) -> (u64, impl Iterator) { + self.last_stored_req_id = self.last_stored_req_id.wrapping_add(1); + for (_, b) in self.map.values_mut() { + b.push(None); + } + + return (self.last_stored_req_id, self.map.keys().map(|z| z.clone())); + } + + fn report_ping(&mut self, addr: A, id: u64, ping_ms: u128) { + let offset = self._get_offset(id); + if let Some((_, b)) = self.map.get_mut(&addr) { + b[offset] = Some(ping_ms); + } + } + + fn report_error(&mut self, _addr: A, _id: u64) {} +} + +impl ServersGuiCtx for ServersStorage { + type A = A; + + fn add_server(&mut self, addr: Self::A, memo: String) { + if self.map.get(&addr).is_some() { + todo!() + }; + + self.map + .insert(addr, (memo, CycledBuffer::new(self.history_capacity))); + } + + fn remove_server(&mut self, addr: &Self::A) { + self.map.remove(addr); + } + + fn iter_servers( + &self, + ) -> impl Iterator>)> { + return self + .map + .iter() + .map(|(k, v)| (k, v.0.as_str(), v.1.iter().map(|x| *x))); + } +}