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}