spacetimedb_table/table_index/
uniquemap.rs1use crate::MemoryUsage;
2use core::{ops::RangeBounds, option::IntoIter};
3use std::collections::btree_map::{BTreeMap, Entry, Range};
4
5#[derive(Debug, PartialEq, Eq, Clone)]
9pub struct UniqueMap<K, V> {
10 map: BTreeMap<K, V>,
12}
13
14impl<K, V> Default for UniqueMap<K, V> {
15 fn default() -> Self {
16 Self { map: BTreeMap::new() }
17 }
18}
19
20impl<K: MemoryUsage, V: MemoryUsage> MemoryUsage for UniqueMap<K, V> {
21 fn heap_usage(&self) -> usize {
22 let Self { map } = self;
23 map.heap_usage()
24 }
25}
26
27impl<K: Ord, V: Ord> UniqueMap<K, V> {
28 pub fn insert(&mut self, key: K, val: V) -> Result<(), &V> {
33 match self.map.entry(key) {
34 Entry::Vacant(e) => {
35 e.insert(val);
36 Ok(())
37 }
38 Entry::Occupied(e) => Err(e.into_mut()),
39 }
40 }
41
42 pub fn delete(&mut self, key: &K) -> bool {
46 self.map.remove(key).is_some()
47 }
48
49 pub fn values_in_range(&self, range: &impl RangeBounds<K>) -> UniqueMapRangeIter<'_, K, V> {
52 UniqueMapRangeIter {
53 iter: self.map.range((range.start_bound(), range.end_bound())),
54 }
55 }
56
57 pub fn values_in_point(&self, key: &K) -> UniqueMapPointIter<'_, V> {
59 let iter = self.map.get(key).into_iter();
60 UniqueMapPointIter { iter }
61 }
62
63 pub fn num_keys(&self) -> usize {
65 self.len()
66 }
67
68 pub fn len(&self) -> usize {
70 self.map.len()
71 }
72
73 #[allow(unused)] pub fn is_empty(&self) -> bool {
76 self.len() == 0
77 }
78
79 pub fn clear(&mut self) {
82 self.map.clear();
83 }
84}
85
86pub struct UniqueMapPointIter<'a, V> {
88 iter: IntoIter<&'a V>,
90}
91
92impl<'a, V> Iterator for UniqueMapPointIter<'a, V> {
93 type Item = &'a V;
94
95 fn next(&mut self) -> Option<Self::Item> {
96 self.iter.next()
97 }
98}
99
100pub struct UniqueMapRangeIter<'a, K, V> {
102 iter: Range<'a, K, V>,
104}
105
106impl<'a, K, V> Iterator for UniqueMapRangeIter<'a, K, V> {
107 type Item = &'a V;
108
109 fn next(&mut self) -> Option<Self::Item> {
110 self.iter.next().map(|(_, v)| v)
111 }
112}