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}