1use crate::map::SecondaryMap;
11use crate::EntityRef;
12use alloc::vec::Vec;
13use core::mem;
14use core::slice;
15use core::u32;
16
17pub trait SparseMapValue<K> {
22 fn key(&self) -> K;
25}
26
27pub struct SparseMap<K, V>
57where
58 K: EntityRef,
59 V: SparseMapValue<K>,
60{
61 sparse: SecondaryMap<K, u32>,
62 dense: Vec<V>,
63}
64
65impl<K, V> SparseMap<K, V>
66where
67 K: EntityRef,
68 V: SparseMapValue<K>,
69{
70 pub fn new() -> Self {
72 Self {
73 sparse: SecondaryMap::new(),
74 dense: Vec::new(),
75 }
76 }
77
78 pub fn len(&self) -> usize {
80 self.dense.len()
81 }
82
83 pub fn is_empty(&self) -> bool {
85 self.dense.is_empty()
86 }
87
88 pub fn clear(&mut self) {
90 self.dense.clear();
91 }
92
93 pub fn get(&self, key: K) -> Option<&V> {
95 if let Some(idx) = self.sparse.get(key).cloned() {
96 if let Some(entry) = self.dense.get(idx as usize) {
97 if entry.key() == key {
98 return Some(entry);
99 }
100 }
101 }
102 None
103 }
104
105 pub fn get_mut(&mut self, key: K) -> Option<&mut V> {
110 if let Some(idx) = self.sparse.get(key).cloned() {
111 if let Some(entry) = self.dense.get_mut(idx as usize) {
112 if entry.key() == key {
113 return Some(entry);
114 }
115 }
116 }
117 None
118 }
119
120 fn index(&self, key: K) -> Option<usize> {
122 if let Some(idx) = self.sparse.get(key).cloned() {
123 let idx = idx as usize;
124 if let Some(entry) = self.dense.get(idx) {
125 if entry.key() == key {
126 return Some(idx);
127 }
128 }
129 }
130 None
131 }
132
133 pub fn contains_key(&self, key: K) -> bool {
135 self.get(key).is_some()
136 }
137
138 pub fn insert(&mut self, value: V) -> Option<V> {
146 let key = value.key();
147
148 if let Some(entry) = self.get_mut(key) {
150 return Some(mem::replace(entry, value));
151 }
152
153 let idx = self.dense.len();
155 debug_assert!(idx <= u32::MAX as usize, "SparseMap overflow");
156 self.dense.push(value);
157 self.sparse[key] = idx as u32;
158 None
159 }
160
161 pub fn remove(&mut self, key: K) -> Option<V> {
163 if let Some(idx) = self.index(key) {
164 let back = self.dense.pop().unwrap();
165
166 if idx == self.dense.len() {
168 return Some(back);
169 }
170
171 self.sparse[back.key()] = idx as u32;
175 return Some(mem::replace(&mut self.dense[idx], back));
176 }
177
178 None
180 }
181
182 pub fn pop(&mut self) -> Option<V> {
184 self.dense.pop()
185 }
186
187 pub fn values(&self) -> slice::Iter<V> {
193 self.dense.iter()
194 }
195
196 pub fn as_slice(&self) -> &[V] {
198 self.dense.as_slice()
199 }
200}
201
202impl<'a, K, V> IntoIterator for &'a SparseMap<K, V>
204where
205 K: EntityRef,
206 V: SparseMapValue<K>,
207{
208 type Item = &'a V;
209 type IntoIter = slice::Iter<'a, V>;
210
211 fn into_iter(self) -> Self::IntoIter {
212 self.values()
213 }
214}
215
216impl<T> SparseMapValue<T> for T
218where
219 T: EntityRef,
220{
221 fn key(&self) -> Self {
222 *self
223 }
224}
225
226pub type SparseSet<T> = SparseMap<T, T>;
230
231#[cfg(test)]
232mod tests {
233 use super::*;
234 use crate::EntityRef;
235
236 #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
238 pub struct Inst(u32);
239 entity_impl!(Inst, "inst");
240
241 #[derive(PartialEq, Eq, Debug)]
243 struct Obj(Inst, &'static str);
244
245 impl SparseMapValue<Inst> for Obj {
246 fn key(&self) -> Inst {
247 self.0
248 }
249 }
250
251 #[test]
252 fn empty_immutable_map() {
253 let i1 = Inst::new(1);
254 let map: SparseMap<Inst, Obj> = SparseMap::new();
255
256 assert!(map.is_empty());
257 assert_eq!(map.len(), 0);
258 assert_eq!(map.get(i1), None);
259 assert_eq!(map.values().count(), 0);
260 }
261
262 #[test]
263 fn single_entry() {
264 let i0 = Inst::new(0);
265 let i1 = Inst::new(1);
266 let i2 = Inst::new(2);
267 let mut map = SparseMap::new();
268
269 assert!(map.is_empty());
270 assert_eq!(map.len(), 0);
271 assert_eq!(map.get(i1), None);
272 assert_eq!(map.get_mut(i1), None);
273 assert_eq!(map.remove(i1), None);
274
275 assert_eq!(map.insert(Obj(i1, "hi")), None);
276 assert!(!map.is_empty());
277 assert_eq!(map.len(), 1);
278 assert_eq!(map.get(i0), None);
279 assert_eq!(map.get(i1), Some(&Obj(i1, "hi")));
280 assert_eq!(map.get(i2), None);
281 assert_eq!(map.get_mut(i0), None);
282 assert_eq!(map.get_mut(i1), Some(&mut Obj(i1, "hi")));
283 assert_eq!(map.get_mut(i2), None);
284
285 assert_eq!(map.remove(i0), None);
286 assert_eq!(map.remove(i2), None);
287 assert_eq!(map.remove(i1), Some(Obj(i1, "hi")));
288 assert_eq!(map.len(), 0);
289 assert_eq!(map.get(i1), None);
290 assert_eq!(map.get_mut(i1), None);
291 assert_eq!(map.remove(i0), None);
292 assert_eq!(map.remove(i1), None);
293 assert_eq!(map.remove(i2), None);
294 }
295
296 #[test]
297 fn multiple_entries() {
298 let i0 = Inst::new(0);
299 let i1 = Inst::new(1);
300 let i2 = Inst::new(2);
301 let i3 = Inst::new(3);
302 let mut map = SparseMap::new();
303
304 assert_eq!(map.insert(Obj(i2, "foo")), None);
305 assert_eq!(map.insert(Obj(i1, "bar")), None);
306 assert_eq!(map.insert(Obj(i0, "baz")), None);
307
308 assert_eq!(
310 map.values().map(|obj| obj.1).collect::<Vec<_>>(),
311 ["foo", "bar", "baz"]
312 );
313
314 assert_eq!(map.len(), 3);
315 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
316 assert_eq!(map.get(i1), Some(&Obj(i1, "bar")));
317 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
318 assert_eq!(map.get(i3), None);
319
320 assert_eq!(map.remove(i1), Some(Obj(i1, "bar")));
322 assert_eq!(map.len(), 2);
323 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
324 assert_eq!(map.get(i1), None);
325 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
326 assert_eq!(map.get(i3), None);
327
328 assert_eq!(map.insert(Obj(i1, "barbar")), None);
330 assert_eq!(map.len(), 3);
331 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
332 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
333 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
334 assert_eq!(map.get(i3), None);
335
336 assert_eq!(map.insert(Obj(i0, "bazbaz")), Some(Obj(i0, "baz")));
338 assert_eq!(map.len(), 3);
339 assert_eq!(map.get(i0), Some(&Obj(i0, "bazbaz")));
340 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
341 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
342 assert_eq!(map.get(i3), None);
343
344 let mut v = Vec::new();
346 for i in &map {
347 v.push(i.1);
348 }
349 assert_eq!(v.len(), map.len());
350 }
351
352 #[test]
353 fn entity_set() {
354 let i0 = Inst::new(0);
355 let i1 = Inst::new(1);
356 let mut set = SparseSet::new();
357
358 assert_eq!(set.insert(i0), None);
359 assert_eq!(set.insert(i0), Some(i0));
360 assert_eq!(set.insert(i1), None);
361 assert_eq!(set.get(i0), Some(&i0));
362 assert_eq!(set.get(i1), Some(&i1));
363 }
364}