1use crate::EntityRef;
11use crate::map::SecondaryMap;
12use alloc::vec::Vec;
13use core::fmt;
14use core::mem;
15use core::slice;
16
17#[cfg(feature = "enable-serde")]
18use serde_derive::{Deserialize, Serialize};
19
20pub trait SparseMapValue<K> {
25 fn key(&self) -> K;
28}
29
30#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
60pub struct SparseMap<K, V>
61where
62 K: EntityRef,
63 V: SparseMapValue<K>,
64{
65 sparse: SecondaryMap<K, u32>,
66 dense: Vec<V>,
67}
68
69impl<K, V> SparseMap<K, V>
70where
71 K: EntityRef,
72 V: SparseMapValue<K>,
73{
74 pub fn new() -> Self {
76 Self {
77 sparse: SecondaryMap::new(),
78 dense: Vec::new(),
79 }
80 }
81
82 pub fn len(&self) -> usize {
84 self.dense.len()
85 }
86
87 pub fn is_empty(&self) -> bool {
89 self.dense.is_empty()
90 }
91
92 pub fn clear(&mut self) {
94 self.dense.clear();
95 }
96
97 pub fn get(&self, key: K) -> Option<&V> {
99 if let Some(idx) = self.sparse.get(key).cloned() {
100 if let Some(entry) = self.dense.get(idx as usize) {
101 if entry.key() == key {
102 return Some(entry);
103 }
104 }
105 }
106 None
107 }
108
109 pub fn get_mut(&mut self, key: K) -> Option<&mut V> {
114 if let Some(idx) = self.sparse.get(key).cloned() {
115 if let Some(entry) = self.dense.get_mut(idx as usize) {
116 if entry.key() == key {
117 return Some(entry);
118 }
119 }
120 }
121 None
122 }
123
124 fn index(&self, key: K) -> Option<usize> {
126 if let Some(idx) = self.sparse.get(key).cloned() {
127 let idx = idx as usize;
128 if let Some(entry) = self.dense.get(idx) {
129 if entry.key() == key {
130 return Some(idx);
131 }
132 }
133 }
134 None
135 }
136
137 pub fn contains_key(&self, key: K) -> bool {
139 self.get(key).is_some()
140 }
141
142 pub fn insert(&mut self, value: V) -> Option<V> {
150 let key = value.key();
151
152 if let Some(entry) = self.get_mut(key) {
154 return Some(mem::replace(entry, value));
155 }
156
157 let idx = self.dense.len();
159 debug_assert!(idx <= u32::MAX as usize, "SparseMap overflow");
160 self.dense.push(value);
161 self.sparse[key] = idx as u32;
162 None
163 }
164
165 pub fn remove(&mut self, key: K) -> Option<V> {
167 if let Some(idx) = self.index(key) {
168 let back = self.dense.pop().unwrap();
169
170 if idx == self.dense.len() {
172 return Some(back);
173 }
174
175 self.sparse[back.key()] = idx as u32;
179 return Some(mem::replace(&mut self.dense[idx], back));
180 }
181
182 None
184 }
185
186 pub fn pop(&mut self) -> Option<V> {
188 self.dense.pop()
189 }
190
191 pub fn values(&self) -> slice::Iter<'_, V> {
197 self.dense.iter()
198 }
199
200 pub fn as_slice(&self) -> &[V] {
202 self.dense.as_slice()
203 }
204}
205
206impl<K, V> Default for SparseMap<K, V>
207where
208 K: EntityRef,
209 V: SparseMapValue<K>,
210{
211 fn default() -> SparseMap<K, V> {
212 SparseMap::new()
213 }
214}
215
216impl<K, V> fmt::Debug for SparseMap<K, V>
217where
218 K: EntityRef + fmt::Debug,
219 V: SparseMapValue<K> + fmt::Debug,
220{
221 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
222 f.debug_map()
223 .entries(self.values().map(|v| (v.key(), v)))
224 .finish()
225 }
226}
227
228impl<'a, K, V> IntoIterator for &'a SparseMap<K, V>
230where
231 K: EntityRef,
232 V: SparseMapValue<K>,
233{
234 type Item = &'a V;
235 type IntoIter = slice::Iter<'a, V>;
236
237 fn into_iter(self) -> Self::IntoIter {
238 self.values()
239 }
240}
241
242impl<T> SparseMapValue<T> for T
244where
245 T: EntityRef,
246{
247 fn key(&self) -> Self {
248 *self
249 }
250}
251
252pub type SparseSet<T> = SparseMap<T, T>;
256
257#[cfg(test)]
258mod tests {
259 use alloc::format;
260
261 use super::*;
262
263 #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
265 pub struct Inst(u32);
266 entity_impl!(Inst, "inst");
267
268 #[derive(PartialEq, Eq, Debug)]
270 struct Obj(Inst, &'static str);
271
272 impl SparseMapValue<Inst> for Obj {
273 fn key(&self) -> Inst {
274 self.0
275 }
276 }
277
278 #[test]
279 fn empty_immutable_map() {
280 let i1 = Inst::new(1);
281 let map: SparseMap<Inst, Obj> = SparseMap::new();
282
283 assert!(map.is_empty());
284 assert_eq!(map.len(), 0);
285 assert_eq!(map.get(i1), None);
286 assert_eq!(map.values().count(), 0);
287 }
288
289 #[test]
290 fn single_entry() {
291 let i0 = Inst::new(0);
292 let i1 = Inst::new(1);
293 let i2 = Inst::new(2);
294 let mut map = SparseMap::new();
295
296 assert!(map.is_empty());
297 assert_eq!(map.len(), 0);
298 assert_eq!(map.get(i1), None);
299 assert_eq!(map.get_mut(i1), None);
300 assert_eq!(map.remove(i1), None);
301
302 assert_eq!(map.insert(Obj(i1, "hi")), None);
303 assert!(!map.is_empty());
304 assert_eq!(map.len(), 1);
305 assert_eq!(map.get(i0), None);
306 assert_eq!(map.get(i1), Some(&Obj(i1, "hi")));
307 assert_eq!(map.get(i2), None);
308 assert_eq!(map.get_mut(i0), None);
309 assert_eq!(map.get_mut(i1), Some(&mut Obj(i1, "hi")));
310 assert_eq!(map.get_mut(i2), None);
311
312 assert_eq!(map.remove(i0), None);
313 assert_eq!(map.remove(i2), None);
314 assert_eq!(map.remove(i1), Some(Obj(i1, "hi")));
315 assert_eq!(map.len(), 0);
316 assert_eq!(map.get(i1), None);
317 assert_eq!(map.get_mut(i1), None);
318 assert_eq!(map.remove(i0), None);
319 assert_eq!(map.remove(i1), None);
320 assert_eq!(map.remove(i2), None);
321 }
322
323 #[test]
324 fn multiple_entries() {
325 let i0 = Inst::new(0);
326 let i1 = Inst::new(1);
327 let i2 = Inst::new(2);
328 let i3 = Inst::new(3);
329 let mut map = SparseMap::new();
330
331 assert_eq!(map.insert(Obj(i2, "foo")), None);
332 assert_eq!(map.insert(Obj(i1, "bar")), None);
333 assert_eq!(map.insert(Obj(i0, "baz")), None);
334
335 assert_eq!(
337 map.values().map(|obj| obj.1).collect::<Vec<_>>(),
338 ["foo", "bar", "baz"]
339 );
340
341 assert_eq!(map.len(), 3);
342 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
343 assert_eq!(map.get(i1), Some(&Obj(i1, "bar")));
344 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
345 assert_eq!(map.get(i3), None);
346
347 assert_eq!(map.remove(i1), Some(Obj(i1, "bar")));
349 assert_eq!(map.len(), 2);
350 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
351 assert_eq!(map.get(i1), None);
352 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
353 assert_eq!(map.get(i3), None);
354
355 assert_eq!(map.insert(Obj(i1, "barbar")), None);
357 assert_eq!(map.len(), 3);
358 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
359 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
360 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
361 assert_eq!(map.get(i3), None);
362
363 assert_eq!(map.insert(Obj(i0, "bazbaz")), Some(Obj(i0, "baz")));
365 assert_eq!(map.len(), 3);
366 assert_eq!(map.get(i0), Some(&Obj(i0, "bazbaz")));
367 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
368 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
369 assert_eq!(map.get(i3), None);
370
371 let mut v = Vec::new();
373 for i in &map {
374 v.push(i.1);
375 }
376 assert_eq!(v.len(), map.len());
377 }
378
379 #[test]
380 fn entity_set() {
381 let i0 = Inst::new(0);
382 let i1 = Inst::new(1);
383 let mut set = SparseSet::new();
384
385 assert_eq!(set.insert(i0), None);
386 assert_eq!(set.insert(i0), Some(i0));
387 assert_eq!(set.insert(i1), None);
388 assert_eq!(set.get(i0), Some(&i0));
389 assert_eq!(set.get(i1), Some(&i1));
390 }
391
392 #[test]
393 fn default_impl() {
394 let map: SparseMap<Inst, Obj> = SparseMap::default();
395
396 assert!(map.is_empty());
397 assert_eq!(map.len(), 0);
398 }
399
400 #[test]
401 fn debug_impl() {
402 let i1 = Inst::new(1);
403 let mut map = SparseMap::new();
404 assert_eq!(map.insert(Obj(i1, "hi")), None);
405
406 let debug = format!("{map:?}");
407 let expected = "{inst1: Obj(inst1, \"hi\")}";
408 assert_eq!(debug, expected);
409 }
410}