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