1use crate::map::SecondaryMap;
11use crate::EntityRef;
12use alloc::vec::Vec;
13use core::mem;
14use core::slice;
15use core::u32;
16
17#[cfg(feature = "enable-serde")]
18use serde::{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<'a, K, V> IntoIterator for &'a SparseMap<K, V>
208where
209 K: EntityRef,
210 V: SparseMapValue<K>,
211{
212 type Item = &'a V;
213 type IntoIter = slice::Iter<'a, V>;
214
215 fn into_iter(self) -> Self::IntoIter {
216 self.values()
217 }
218}
219
220impl<T> SparseMapValue<T> for T
222where
223 T: EntityRef,
224{
225 fn key(&self) -> Self {
226 *self
227 }
228}
229
230pub type SparseSet<T> = SparseMap<T, T>;
234
235#[cfg(test)]
236mod tests {
237 use super::*;
238 use crate::EntityRef;
239
240 #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
242 pub struct Inst(u32);
243 entity_impl!(Inst, "inst");
244
245 #[derive(PartialEq, Eq, Debug)]
247 struct Obj(Inst, &'static str);
248
249 impl SparseMapValue<Inst> for Obj {
250 fn key(&self) -> Inst {
251 self.0
252 }
253 }
254
255 #[test]
256 fn empty_immutable_map() {
257 let i1 = Inst::new(1);
258 let map: SparseMap<Inst, Obj> = SparseMap::new();
259
260 assert!(map.is_empty());
261 assert_eq!(map.len(), 0);
262 assert_eq!(map.get(i1), None);
263 assert_eq!(map.values().count(), 0);
264 }
265
266 #[test]
267 fn single_entry() {
268 let i0 = Inst::new(0);
269 let i1 = Inst::new(1);
270 let i2 = Inst::new(2);
271 let mut map = SparseMap::new();
272
273 assert!(map.is_empty());
274 assert_eq!(map.len(), 0);
275 assert_eq!(map.get(i1), None);
276 assert_eq!(map.get_mut(i1), None);
277 assert_eq!(map.remove(i1), None);
278
279 assert_eq!(map.insert(Obj(i1, "hi")), None);
280 assert!(!map.is_empty());
281 assert_eq!(map.len(), 1);
282 assert_eq!(map.get(i0), None);
283 assert_eq!(map.get(i1), Some(&Obj(i1, "hi")));
284 assert_eq!(map.get(i2), None);
285 assert_eq!(map.get_mut(i0), None);
286 assert_eq!(map.get_mut(i1), Some(&mut Obj(i1, "hi")));
287 assert_eq!(map.get_mut(i2), None);
288
289 assert_eq!(map.remove(i0), None);
290 assert_eq!(map.remove(i2), None);
291 assert_eq!(map.remove(i1), Some(Obj(i1, "hi")));
292 assert_eq!(map.len(), 0);
293 assert_eq!(map.get(i1), None);
294 assert_eq!(map.get_mut(i1), None);
295 assert_eq!(map.remove(i0), None);
296 assert_eq!(map.remove(i1), None);
297 assert_eq!(map.remove(i2), None);
298 }
299
300 #[test]
301 fn multiple_entries() {
302 let i0 = Inst::new(0);
303 let i1 = Inst::new(1);
304 let i2 = Inst::new(2);
305 let i3 = Inst::new(3);
306 let mut map = SparseMap::new();
307
308 assert_eq!(map.insert(Obj(i2, "foo")), None);
309 assert_eq!(map.insert(Obj(i1, "bar")), None);
310 assert_eq!(map.insert(Obj(i0, "baz")), None);
311
312 assert_eq!(
314 map.values().map(|obj| obj.1).collect::<Vec<_>>(),
315 ["foo", "bar", "baz"]
316 );
317
318 assert_eq!(map.len(), 3);
319 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
320 assert_eq!(map.get(i1), Some(&Obj(i1, "bar")));
321 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
322 assert_eq!(map.get(i3), None);
323
324 assert_eq!(map.remove(i1), Some(Obj(i1, "bar")));
326 assert_eq!(map.len(), 2);
327 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
328 assert_eq!(map.get(i1), None);
329 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
330 assert_eq!(map.get(i3), None);
331
332 assert_eq!(map.insert(Obj(i1, "barbar")), None);
334 assert_eq!(map.len(), 3);
335 assert_eq!(map.get(i0), Some(&Obj(i0, "baz")));
336 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
337 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
338 assert_eq!(map.get(i3), None);
339
340 assert_eq!(map.insert(Obj(i0, "bazbaz")), Some(Obj(i0, "baz")));
342 assert_eq!(map.len(), 3);
343 assert_eq!(map.get(i0), Some(&Obj(i0, "bazbaz")));
344 assert_eq!(map.get(i1), Some(&Obj(i1, "barbar")));
345 assert_eq!(map.get(i2), Some(&Obj(i2, "foo")));
346 assert_eq!(map.get(i3), None);
347
348 let mut v = Vec::new();
350 for i in &map {
351 v.push(i.1);
352 }
353 assert_eq!(v.len(), map.len());
354 }
355
356 #[test]
357 fn entity_set() {
358 let i0 = Inst::new(0);
359 let i1 = Inst::new(1);
360 let mut set = SparseSet::new();
361
362 assert_eq!(set.insert(i0), None);
363 assert_eq!(set.insert(i0), Some(i0));
364 assert_eq!(set.insert(i1), None);
365 assert_eq!(set.get(i0), Some(&i0));
366 assert_eq!(set.get(i1), Some(&i1));
367 }
368}