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