slotmap_fork_otter/dense.rs
1//! Contains the dense slot map implementation.
2
3// There is quite a lot of unsafe code in this implementation. To prevent the
4// same explanation over and over again, care must be taken that indices in
5// slots and keys from key-value pairs **that are stored inside the slot map**
6// are valid. Keys that are received from the user are not trusted (as they
7// might have come from a different slot map or malicious serde deseralization).
8
9#[cfg(all(nightly, any(doc, feature = "unstable")))]
10use alloc::collections::TryReserveError;
11use alloc::vec::Vec;
12use core::iter::FusedIterator;
13#[allow(unused_imports)] // MaybeUninit is only used on nightly at the moment.
14use core::mem::MaybeUninit;
15use core::ops::{Index, IndexMut};
16
17use crate::{DefaultKey, Key, KeyData};
18
19// A slot, which represents storage for an index and a current version.
20// Can be occupied or vacant.
21#[derive(Debug, Clone)]
22struct Slot {
23 // Even = vacant, odd = occupied.
24 version: u32,
25
26 // An index when occupied, the next free slot otherwise.
27 idx_or_free: u32,
28}
29
30/// Dense slot map, storage with stable unique keys.
31///
32/// See [crate documentation](crate) for more details.
33#[derive(Debug, Clone)]
34pub struct DenseSlotMap<K: Key, V> {
35 keys: Vec<K>,
36 values: Vec<V>,
37 slots: Vec<Slot>,
38 free_head: u32,
39}
40
41impl<V> DenseSlotMap<DefaultKey, V> {
42 /// Construct a new, empty [`DenseSlotMap`].
43 ///
44 /// # Examples
45 ///
46 /// ```
47 /// # use slotmap::*;
48 /// let mut sm: DenseSlotMap<_, i32> = DenseSlotMap::new();
49 /// ```
50 pub fn new() -> Self {
51 Self::with_capacity_and_key(0)
52 }
53
54 /// Creates an empty [`DenseSlotMap`] with the given capacity.
55 ///
56 /// The slot map will not reallocate until it holds at least `capacity`
57 /// elements.
58 ///
59 /// # Examples
60 ///
61 /// ```
62 /// # use slotmap::*;
63 /// let mut sm: DenseSlotMap<_, i32> = DenseSlotMap::with_capacity(10);
64 /// ```
65 pub fn with_capacity(capacity: usize) -> DenseSlotMap<DefaultKey, V> {
66 Self::with_capacity_and_key(capacity)
67 }
68}
69
70impl<K: Key, V> DenseSlotMap<K, V> {
71 /// Constructs a new, empty [`DenseSlotMap`] with a custom key type.
72 ///
73 /// # Examples
74 ///
75 /// ```
76 /// # use slotmap::*;
77 /// new_key_type! {
78 /// struct PositionKey;
79 /// }
80 /// let mut positions: DenseSlotMap<PositionKey, i32> = DenseSlotMap::with_key();
81 /// ```
82 pub fn with_key() -> Self {
83 Self::with_capacity_and_key(0)
84 }
85
86 /// Creates an empty [`DenseSlotMap`] with the given capacity and a custom key
87 /// type.
88 ///
89 /// The slot map will not reallocate until it holds at least `capacity`
90 /// elements.
91 ///
92 /// # Examples
93 ///
94 /// ```
95 /// # use slotmap::*;
96 /// new_key_type! {
97 /// struct MessageKey;
98 /// }
99 /// let mut messages = DenseSlotMap::with_capacity_and_key(3);
100 /// let welcome: MessageKey = messages.insert("Welcome");
101 /// let good_day = messages.insert("Good day");
102 /// let hello = messages.insert("Hello");
103 /// ```
104 pub fn with_capacity_and_key(capacity: usize) -> Self {
105 // Create slots with a sentinel at index 0.
106 // We don't actually use the sentinel for anything currently, but
107 // HopSlotMap does, and if we want keys to remain valid through
108 // conversion we have to have one as well.
109 let mut slots = Vec::with_capacity(capacity + 1);
110 slots.push(Slot {
111 idx_or_free: 0,
112 version: 0,
113 });
114
115 DenseSlotMap {
116 keys: Vec::with_capacity(capacity),
117 values: Vec::with_capacity(capacity),
118 slots,
119 free_head: 1,
120 }
121 }
122
123 /// Returns the number of elements in the slot map.
124 ///
125 /// # Examples
126 ///
127 /// ```
128 /// # use slotmap::*;
129 /// let mut sm = DenseSlotMap::with_capacity(10);
130 /// sm.insert("len() counts actual elements, not capacity");
131 /// let key = sm.insert("removed elements don't count either");
132 /// sm.remove(key);
133 /// assert_eq!(sm.len(), 1);
134 /// ```
135 pub fn len(&self) -> usize {
136 self.keys.len()
137 }
138
139 /// Returns if the slot map is empty.
140 ///
141 /// # Examples
142 ///
143 /// ```
144 /// # use slotmap::*;
145 /// let mut sm = DenseSlotMap::new();
146 /// let key = sm.insert("dummy");
147 /// assert_eq!(sm.is_empty(), false);
148 /// sm.remove(key);
149 /// assert_eq!(sm.is_empty(), true);
150 /// ```
151 pub fn is_empty(&self) -> bool {
152 self.keys.is_empty()
153 }
154
155 /// Returns the number of elements the [`DenseSlotMap`] can hold without
156 /// reallocating.
157 ///
158 /// # Examples
159 ///
160 /// ```
161 /// # use slotmap::*;
162 /// let sm: DenseSlotMap<_, f64> = DenseSlotMap::with_capacity(10);
163 /// assert_eq!(sm.capacity(), 10);
164 /// ```
165 pub fn capacity(&self) -> usize {
166 self.keys.capacity()
167 }
168
169 /// Reserves capacity for at least `additional` more elements to be inserted
170 /// in the [`DenseSlotMap`]. The collection may reserve more space to
171 /// avoid frequent reallocations.
172 ///
173 /// # Panics
174 ///
175 /// Panics if the new allocation size overflows [`usize`].
176 ///
177 /// # Examples
178 ///
179 /// ```
180 /// # use slotmap::*;
181 /// let mut sm = DenseSlotMap::new();
182 /// sm.insert("foo");
183 /// sm.reserve(32);
184 /// assert!(sm.capacity() >= 33);
185 /// ```
186 pub fn reserve(&mut self, additional: usize) {
187 self.keys.reserve(additional);
188 self.values.reserve(additional);
189 // One slot is reserved for the sentinel.
190 let needed = (self.len() + additional).saturating_sub(self.slots.len() - 1);
191 self.slots.reserve(needed);
192 }
193
194 /// Tries to reserve capacity for at least `additional` more elements to be
195 /// inserted in the [`DenseSlotMap`]. The collection may reserve more space to
196 /// avoid frequent reallocations.
197 ///
198 /// # Examples
199 ///
200 /// ```
201 /// # use slotmap::*;
202 /// let mut sm = DenseSlotMap::new();
203 /// sm.insert("foo");
204 /// sm.try_reserve(32).unwrap();
205 /// assert!(sm.capacity() >= 33);
206 /// ```
207 #[cfg(all(nightly, any(doc, feature = "unstable")))]
208 #[cfg_attr(all(nightly, doc), doc(cfg(feature = "unstable")))]
209 pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
210 self.keys.try_reserve(additional)?;
211 self.values.try_reserve(additional)?;
212 // One slot is reserved for the sentinel.
213 let needed = (self.len() + additional).saturating_sub(self.slots.len() - 1);
214 self.slots.try_reserve(needed)
215 }
216
217 /// Returns [`true`] if the slot map contains `key`.
218 ///
219 /// # Examples
220 ///
221 /// ```
222 /// # use slotmap::*;
223 /// let mut sm = DenseSlotMap::new();
224 /// let key = sm.insert(42);
225 /// assert_eq!(sm.contains_key(key), true);
226 /// sm.remove(key);
227 /// assert_eq!(sm.contains_key(key), false);
228 /// ```
229 pub fn contains_key(&self, key: K) -> bool {
230 let kd = key.data();
231 self.slots
232 .get(kd.idx as usize)
233 .map_or(false, |slot| slot.version == kd.version.get())
234 }
235
236 /// Inserts a value into the slot map. Returns a unique key that can be used
237 /// to access this value.
238 ///
239 /// # Panics
240 ///
241 /// Panics if the number of elements in the slot map equals
242 /// 2<sup>32</sup> - 2.
243 ///
244 /// # Examples
245 ///
246 /// ```
247 /// # use slotmap::*;
248 /// let mut sm = DenseSlotMap::new();
249 /// let key = sm.insert(42);
250 /// assert_eq!(sm[key], 42);
251 /// ```
252 pub fn insert(&mut self, value: V) -> K {
253 self.insert_with_key(|_| value)
254 }
255
256 /// Inserts a value given by `f` into the slot map. The key where the
257 /// value will be stored is passed into `f`. This is useful to store values
258 /// that contain their own key.
259 ///
260 /// # Panics
261 ///
262 /// Panics if the number of elements in the slot map equals
263 /// 2<sup>32</sup> - 2.
264 ///
265 /// # Examples
266 ///
267 /// ```
268 /// # use slotmap::*;
269 /// let mut sm = DenseSlotMap::new();
270 /// let key = sm.insert_with_key(|k| (k, 20));
271 /// assert_eq!(sm[key], (key, 20));
272 /// ```
273 pub fn insert_with_key<F>(&mut self, f: F) -> K
274 where
275 F: FnOnce(K) -> V,
276 {
277 if self.len() >= (core::u32::MAX - 1) as usize {
278 panic!("DenseSlotMap number of elements overflow");
279 }
280
281 let idx = self.free_head;
282
283 if let Some(slot) = self.slots.get_mut(idx as usize) {
284 let occupied_version = slot.version | 1;
285 let key = KeyData::new(idx, occupied_version).into();
286
287 // Push value before adjusting slots/freelist in case f panics.
288 self.values.push(f(key));
289 self.keys.push(key);
290 self.free_head = slot.idx_or_free;
291 slot.idx_or_free = self.keys.len() as u32 - 1;
292 slot.version = occupied_version;
293 return key;
294 }
295
296 // Push value before adjusting slots/freelist in case f panics.
297 let key = KeyData::new(idx, 1).into();
298 self.values.push(f(key));
299 self.keys.push(key);
300 self.slots.push(Slot {
301 version: 1,
302 idx_or_free: self.keys.len() as u32 - 1,
303 });
304 self.free_head = self.slots.len() as u32;
305 key
306 }
307
308 // Helper function to add a slot to the freelist. Returns the index that
309 // was stored in the slot.
310 #[inline(always)]
311 fn free_slot(&mut self, slot_idx: usize) -> u32 {
312 let slot = &mut self.slots[slot_idx];
313 let value_idx = slot.idx_or_free;
314 slot.version = slot.version.wrapping_add(1);
315 slot.idx_or_free = self.free_head;
316 self.free_head = slot_idx as u32;
317 value_idx
318 }
319
320 // Helper function to remove a value from a slot and make the slot free.
321 // Returns the value removed.
322 #[inline(always)]
323 fn remove_from_slot(&mut self, slot_idx: usize) -> V {
324 let value_idx = self.free_slot(slot_idx);
325
326 // Remove values/slot_indices by swapping to end.
327 let _ = self.keys.swap_remove(value_idx as usize);
328 let value = self.values.swap_remove(value_idx as usize);
329
330 // Did something take our place? Update its slot to new position.
331 if let Some(k) = self.keys.get(value_idx as usize) {
332 self.slots[k.data().idx as usize].idx_or_free = value_idx;
333 }
334
335 value
336 }
337
338 /// Removes a key from the slot map, returning the value at the key if the
339 /// key was not previously removed.
340 ///
341 /// # Examples
342 ///
343 /// ```
344 /// # use slotmap::*;
345 /// let mut sm = DenseSlotMap::new();
346 /// let key = sm.insert(42);
347 /// assert_eq!(sm.remove(key), Some(42));
348 /// assert_eq!(sm.remove(key), None);
349 /// ```
350 pub fn remove(&mut self, key: K) -> Option<V> {
351 let kd = key.data();
352 if self.contains_key(kd.into()) {
353 Some(self.remove_from_slot(kd.idx as usize))
354 } else {
355 None
356 }
357 }
358
359 /// Retains only the elements specified by the predicate.
360 ///
361 /// In other words, remove all key-value pairs `(k, v)` such that
362 /// `f(k, &mut v)` returns false. This method invalidates any removed keys.
363 ///
364 /// # Examples
365 ///
366 /// ```
367 /// # use slotmap::*;
368 /// let mut sm = DenseSlotMap::new();
369 ///
370 /// let k3 = sm.insert(2);
371 /// let k1 = sm.insert(0);
372 /// let k2 = sm.insert(1);
373 ///
374 /// sm.retain(|key, val| key == k1 || *val == 1);
375 ///
376 /// assert!(sm.contains_key(k1));
377 /// assert!(sm.contains_key(k2));
378 /// assert!(!sm.contains_key(k3));
379 ///
380 /// assert_eq!(2, sm.len());
381 /// ```
382 pub fn retain<F>(&mut self, mut f: F)
383 where
384 F: FnMut(K, &mut V) -> bool,
385 {
386 let mut i = 0;
387 while i < self.keys.len() {
388 let (should_keep, slot_idx) = {
389 let (kd, mut value) = (self.keys[i].data(), &mut self.values[i]);
390 (f(kd.into(), &mut value), kd.idx as usize)
391 };
392
393 if should_keep {
394 i += 1;
395 } else {
396 // We do not increment i here intentionally. This index has just
397 // been replaced with a new value.
398 self.remove_from_slot(slot_idx);
399 }
400 }
401 }
402
403 /// Clears the slot map. Keeps the allocated memory for reuse.
404 ///
405 /// # Examples
406 ///
407 /// ```
408 /// # use slotmap::*;
409 /// let mut sm = DenseSlotMap::new();
410 /// for i in 0..10 {
411 /// sm.insert(i);
412 /// }
413 /// assert_eq!(sm.len(), 10);
414 /// sm.clear();
415 /// assert_eq!(sm.len(), 0);
416 /// ```
417 pub fn clear(&mut self) {
418 self.drain();
419 }
420
421 /// Clears the slot map, returning all key-value pairs in arbitrary order
422 /// as an iterator. Keeps the allocated memory for reuse.
423 ///
424 /// When the iterator is dropped all elements in the slot map are removed,
425 /// even if the iterator was not fully consumed. If the iterator is not
426 /// dropped (using e.g. [`std::mem::forget`]), only the elements that were
427 /// iterated over are removed.
428 ///
429 /// # Examples
430 ///
431 /// ```
432 /// # use slotmap::*;
433 /// let mut sm = DenseSlotMap::new();
434 /// let k = sm.insert(0);
435 /// let v: Vec<_> = sm.drain().collect();
436 /// assert_eq!(sm.len(), 0);
437 /// assert_eq!(v, vec![(k, 0)]);
438 /// ```
439 pub fn drain(&mut self) -> Drain<K, V> {
440 Drain { sm: self }
441 }
442
443 /// Returns a reference to the value corresponding to the key.
444 ///
445 /// # Examples
446 ///
447 /// ```
448 /// # use slotmap::*;
449 /// let mut sm = DenseSlotMap::new();
450 /// let key = sm.insert("bar");
451 /// assert_eq!(sm.get(key), Some(&"bar"));
452 /// sm.remove(key);
453 /// assert_eq!(sm.get(key), None);
454 /// ```
455 pub fn get(&self, key: K) -> Option<&V> {
456 let kd = key.data();
457 self.slots
458 .get(kd.idx as usize)
459 .filter(|slot| slot.version == kd.version.get())
460 .map(|slot| unsafe {
461 // This is safe because we only store valid indices.
462 let idx = slot.idx_or_free as usize;
463 self.values.get_unchecked(idx)
464 })
465 }
466
467 /// Returns a reference to the value corresponding to the key without
468 /// version or bounds checking.
469 ///
470 /// # Safety
471 ///
472 /// This should only be used if `contains_key(key)` is true. Otherwise it is
473 /// potentially unsafe.
474 ///
475 /// # Examples
476 ///
477 /// ```
478 /// # use slotmap::*;
479 /// let mut sm = DenseSlotMap::new();
480 /// let key = sm.insert("bar");
481 /// assert_eq!(unsafe { sm.get_unchecked(key) }, &"bar");
482 /// sm.remove(key);
483 /// // sm.get_unchecked(key) is now dangerous!
484 /// ```
485 pub unsafe fn get_unchecked(&self, key: K) -> &V {
486 debug_assert!(self.contains_key(key));
487 let idx = self
488 .slots
489 .get_unchecked(key.data().idx as usize)
490 .idx_or_free;
491 &self.values.get_unchecked(idx as usize)
492 }
493
494 /// Returns a mutable reference to the value corresponding to the key.
495 ///
496 /// # Examples
497 ///
498 /// ```
499 /// # use slotmap::*;
500 /// let mut sm = DenseSlotMap::new();
501 /// let key = sm.insert(3.5);
502 /// if let Some(x) = sm.get_mut(key) {
503 /// *x += 3.0;
504 /// }
505 /// assert_eq!(sm[key], 6.5);
506 /// ```
507 pub fn get_mut(&mut self, key: K) -> Option<&mut V> {
508 let kd = key.data();
509 self.slots
510 .get(kd.idx as usize)
511 .filter(|slot| slot.version == kd.version.get())
512 .map(|slot| slot.idx_or_free as usize)
513 .map(move |idx| unsafe {
514 // This is safe because we only store valid indices.
515 self.values.get_unchecked_mut(idx)
516 })
517 }
518
519 /// Returns a mutable reference to the value corresponding to the key
520 /// without version or bounds checking.
521 ///
522 /// # Safety
523 ///
524 /// This should only be used if `contains_key(key)` is true. Otherwise it is
525 /// potentially unsafe.
526 ///
527 /// # Examples
528 ///
529 /// ```
530 /// # use slotmap::*;
531 /// let mut sm = DenseSlotMap::new();
532 /// let key = sm.insert("foo");
533 /// unsafe { *sm.get_unchecked_mut(key) = "bar" };
534 /// assert_eq!(sm[key], "bar");
535 /// sm.remove(key);
536 /// // sm.get_unchecked_mut(key) is now dangerous!
537 /// ```
538 pub unsafe fn get_unchecked_mut(&mut self, key: K) -> &mut V {
539 debug_assert!(self.contains_key(key));
540 let idx = self
541 .slots
542 .get_unchecked(key.data().idx as usize)
543 .idx_or_free;
544 self.values.get_unchecked_mut(idx as usize)
545 }
546
547 /// Returns mutable references to the values corresponding to the given
548 /// keys. All keys must be valid and disjoint, otherwise [`None`] is
549 /// returned.
550 ///
551 /// # Examples
552 ///
553 /// ```
554 /// # use slotmap::*;
555 /// let mut sm = DenseSlotMap::new();
556 /// let ka = sm.insert("butter");
557 /// let kb = sm.insert("apples");
558 /// let kc = sm.insert("charlie");
559 /// sm.remove(kc); // Make key c invalid.
560 /// assert_eq!(sm.get_disjoint_mut([ka, kb, kc]), None); // Has invalid key.
561 /// assert_eq!(sm.get_disjoint_mut([ka, ka]), None); // Not disjoint.
562 /// let [a, b] = sm.get_disjoint_mut([ka, kb]).unwrap();
563 /// std::mem::swap(a, b);
564 /// assert_eq!(sm[ka], "apples");
565 /// assert_eq!(sm[kb], "butter");
566 /// ```
567 #[cfg(all(nightly, any(doc, feature = "unstable")))]
568 #[cfg_attr(all(nightly, doc), doc(cfg(feature = "unstable")))]
569 pub fn get_disjoint_mut<const N: usize>(&mut self, keys: [K; N]) -> Option<[&mut V; N]> {
570 // Create an uninitialized array of `MaybeUninit`. The `assume_init` is
571 // safe because the type we are claiming to have initialized here is a
572 // bunch of `MaybeUninit`s, which do not require initialization.
573 let mut ptrs: [MaybeUninit<*mut V>; N] = unsafe { MaybeUninit::uninit().assume_init() };
574
575 let mut i = 0;
576 while i < N {
577 // We can avoid this clone after min_const_generics and array_map.
578 let kd = keys[i].data();
579 if !self.contains_key(kd.into()) {
580 break;
581 }
582
583 // This key is valid, and thus the slot is occupied. Temporarily
584 // mark it as unoccupied so duplicate keys would show up as invalid.
585 // This gives us a linear time disjointness check.
586 unsafe {
587 let slot = self.slots.get_unchecked_mut(kd.idx as usize);
588 slot.version ^= 1;
589 let ptr = self.values.get_unchecked_mut(slot.idx_or_free as usize);
590 ptrs[i] = MaybeUninit::new(ptr);
591 }
592 i += 1;
593 }
594
595 // Undo temporary unoccupied markings.
596 for k in &keys[..i] {
597 let idx = k.data().idx as usize;
598 unsafe {
599 self.slots.get_unchecked_mut(idx).version ^= 1;
600 }
601 }
602
603 if i == N {
604 // All were valid and disjoint.
605 Some(unsafe { core::mem::transmute_copy::<_, [&mut V; N]>(&ptrs) })
606 } else {
607 None
608 }
609 }
610
611 /// Returns mutable references to the values corresponding to the given
612 /// keys. All keys must be valid and disjoint.
613 ///
614 /// # Safety
615 ///
616 /// This should only be used if `contains_key(key)` is true for every given
617 /// key and no two keys are equal. Otherwise it is potentially unsafe.
618 ///
619 /// # Examples
620 ///
621 /// ```
622 /// # use slotmap::*;
623 /// let mut sm = DenseSlotMap::new();
624 /// let ka = sm.insert("butter");
625 /// let kb = sm.insert("apples");
626 /// let [a, b] = unsafe { sm.get_disjoint_unchecked_mut([ka, kb]) };
627 /// std::mem::swap(a, b);
628 /// assert_eq!(sm[ka], "apples");
629 /// assert_eq!(sm[kb], "butter");
630 /// ```
631 #[cfg(all(nightly, any(doc, feature = "unstable")))]
632 #[cfg_attr(all(nightly, doc), doc(cfg(feature = "unstable")))]
633 pub unsafe fn get_disjoint_unchecked_mut<const N: usize>(
634 &mut self,
635 keys: [K; N],
636 ) -> [&mut V; N] {
637 // Safe, see get_disjoint_mut.
638 let mut ptrs: [MaybeUninit<*mut V>; N] = MaybeUninit::uninit().assume_init();
639 for i in 0..N {
640 ptrs[i] = MaybeUninit::new(self.get_unchecked_mut(keys[i]));
641 }
642 core::mem::transmute_copy::<_, [&mut V; N]>(&ptrs)
643 }
644
645 /// An iterator visiting all key-value pairs in arbitrary order. The
646 /// iterator element type is `(K, &'a V)`.
647 ///
648 /// # Examples
649 ///
650 /// ```
651 /// # use slotmap::*;
652 /// let mut sm = DenseSlotMap::new();
653 /// let k0 = sm.insert(0);
654 /// let k1 = sm.insert(1);
655 /// let k2 = sm.insert(2);
656 ///
657 /// let mut it = sm.iter();
658 /// for (k, v) in sm.iter() {
659 /// println!("key: {:?}, val: {}", k, v);
660 /// }
661 /// ```
662 pub fn iter(&self) -> Iter<K, V> {
663 Iter {
664 inner_keys: self.keys.iter(),
665 inner_values: self.values.iter(),
666 }
667 }
668
669 /// An iterator visiting all key-value pairs in arbitrary order, with
670 /// mutable references to the values. The iterator element type is
671 /// `(K, &'a mut V)`.
672 ///
673 /// # Examples
674 ///
675 /// ```
676 /// # use slotmap::*;
677 /// let mut sm = DenseSlotMap::new();
678 /// let k0 = sm.insert(10);
679 /// let k1 = sm.insert(20);
680 /// let k2 = sm.insert(30);
681 ///
682 /// for (k, v) in sm.iter_mut() {
683 /// if k != k1 {
684 /// *v *= -1;
685 /// }
686 /// }
687 ///
688 /// assert_eq!(sm[k0], -10);
689 /// assert_eq!(sm[k1], 20);
690 /// assert_eq!(sm[k2], -30);
691 /// ```
692 pub fn iter_mut(&mut self) -> IterMut<K, V> {
693 IterMut {
694 inner_keys: self.keys.iter(),
695 inner_values: self.values.iter_mut(),
696 }
697 }
698
699 /// An iterator visiting all keys in arbitrary order. The iterator element
700 /// type is K.
701 ///
702 /// # Examples
703 ///
704 /// ```
705 /// # use slotmap::*;
706 /// # use std::collections::HashSet;
707 /// let mut sm = DenseSlotMap::new();
708 /// let k0 = sm.insert(10);
709 /// let k1 = sm.insert(20);
710 /// let k2 = sm.insert(30);
711 /// let keys: HashSet<_> = sm.keys().collect();
712 /// let check: HashSet<_> = vec![k0, k1, k2].into_iter().collect();
713 /// assert_eq!(keys, check);
714 /// ```
715 pub fn keys(&self) -> Keys<K, V> {
716 Keys { inner: self.iter() }
717 }
718
719 /// An iterator visiting all values in arbitrary order. The iterator element
720 /// type is `&'a V`.
721 ///
722 /// # Examples
723 ///
724 /// ```
725 /// # use slotmap::*;
726 /// # use std::collections::HashSet;
727 /// let mut sm = DenseSlotMap::new();
728 /// let k0 = sm.insert(10);
729 /// let k1 = sm.insert(20);
730 /// let k2 = sm.insert(30);
731 /// let values: HashSet<_> = sm.values().collect();
732 /// let check: HashSet<_> = vec![&10, &20, &30].into_iter().collect();
733 /// assert_eq!(values, check);
734 /// ```
735 pub fn values(&self) -> Values<K, V> {
736 Values { inner: self.iter() }
737 }
738
739 /// An iterator visiting all values mutably in arbitrary order. The iterator
740 /// element type is `&'a mut V`.
741 ///
742 /// # Examples
743 ///
744 /// ```
745 /// # use slotmap::*;
746 /// # use std::collections::HashSet;
747 /// let mut sm = DenseSlotMap::new();
748 /// sm.insert(1);
749 /// sm.insert(2);
750 /// sm.insert(3);
751 /// sm.values_mut().for_each(|n| { *n *= 3 });
752 /// let values: HashSet<_> = sm.into_iter().map(|(_k, v)| v).collect();
753 /// let check: HashSet<_> = vec![3, 6, 9].into_iter().collect();
754 /// assert_eq!(values, check);
755 /// ```
756 pub fn values_mut(&mut self) -> ValuesMut<K, V> {
757 ValuesMut {
758 inner: self.iter_mut(),
759 }
760 }
761}
762
763impl<K: Key, V> Default for DenseSlotMap<K, V> {
764 fn default() -> Self {
765 Self::with_key()
766 }
767}
768
769impl<K: Key, V> Index<K> for DenseSlotMap<K, V> {
770 type Output = V;
771
772 fn index(&self, key: K) -> &V {
773 match self.get(key) {
774 Some(r) => r,
775 None => panic!("invalid DenseSlotMap key used"),
776 }
777 }
778}
779
780impl<K: Key, V> IndexMut<K> for DenseSlotMap<K, V> {
781 fn index_mut(&mut self, key: K) -> &mut V {
782 match self.get_mut(key) {
783 Some(r) => r,
784 None => panic!("invalid DenseSlotMap key used"),
785 }
786 }
787}
788
789// Iterators.
790/// A draining iterator for [`DenseSlotMap`].
791///
792/// This iterator is created by [`DenseSlotMap::drain`].
793#[derive(Debug)]
794pub struct Drain<'a, K: 'a + Key, V: 'a> {
795 sm: &'a mut DenseSlotMap<K, V>,
796}
797
798/// An iterator that moves key-value pairs out of a [`DenseSlotMap`].
799///
800/// This iterator is created by calling the `into_iter` method on [`DenseSlotMap`],
801/// provided by the [`IntoIterator`] trait.
802#[derive(Debug, Clone)]
803pub struct IntoIter<K, V> {
804 inner_keys: alloc::vec::IntoIter<K>,
805 inner_values: alloc::vec::IntoIter<V>,
806}
807
808/// An iterator over the key-value pairs in a [`DenseSlotMap`].
809///
810/// This iterator is created by [`DenseSlotMap::iter`].
811#[derive(Debug, Clone)]
812pub struct Iter<'a, K: 'a + Key, V: 'a> {
813 inner_keys: core::slice::Iter<'a, K>,
814 inner_values: core::slice::Iter<'a, V>,
815}
816
817/// A mutable iterator over the key-value pairs in a [`DenseSlotMap`].
818///
819/// This iterator is created by [`DenseSlotMap::iter_mut`].
820#[derive(Debug)]
821pub struct IterMut<'a, K: 'a + Key, V: 'a> {
822 inner_keys: core::slice::Iter<'a, K>,
823 inner_values: core::slice::IterMut<'a, V>,
824}
825
826/// An iterator over the keys in a [`DenseSlotMap`].
827///
828/// This iterator is created by [`DenseSlotMap::keys`].
829#[derive(Debug, Clone)]
830pub struct Keys<'a, K: 'a + Key, V> {
831 inner: Iter<'a, K, V>,
832}
833
834/// An iterator over the values in a [`DenseSlotMap`].
835///
836/// This iterator is created by [`DenseSlotMap::values`].
837#[derive(Debug, Clone)]
838pub struct Values<'a, K: 'a + Key, V> {
839 inner: Iter<'a, K, V>,
840}
841
842/// A mutable iterator over the values in a [`DenseSlotMap`].
843///
844/// This iterator is created by [`DenseSlotMap::values_mut`].
845#[derive(Debug)]
846pub struct ValuesMut<'a, K: 'a + Key, V: 'a> {
847 inner: IterMut<'a, K, V>,
848}
849
850impl<'a, K: Key, V> Iterator for Drain<'a, K, V> {
851 type Item = (K, V);
852
853 fn next(&mut self) -> Option<(K, V)> {
854 // We make no iteration order guarantees, so we just repeatedly pop.
855 let key = self.sm.keys.pop();
856 let value = self.sm.values.pop();
857
858 if let (Some(k), Some(v)) = (key, value) {
859 self.sm.free_slot(k.data().idx as usize);
860 Some((k, v))
861 } else {
862 None
863 }
864 }
865
866 fn size_hint(&self) -> (usize, Option<usize>) {
867 let len = self.sm.keys.len();
868 (len, Some(len))
869 }
870}
871
872impl<'a, K: Key, V> Drop for Drain<'a, K, V> {
873 fn drop(&mut self) {
874 self.for_each(|_drop| {});
875 }
876}
877
878impl<K: Key, V> Iterator for IntoIter<K, V> {
879 type Item = (K, V);
880
881 fn next(&mut self) -> Option<(K, V)> {
882 let key = self.inner_keys.next();
883 let value = self.inner_values.next();
884
885 if let (Some(k), Some(v)) = (key, value) {
886 Some((k, v))
887 } else {
888 None
889 }
890 }
891
892 fn size_hint(&self) -> (usize, Option<usize>) {
893 self.inner_keys.size_hint()
894 }
895}
896
897impl<'a, K: 'a + Key, V> Iterator for Iter<'a, K, V> {
898 type Item = (K, &'a V);
899
900 fn next(&mut self) -> Option<(K, &'a V)> {
901 let key = self.inner_keys.next();
902 let value = self.inner_values.next();
903
904 if let (Some(k), Some(v)) = (key, value) {
905 Some((*k, v))
906 } else {
907 None
908 }
909 }
910
911 fn size_hint(&self) -> (usize, Option<usize>) {
912 self.inner_keys.size_hint()
913 }
914}
915
916impl<'a, K: 'a + Key, V> Iterator for IterMut<'a, K, V> {
917 type Item = (K, &'a mut V);
918
919 fn next(&mut self) -> Option<(K, &'a mut V)> {
920 let key = self.inner_keys.next();
921 let value = self.inner_values.next();
922
923 if let (Some(k), Some(v)) = (key, value) {
924 Some((*k, v))
925 } else {
926 None
927 }
928 }
929
930 fn size_hint(&self) -> (usize, Option<usize>) {
931 self.inner_keys.size_hint()
932 }
933}
934
935impl<'a, K: 'a + Key, V> Iterator for Keys<'a, K, V> {
936 type Item = K;
937
938 fn next(&mut self) -> Option<K> {
939 self.inner.next().map(|(key, _)| key)
940 }
941
942 fn size_hint(&self) -> (usize, Option<usize>) {
943 self.inner.size_hint()
944 }
945}
946
947impl<'a, K: 'a + Key, V> Iterator for Values<'a, K, V> {
948 type Item = &'a V;
949
950 fn next(&mut self) -> Option<&'a V> {
951 self.inner.next().map(|(_, value)| value)
952 }
953
954 fn size_hint(&self) -> (usize, Option<usize>) {
955 self.inner.size_hint()
956 }
957}
958
959impl<'a, K: 'a + Key, V> Iterator for ValuesMut<'a, K, V> {
960 type Item = &'a mut V;
961
962 fn next(&mut self) -> Option<&'a mut V> {
963 self.inner.next().map(|(_, value)| value)
964 }
965
966 fn size_hint(&self) -> (usize, Option<usize>) {
967 self.inner.size_hint()
968 }
969}
970
971impl<'a, K: 'a + Key, V> IntoIterator for &'a DenseSlotMap<K, V> {
972 type Item = (K, &'a V);
973 type IntoIter = Iter<'a, K, V>;
974
975 fn into_iter(self) -> Self::IntoIter {
976 self.iter()
977 }
978}
979
980impl<'a, K: 'a + Key, V> IntoIterator for &'a mut DenseSlotMap<K, V> {
981 type Item = (K, &'a mut V);
982 type IntoIter = IterMut<'a, K, V>;
983
984 fn into_iter(self) -> Self::IntoIter {
985 self.iter_mut()
986 }
987}
988
989impl<K: Key, V> IntoIterator for DenseSlotMap<K, V> {
990 type Item = (K, V);
991 type IntoIter = IntoIter<K, V>;
992
993 fn into_iter(self) -> Self::IntoIter {
994 IntoIter {
995 inner_keys: self.keys.into_iter(),
996 inner_values: self.values.into_iter(),
997 }
998 }
999}
1000
1001impl<'a, K: 'a + Key, V> FusedIterator for Iter<'a, K, V> {}
1002impl<'a, K: 'a + Key, V> FusedIterator for IterMut<'a, K, V> {}
1003impl<'a, K: 'a + Key, V> FusedIterator for Keys<'a, K, V> {}
1004impl<'a, K: 'a + Key, V> FusedIterator for Values<'a, K, V> {}
1005impl<'a, K: 'a + Key, V> FusedIterator for ValuesMut<'a, K, V> {}
1006impl<'a, K: 'a + Key, V> FusedIterator for Drain<'a, K, V> {}
1007impl<K: Key, V> FusedIterator for IntoIter<K, V> {}
1008
1009impl<'a, K: 'a + Key, V> ExactSizeIterator for Iter<'a, K, V> {}
1010impl<'a, K: 'a + Key, V> ExactSizeIterator for IterMut<'a, K, V> {}
1011impl<'a, K: 'a + Key, V> ExactSizeIterator for Keys<'a, K, V> {}
1012impl<'a, K: 'a + Key, V> ExactSizeIterator for Values<'a, K, V> {}
1013impl<'a, K: 'a + Key, V> ExactSizeIterator for ValuesMut<'a, K, V> {}
1014impl<'a, K: 'a + Key, V> ExactSizeIterator for Drain<'a, K, V> {}
1015impl<K: Key, V> ExactSizeIterator for IntoIter<K, V> {}
1016
1017// Serialization with serde.
1018#[cfg(feature = "serde")]
1019mod serialize {
1020 use super::*;
1021 use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
1022
1023 #[derive(Serialize, Deserialize)]
1024 struct SerdeSlot<T> {
1025 value: Option<T>,
1026 version: u32,
1027 }
1028
1029 impl<K: Key, V: Serialize> Serialize for DenseSlotMap<K, V> {
1030 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1031 where
1032 S: Serializer,
1033 {
1034 let serde_slots: Vec<_> = self
1035 .slots
1036 .iter()
1037 .map(|slot| SerdeSlot {
1038 value: if slot.version % 2 == 1 {
1039 self.values.get(slot.idx_or_free as usize)
1040 } else {
1041 None
1042 },
1043 version: slot.version,
1044 })
1045 .collect();
1046 serde_slots.serialize(serializer)
1047 }
1048 }
1049
1050 impl<'de, K: Key, V: Deserialize<'de>> Deserialize<'de> for DenseSlotMap<K, V> {
1051 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1052 where
1053 D: Deserializer<'de>,
1054 {
1055 let serde_slots: Vec<SerdeSlot<V>> = Deserialize::deserialize(deserializer)?;
1056 if serde_slots.len() >= u32::max_value() as usize {
1057 return Err(de::Error::custom(&"too many slots"));
1058 }
1059
1060 // Ensure the first slot exists and is empty for the sentinel.
1061 if serde_slots
1062 .get(0)
1063 .map_or(true, |slot| slot.version % 2 == 1)
1064 {
1065 return Err(de::Error::custom(&"first slot not empty"));
1066 }
1067
1068 // Rebuild slots, key and values.
1069 let mut keys = Vec::new();
1070 let mut values = Vec::new();
1071 let mut slots = Vec::new();
1072 slots.push(Slot {
1073 idx_or_free: 0,
1074 version: 0,
1075 });
1076
1077 let mut next_free = serde_slots.len();
1078 for (i, serde_slot) in serde_slots.into_iter().enumerate().skip(1) {
1079 let occupied = serde_slot.version % 2 == 1;
1080 if occupied ^ serde_slot.value.is_some() {
1081 return Err(de::Error::custom(&"inconsistent occupation in Slot"));
1082 }
1083
1084 if let Some(value) = serde_slot.value {
1085 let kd = KeyData::new(i as u32, serde_slot.version);
1086 keys.push(kd.into());
1087 values.push(value);
1088 slots.push(Slot {
1089 version: serde_slot.version,
1090 idx_or_free: (keys.len() - 1) as u32,
1091 });
1092 } else {
1093 slots.push(Slot {
1094 version: serde_slot.version,
1095 idx_or_free: next_free as u32,
1096 });
1097 next_free = i;
1098 }
1099 }
1100
1101 Ok(DenseSlotMap {
1102 keys,
1103 values,
1104 slots,
1105 free_head: next_free as u32,
1106 })
1107 }
1108 }
1109}
1110
1111#[cfg(test)]
1112mod tests {
1113 use super::*;
1114 use quickcheck::quickcheck;
1115 use std::collections::HashMap;
1116
1117 #[derive(Clone)]
1118 struct CountDrop<'a>(&'a core::cell::RefCell<usize>);
1119
1120 impl<'a> Drop for CountDrop<'a> {
1121 fn drop(&mut self) {
1122 *self.0.borrow_mut() += 1;
1123 }
1124 }
1125
1126 #[test]
1127 fn check_drops() {
1128 let drops = core::cell::RefCell::new(0usize);
1129
1130 {
1131 let mut clone = {
1132 // Insert 1000 items.
1133 let mut sm = DenseSlotMap::new();
1134 let mut sm_keys = Vec::new();
1135 for _ in 0..1000 {
1136 sm_keys.push(sm.insert(CountDrop(&drops)));
1137 }
1138
1139 // Remove even keys.
1140 for i in (0..1000).filter(|i| i % 2 == 0) {
1141 sm.remove(sm_keys[i]);
1142 }
1143
1144 // Should only have dropped 500 so far.
1145 assert_eq!(*drops.borrow(), 500);
1146
1147 // Let's clone ourselves and then die.
1148 sm.clone()
1149 };
1150
1151 // Now all original items should have been dropped exactly once.
1152 assert_eq!(*drops.borrow(), 1000);
1153
1154 // Re-use some empty slots.
1155 for _ in 0..250 {
1156 clone.insert(CountDrop(&drops));
1157 }
1158 }
1159
1160 // 1000 + 750 drops in total should have happened.
1161 assert_eq!(*drops.borrow(), 1750);
1162 }
1163
1164 #[cfg(all(nightly, feature = "unstable"))]
1165 #[test]
1166 fn disjoint() {
1167 // Intended to be run with miri to find any potential UB.
1168 let mut sm = DenseSlotMap::new();
1169
1170 // Some churn.
1171 for i in 0..20usize {
1172 sm.insert(i);
1173 }
1174 sm.retain(|_, i| *i % 2 == 0);
1175
1176 let keys: Vec<_> = sm.keys().collect();
1177 for i in 0..keys.len() {
1178 for j in 0..keys.len() {
1179 if let Some([r0, r1]) = sm.get_disjoint_mut([keys[i], keys[j]]) {
1180 *r0 ^= *r1;
1181 *r1 = r1.wrapping_add(*r0);
1182 } else {
1183 assert!(i == j);
1184 }
1185 }
1186 }
1187
1188 for i in 0..keys.len() {
1189 for j in 0..keys.len() {
1190 for k in 0..keys.len() {
1191 if let Some([r0, r1, r2]) = sm.get_disjoint_mut([keys[i], keys[j], keys[k]]) {
1192 *r0 ^= *r1;
1193 *r0 = r0.wrapping_add(*r2);
1194 *r1 ^= *r0;
1195 *r1 = r1.wrapping_add(*r2);
1196 *r2 ^= *r0;
1197 *r2 = r2.wrapping_add(*r1);
1198 } else {
1199 assert!(i == j || j == k || i == k);
1200 }
1201 }
1202 }
1203 }
1204 }
1205
1206 quickcheck! {
1207 fn qc_slotmap_equiv_hashmap(operations: Vec<(u8, u32)>) -> bool {
1208 let mut hm = HashMap::new();
1209 let mut hm_keys = Vec::new();
1210 let mut unique_key = 0u32;
1211 let mut sm = DenseSlotMap::new();
1212 let mut sm_keys = Vec::new();
1213
1214 #[cfg(not(feature = "serde"))]
1215 let num_ops = 3;
1216 #[cfg(feature = "serde")]
1217 let num_ops = 4;
1218
1219 for (op, val) in operations {
1220 match op % num_ops {
1221 // Insert.
1222 0 => {
1223 hm.insert(unique_key, val);
1224 hm_keys.push(unique_key);
1225 unique_key += 1;
1226
1227 sm_keys.push(sm.insert(val));
1228 }
1229
1230 // Delete.
1231 1 => {
1232 if hm_keys.is_empty() { continue; }
1233
1234 let idx = val as usize % hm_keys.len();
1235 if hm.remove(&hm_keys[idx]) != sm.remove(sm_keys[idx]) {
1236 return false;
1237 }
1238 }
1239
1240 // Access.
1241 2 => {
1242 if hm_keys.is_empty() { continue; }
1243 let idx = val as usize % hm_keys.len();
1244 let (hm_key, sm_key) = (&hm_keys[idx], sm_keys[idx]);
1245
1246 if hm.contains_key(hm_key) != sm.contains_key(sm_key) ||
1247 hm.get(hm_key) != sm.get(sm_key) {
1248 return false;
1249 }
1250 }
1251
1252 // Serde round-trip.
1253 #[cfg(feature = "serde")]
1254 3 => {
1255 let ser = serde_json::to_string(&sm).unwrap();
1256 sm = serde_json::from_str(&ser).unwrap();
1257 }
1258
1259 _ => unreachable!(),
1260 }
1261 }
1262
1263 let mut smv: Vec<_> = sm.values().collect();
1264 let mut hmv: Vec<_> = hm.values().collect();
1265 smv.sort();
1266 hmv.sort();
1267 smv == hmv
1268 }
1269 }
1270
1271 #[cfg(feature = "serde")]
1272 #[test]
1273 fn slotmap_serde() {
1274 let mut sm = DenseSlotMap::new();
1275 // Self-referential structure.
1276 let first = sm.insert_with_key(|k| (k, 23i32));
1277 let second = sm.insert((first, 42));
1278
1279 // Make some empty slots.
1280 let empties = vec![sm.insert((first, 0)), sm.insert((first, 0))];
1281 empties.iter().for_each(|k| {
1282 sm.remove(*k);
1283 });
1284
1285 let third = sm.insert((second, 0));
1286 sm[first].0 = third;
1287
1288 let ser = serde_json::to_string(&sm).unwrap();
1289 let de: DenseSlotMap<DefaultKey, (DefaultKey, i32)> = serde_json::from_str(&ser).unwrap();
1290 assert_eq!(de.len(), sm.len());
1291
1292 let mut smkv: Vec<_> = sm.iter().collect();
1293 let mut dekv: Vec<_> = de.iter().collect();
1294 smkv.sort();
1295 dekv.sort();
1296 assert_eq!(smkv, dekv);
1297 }
1298
1299 #[cfg(feature = "serde")]
1300 #[test]
1301 fn slotmap_serde_freelist() {
1302 let mut sm = DenseSlotMap::new();
1303 let k0 = sm.insert(5i32);
1304 let k1 = sm.insert(5i32);
1305 sm.remove(k0);
1306 sm.remove(k1);
1307
1308 let ser = serde_json::to_string(&sm).unwrap();
1309 let mut de: DenseSlotMap<DefaultKey, i32> = serde_json::from_str(&ser).unwrap();
1310
1311 de.insert(0);
1312 de.insert(1);
1313 de.insert(2);
1314 assert_eq!(de.len(), 3);
1315 }
1316}