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