playit_agent_core/utils/
instance_count.rs1use 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}