playit_agent_core/utils/
instance_count.rs

1use std::{collections::HashMap, hash::Hash};
2
3pub struct InstanceCount<K: Eq + Hash> {
4    counters: HashMap<K, usize>,
5}
6
7impl<K: Eq + Hash> Default for InstanceCount<K> {
8    fn default() -> Self {
9        Self { counters: Default::default() }
10    }
11}
12
13impl<K: Eq + Hash + Clone> InstanceCount<K> {
14    pub fn has_instance(&self, key: &K) -> bool {
15        self.counters.contains_key(key)
16    }
17
18    pub fn is_empty(&self) -> bool {
19        self.counters.is_empty()
20    }
21
22    pub fn inc(&mut self, key: &K) -> usize {
23        if let Some(count) = self.counters.get_mut(key) {
24            let value = *count + 1;
25            *count = value;
26            return value;
27        }
28
29        self.counters.insert(key.clone(), 1);
30        1
31    }
32
33    pub fn dec(&mut self, key: &K) -> Option<usize> {
34        let count = self.counters.get_mut(key)?;
35        assert_ne!(*count, 0);
36
37        let value = *count - 1;
38        *count = value;
39
40        if value == 0 {
41            let _ = self.counters.remove(key);
42        }
43
44        Some(value)
45    }
46}