Skip to main content

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