summaryrefslogtreecommitdiff
path: root/client/src/render/scene/demand_map.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-24 21:24:06 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-24 21:24:06 +0100
commit1caf7aefcc29602a21fa8a400c897b576be238a8 (patch)
tree02534fcee0d052ee9fa2750e296672db50381ee3 /client/src/render/scene/demand_map.rs
parent006ad7ce6d30d764411dcf8c2527f2c80e722491 (diff)
downloadweareserver-1caf7aefcc29602a21fa8a400c897b576be238a8.tar
weareserver-1caf7aefcc29602a21fa8a400c897b576be238a8.tar.bz2
weareserver-1caf7aefcc29602a21fa8a400c897b576be238a8.tar.zst
move demand map to own file
Diffstat (limited to 'client/src/render/scene/demand_map.rs')
-rw-r--r--client/src/render/scene/demand_map.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/client/src/render/scene/demand_map.rs b/client/src/render/scene/demand_map.rs
new file mode 100644
index 0000000..16fa181
--- /dev/null
+++ b/client/src/render/scene/demand_map.rs
@@ -0,0 +1,75 @@
+/*
+ wearechat - generic multiplayer game with voip
+ Copyright (C) 2025 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+use egui::Widget;
+use std::{
+ collections::{HashMap, HashSet},
+ hash::Hash,
+ sync::RwLock,
+};
+
+pub struct DemandMap<K, V> {
+ inner: RwLock<DemandMapState<K, V>>,
+}
+struct DemandMapState<K, V> {
+ values: HashMap<K, V>,
+ needed: HashSet<K>,
+ size_metric: usize,
+}
+impl<K: Hash + Eq + Clone, V: Clone> DemandMap<K, V> {
+ pub fn new() -> Self {
+ Self {
+ inner: DemandMapState {
+ needed: HashSet::new(),
+ values: HashMap::new(),
+ size_metric: 0,
+ }
+ .into(),
+ }
+ }
+ pub fn needed(&self) -> Vec<K> {
+ self.inner.read().unwrap().needed.iter().cloned().collect()
+ }
+ pub fn insert(&self, key: K, value: V, size: usize) {
+ let mut s = self.inner.write().unwrap();
+ s.needed.remove(&key);
+ s.values.insert(key, value);
+ s.size_metric += size;
+ }
+ pub fn try_get(&self, key: K) -> Option<V> {
+ let mut s = self.inner.write().unwrap();
+ if let Some(k) = s.values.get(&key) {
+ Some(k.to_owned())
+ } else {
+ s.needed.insert(key);
+ None
+ }
+ }
+}
+
+impl<K, V> Widget for &DemandMap<K, V> {
+ fn ui(self, ui: &mut egui::Ui) -> egui::Response {
+ let state = self.inner.read().unwrap();
+ ui.label(state.needed.len().to_string());
+ ui.label(state.values.len().to_string());
+ ui.label(humansize::format_size(
+ state.size_metric,
+ humansize::DECIMAL,
+ ));
+ ui.end_row();
+ ui.response()
+ }
+}