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 { self.try_insert_with_key::<_, Never>(move |_| Ok(value)).unwrap_unchecked_() }
256 }
257
258 /// Inserts a value given by `f` into the slot map. The key where the
259 /// value will be stored is passed into `f`. This is useful to store values
260 /// that contain their own key.
261 ///
262 /// # Panics
263 ///
264 /// Panics if the number of elements in the slot map equals
265 /// 2<sup>32</sup> - 2.
266 ///
267 /// # Examples
268 ///
269 /// ```
270 /// # use slotmap::*;
271 /// let mut sm = DenseSlotMap::new();
272 /// let key = sm.insert_with_key(|k| (k, 20));
273 /// assert_eq!(sm[key], (key, 20));
274 /// ```
275 #[inline(always)]
276 pub fn insert_with_key<F>(&mut self, f: F) -> K
277 where
278 F: FnOnce(K) -> V,
279 {
280 unsafe { self.try_insert_with_key::<_, Never>(move |k| Ok(f(k))).unwrap_unchecked_() }
281 }
282
283 /// Inserts a value given by `f` into the slot map. The key where the
284 /// value will be stored is passed into `f`. This is useful to store values
285 /// that contain their own key.
286 ///
287 /// If `f` returns `Err`, this method returns the error. The slotmap is untouched.
288 ///
289 /// # Panics
290 ///
291 /// Panics if the number of elements in the slot map equals
292 /// 2<sup>32</sup> - 2.
293 ///
294 /// # Examples
295 ///
296 /// ```
297 /// # use slotmap::*;
298 /// let mut sm = DenseSlotMap::new();
299 /// let key = sm.try_insert_with_key::<_, ()>(|k| Ok((k, 20))).unwrap();
300 /// assert_eq!(sm[key], (key, 20));
301 ///
302 /// sm.try_insert_with_key::<_, ()>(|k| Err(())).unwrap_err();
303 /// ```
304 pub fn try_insert_with_key<F, E>(&mut self, f: F) -> Result<K, E>
305 where
306 F: FnOnce(K) -> Result<V, E>,
307 {
308 if self.len() >= (core::u32::MAX - 1) as usize {
309 panic!("DenseSlotMap number of elements overflow");
310 }
311
312 let idx = self.free_head;
313
314 if let Some(slot) = self.slots.get_mut(idx as usize) {
315 let occupied_version = slot.version | 1;
316 let key = KeyData::new(idx, occupied_version).into();
317
318 // Push value before adjusting slots/freelist in case f panics or returns an error.
319 self.values.push(f(key)?);
320 self.keys.push(key);
321 self.free_head = slot.idx_or_free;
322 slot.idx_or_free = self.keys.len() as u32 - 1;
323 slot.version = occupied_version;
324 return Ok(key);
325 }
326
327 // Push value before adjusting slots/freelist in case f panics or returns an error.
328 let key = KeyData::new(idx, 1).into();
329 self.values.push(f(key)?);
330 self.keys.push(key);
331 self.slots.push(Slot {
332 version: 1,
333 idx_or_free: self.keys.len() as u32 - 1,
334 });
335 self.free_head = self.slots.len() as u32;
336 Ok(key)
337 }
338
339 // Helper function to add a slot to the freelist. Returns the index that
340 // was stored in the slot.
341 #[inline(always)]
342 fn free_slot(&mut self, slot_idx: usize) -> u32 {
343 let slot = &mut self.slots[slot_idx];
344 let value_idx = slot.idx_or_free;
345 slot.version = slot.version.wrapping_add(1);
346 slot.idx_or_free = self.free_head;
347 self.free_head = slot_idx as u32;
348 value_idx
349 }
350
351 // Helper function to remove a value from a slot and make the slot free.
352 // Returns the value removed.
353 #[inline(always)]
354 fn remove_from_slot(&mut self, slot_idx: usize) -> V {
355 let value_idx = self.free_slot(slot_idx);
356
357 // Remove values/slot_indices by swapping to end.
358 let _ = self.keys.swap_remove(value_idx as usize);
359 let value = self.values.swap_remove(value_idx as usize);
360
361 // Did something take our place? Update its slot to new position.
362 if let Some(k) = self.keys.get(value_idx as usize) {
363 self.slots[k.data().idx as usize].idx_or_free = value_idx;
364 }
365
366 value
367 }
368
369 /// Removes a key from the slot map, returning the value at the key if the
370 /// key was not previously removed.
371 ///
372 /// # Examples
373 ///
374 /// ```
375 /// # use slotmap::*;
376 /// let mut sm = DenseSlotMap::new();
377 /// let key = sm.insert(42);
378 /// assert_eq!(sm.remove(key), Some(42));
379 /// assert_eq!(sm.remove(key), None);
380 /// ```
381 pub fn remove(&mut self, key: K) -> Option<V> {
382 let kd = key.data();
383 if self.contains_key(kd.into()) {
384 Some(self.remove_from_slot(kd.idx as usize))
385 } else {
386 None
387 }
388 }
389
390 /// Retains only the elements specified by the predicate.
391 ///
392 /// In other words, remove all key-value pairs `(k, v)` such that
393 /// `f(k, &mut v)` returns false. This method invalidates any removed keys.
394 ///
395 /// # Examples
396 ///
397 /// ```
398 /// # use slotmap::*;
399 /// let mut sm = DenseSlotMap::new();
400 ///
401 /// let k3 = sm.insert(2);
402 /// let k1 = sm.insert(0);
403 /// let k2 = sm.insert(1);
404 ///
405 /// sm.retain(|key, val| key == k1 || *val == 1);
406 ///
407 /// assert!(sm.contains_key(k1));
408 /// assert!(sm.contains_key(k2));
409 /// assert!(!sm.contains_key(k3));
410 ///
411 /// assert_eq!(2, sm.len());
412 /// ```
413 pub fn retain<F>(&mut self, mut f: F)
414 where
415 F: FnMut(K, &mut V) -> bool,
416 {
417 let mut i = 0;
418 while i < self.keys.len() {
419 let (should_keep, slot_idx) = {
420 let (kd, mut value) = (self.keys[i].data(), &mut self.values[i]);
421 (f(kd.into(), &mut value), kd.idx as usize)
422 };
423
424 if should_keep {
425 i += 1;
426 } else {
427 // We do not increment i here intentionally. This index has just
428 // been replaced with a new value.
429 self.remove_from_slot(slot_idx);
430 }
431 }
432 }
433
434 /// Clears the slot map. Keeps the allocated memory for reuse.
435 ///
436 /// # Examples
437 ///
438 /// ```
439 /// # use slotmap::*;
440 /// let mut sm = DenseSlotMap::new();
441 /// for i in 0..10 {
442 /// sm.insert(i);
443 /// }
444 /// assert_eq!(sm.len(), 10);
445 /// sm.clear();
446 /// assert_eq!(sm.len(), 0);
447 /// ```
448 pub fn clear(&mut self) {
449 self.drain();
450 }
451
452 /// Clears the slot map, returning all key-value pairs in arbitrary order
453 /// as an iterator. Keeps the allocated memory for reuse.
454 ///
455 /// When the iterator is dropped all elements in the slot map are removed,
456 /// even if the iterator was not fully consumed. If the iterator is not
457 /// dropped (using e.g. [`std::mem::forget`]), only the elements that were
458 /// iterated over are removed.
459 ///
460 /// # Examples
461 ///
462 /// ```
463 /// # use slotmap::*;
464 /// let mut sm = DenseSlotMap::new();
465 /// let k = sm.insert(0);
466 /// let v: Vec<_> = sm.drain().collect();
467 /// assert_eq!(sm.len(), 0);
468 /// assert_eq!(v, vec![(k, 0)]);
469 /// ```
470 pub fn drain(&mut self) -> Drain<K, V> {
471 Drain { sm: self }
472 }
473
474 /// Returns a reference to the value corresponding to the key.
475 ///
476 /// # Examples
477 ///
478 /// ```
479 /// # use slotmap::*;
480 /// let mut sm = DenseSlotMap::new();
481 /// let key = sm.insert("bar");
482 /// assert_eq!(sm.get(key), Some(&"bar"));
483 /// sm.remove(key);
484 /// assert_eq!(sm.get(key), None);
485 /// ```
486 pub fn get(&self, key: K) -> Option<&V> {
487 let kd = key.data();
488 self.slots
489 .get(kd.idx as usize)
490 .filter(|slot| slot.version == kd.version.get())
491 .map(|slot| unsafe {
492 // This is safe because we only store valid indices.
493 let idx = slot.idx_or_free as usize;
494 self.values.get_unchecked(idx)
495 })
496 }
497
498 /// Returns a reference to the value corresponding to the key without
499 /// version or bounds checking.
500 ///
501 /// # Safety
502 ///
503 /// This should only be used if `contains_key(key)` is true. Otherwise it is
504 /// potentially unsafe.
505 ///
506 /// # Examples
507 ///
508 /// ```
509 /// # use slotmap::*;
510 /// let mut sm = DenseSlotMap::new();
511 /// let key = sm.insert("bar");
512 /// assert_eq!(unsafe { sm.get_unchecked(key) }, &"bar");
513 /// sm.remove(key);
514 /// // sm.get_unchecked(key) is now dangerous!
515 /// ```
516 pub unsafe fn get_unchecked(&self, key: K) -> &V {
517 debug_assert!(self.contains_key(key));
518 let idx = self.slots.get_unchecked(key.data().idx as usize).idx_or_free;
519 &self.values.get_unchecked(idx as usize)
520 }
521
522 /// Returns a mutable reference to the value corresponding to the key.
523 ///
524 /// # Examples
525 ///
526 /// ```
527 /// # use slotmap::*;
528 /// let mut sm = DenseSlotMap::new();
529 /// let key = sm.insert(3.5);
530 /// if let Some(x) = sm.get_mut(key) {
531 /// *x += 3.0;
532 /// }
533 /// assert_eq!(sm[key], 6.5);
534 /// ```
535 pub fn get_mut(&mut self, key: K) -> Option<&mut V> {
536 let kd = key.data();
537 self.slots
538 .get(kd.idx as usize)
539 .filter(|slot| slot.version == kd.version.get())
540 .map(|slot| slot.idx_or_free as usize)
541 .map(move |idx| unsafe {
542 // This is safe because we only store valid indices.
543 self.values.get_unchecked_mut(idx)
544 })
545 }
546
547 /// Returns a mutable reference to the value corresponding to the key
548 /// without version or bounds checking.
549 ///
550 /// # Safety
551 ///
552 /// This should only be used if `contains_key(key)` is true. Otherwise it is
553 /// potentially unsafe.
554 ///
555 /// # Examples
556 ///
557 /// ```
558 /// # use slotmap::*;
559 /// let mut sm = DenseSlotMap::new();
560 /// let key = sm.insert("foo");
561 /// unsafe { *sm.get_unchecked_mut(key) = "bar" };
562 /// assert_eq!(sm[key], "bar");
563 /// sm.remove(key);
564 /// // sm.get_unchecked_mut(key) is now dangerous!
565 /// ```
566 pub unsafe fn get_unchecked_mut(&mut self, key: K) -> &mut V {
567 debug_assert!(self.contains_key(key));
568 let idx = self.slots.get_unchecked(key.data().idx as usize).idx_or_free;
569 self.values.get_unchecked_mut(idx as usize)
570 }
571
572 /// Returns mutable references to the values corresponding to the given
573 /// keys. All keys must be valid and disjoint, otherwise [`None`] is
574 /// returned.
575 ///
576 /// Requires at least stable Rust version 1.51.
577 ///
578 /// # Examples
579 ///
580 /// ```
581 /// # use slotmap::*;
582 /// let mut sm = DenseSlotMap::new();
583 /// let ka = sm.insert("butter");
584 /// let kb = sm.insert("apples");
585 /// let kc = sm.insert("charlie");
586 /// sm.remove(kc); // Make key c invalid.
587 /// assert_eq!(sm.get_disjoint_mut([ka, kb, kc]), None); // Has invalid key.
588 /// assert_eq!(sm.get_disjoint_mut([ka, ka]), None); // Not disjoint.
589 /// let [a, b] = sm.get_disjoint_mut([ka, kb]).unwrap();
590 /// std::mem::swap(a, b);
591 /// assert_eq!(sm[ka], "apples");
592 /// assert_eq!(sm[kb], "butter");
593 /// ```
594 #[cfg(has_min_const_generics)]
595 pub fn get_disjoint_mut<const N: usize>(&mut self, keys: [K; N]) -> Option<[&mut V; N]> {
596 // Create an uninitialized array of `MaybeUninit`. The `assume_init` is
597 // safe because the type we are claiming to have initialized here is a
598 // bunch of `MaybeUninit`s, which do not require initialization.
599 let mut ptrs: [MaybeUninit<*mut V>; N] = unsafe { MaybeUninit::uninit().assume_init() };
600
601 let mut i = 0;
602 while i < N {
603 // We can avoid this clone after min_const_generics and array_map.
604 let kd = keys[i].data();
605 if !self.contains_key(kd.into()) {
606 break;
607 }
608
609 // This key is valid, and thus the slot is occupied. Temporarily
610 // mark it as unoccupied so duplicate keys would show up as invalid.
611 // This gives us a linear time disjointness check.
612 unsafe {
613 let slot = self.slots.get_unchecked_mut(kd.idx as usize);
614 slot.version ^= 1;
615 let ptr = self.values.get_unchecked_mut(slot.idx_or_free as usize);
616 ptrs[i] = MaybeUninit::new(ptr);
617 }
618 i += 1;
619 }
620
621 // Undo temporary unoccupied markings.
622 for k in &keys[..i] {
623 let idx = k.data().idx as usize;
624 unsafe {
625 self.slots.get_unchecked_mut(idx).version ^= 1;
626 }
627 }
628
629 if i == N {
630 // All were valid and disjoint.
631 Some(unsafe { core::mem::transmute_copy::<_, [&mut V; N]>(&ptrs) })
632 } else {
633 None
634 }
635 }
636
637 /// Returns mutable references to the values corresponding to the given
638 /// keys. All keys must be valid and disjoint.
639 ///
640 /// Requires at least stable Rust version 1.51.
641 ///
642 /// # Safety
643 ///
644 /// This should only be used if `contains_key(key)` is true for every given
645 /// key and no two keys are equal. Otherwise it is potentially unsafe.
646 ///
647 /// # Examples
648 ///
649 /// ```
650 /// # use slotmap::*;
651 /// let mut sm = DenseSlotMap::new();
652 /// let ka = sm.insert("butter");
653 /// let kb = sm.insert("apples");
654 /// let [a, b] = unsafe { sm.get_disjoint_unchecked_mut([ka, kb]) };
655 /// std::mem::swap(a, b);
656 /// assert_eq!(sm[ka], "apples");
657 /// assert_eq!(sm[kb], "butter");
658 /// ```
659 #[cfg(has_min_const_generics)]
660 pub unsafe fn get_disjoint_unchecked_mut<const N: usize>(
661 &mut self,
662 keys: [K; N],
663 ) -> [&mut V; N] {
664 // Safe, see get_disjoint_mut.
665 let mut ptrs: [MaybeUninit<*mut V>; N] = MaybeUninit::uninit().assume_init();
666 for i in 0..N {
667 ptrs[i] = MaybeUninit::new(self.get_unchecked_mut(keys[i]));
668 }
669 core::mem::transmute_copy::<_, [&mut V; N]>(&ptrs)
670 }
671
672 /// An iterator visiting all key-value pairs in arbitrary order. The
673 /// iterator element type is `(K, &'a V)`.
674 ///
675 /// # Examples
676 ///
677 /// ```
678 /// # use slotmap::*;
679 /// let mut sm = DenseSlotMap::new();
680 /// let k0 = sm.insert(0);
681 /// let k1 = sm.insert(1);
682 /// let k2 = sm.insert(2);
683 ///
684 /// let mut it = sm.iter();
685 /// for (k, v) in sm.iter() {
686 /// println!("key: {:?}, val: {}", k, v);
687 /// }
688 /// ```
689 pub fn iter(&self) -> Iter<K, V> {
690 Iter {
691 inner_keys: self.keys.iter(),
692 inner_values: self.values.iter(),
693 }
694 }
695
696 /// An iterator visiting all key-value pairs in arbitrary order, with
697 /// mutable references to the values. The iterator element type is
698 /// `(K, &'a mut V)`.
699 ///
700 /// # Examples
701 ///
702 /// ```
703 /// # use slotmap::*;
704 /// let mut sm = DenseSlotMap::new();
705 /// let k0 = sm.insert(10);
706 /// let k1 = sm.insert(20);
707 /// let k2 = sm.insert(30);
708 ///
709 /// for (k, v) in sm.iter_mut() {
710 /// if k != k1 {
711 /// *v *= -1;
712 /// }
713 /// }
714 ///
715 /// assert_eq!(sm[k0], -10);
716 /// assert_eq!(sm[k1], 20);
717 /// assert_eq!(sm[k2], -30);
718 /// ```
719 pub fn iter_mut(&mut self) -> IterMut<K, V> {
720 IterMut {
721 inner_keys: self.keys.iter(),
722 inner_values: self.values.iter_mut(),
723 }
724 }
725
726 /// An iterator visiting all keys in arbitrary order. The iterator element
727 /// type is K.
728 ///
729 /// # Examples
730 ///
731 /// ```
732 /// # use slotmap::*;
733 /// # use std::collections::HashSet;
734 /// let mut sm = DenseSlotMap::new();
735 /// let k0 = sm.insert(10);
736 /// let k1 = sm.insert(20);
737 /// let k2 = sm.insert(30);
738 /// let keys: HashSet<_> = sm.keys().collect();
739 /// let check: HashSet<_> = vec![k0, k1, k2].into_iter().collect();
740 /// assert_eq!(keys, check);
741 /// ```
742 pub fn keys(&self) -> Keys<K, V> {
743 Keys { inner: self.iter() }
744 }
745
746 /// An iterator visiting all values in arbitrary order. The iterator element
747 /// type is `&'a V`.
748 ///
749 /// # Examples
750 ///
751 /// ```
752 /// # use slotmap::*;
753 /// # use std::collections::HashSet;
754 /// let mut sm = DenseSlotMap::new();
755 /// let k0 = sm.insert(10);
756 /// let k1 = sm.insert(20);
757 /// let k2 = sm.insert(30);
758 /// let values: HashSet<_> = sm.values().collect();
759 /// let check: HashSet<_> = vec![&10, &20, &30].into_iter().collect();
760 /// assert_eq!(values, check);
761 /// ```
762 pub fn values(&self) -> Values<K, V> {
763 Values { inner: self.iter() }
764 }
765
766 /// An iterator visiting all values mutably in arbitrary order. The iterator
767 /// element type is `&'a mut V`.
768 ///
769 /// # Examples
770 ///
771 /// ```
772 /// # use slotmap::*;
773 /// # use std::collections::HashSet;
774 /// let mut sm = DenseSlotMap::new();
775 /// sm.insert(1);
776 /// sm.insert(2);
777 /// sm.insert(3);
778 /// sm.values_mut().for_each(|n| { *n *= 3 });
779 /// let values: HashSet<_> = sm.into_iter().map(|(_k, v)| v).collect();
780 /// let check: HashSet<_> = vec![3, 6, 9].into_iter().collect();
781 /// assert_eq!(values, check);
782 /// ```
783 pub fn values_mut(&mut self) -> ValuesMut<K, V> {
784 ValuesMut {
785 inner: self.iter_mut(),
786 }
787 }
788}
789
790impl<K: Key, V> Clone for DenseSlotMap<K, V>
791where
792 V: Clone,
793{
794 fn clone(&self) -> Self {
795 Self {
796 keys: self.keys.clone(),
797 values: self.values.clone(),
798 slots: self.slots.clone(),
799 ..*self
800 }
801 }
802
803 fn clone_from(&mut self, source: &Self) {
804 self.keys.clone_from(&source.keys);
805 self.values.clone_from(&source.values);
806 self.slots.clone_from(&source.slots);
807 self.free_head = source.free_head;
808 }
809}
810
811impl<K: Key, V> Default for DenseSlotMap<K, V> {
812 fn default() -> Self {
813 Self::with_key()
814 }
815}
816
817impl<K: Key, V> Index<K> for DenseSlotMap<K, V> {
818 type Output = V;
819
820 fn index(&self, key: K) -> &V {
821 match self.get(key) {
822 Some(r: &V) => r,
823 None => panic!("invalid DenseSlotMap key used"),
824 }
825 }
826}
827
828impl<K: Key, V> IndexMut<K> for DenseSlotMap<K, V> {
829 fn index_mut(&mut self, key: K) -> &mut V {
830 match self.get_mut(key) {
831 Some(r: &mut V) => r,
832 None => panic!("invalid DenseSlotMap key used"),
833 }
834 }
835}
836
837// Iterators.
838/// A draining iterator for [`DenseSlotMap`].
839///
840/// This iterator is created by [`DenseSlotMap::drain`].
841#[derive(Debug)]
842pub struct Drain<'a, K: 'a + Key, V: 'a> {
843 sm: &'a mut DenseSlotMap<K, V>,
844}
845
846/// An iterator that moves key-value pairs out of a [`DenseSlotMap`].
847///
848/// This iterator is created by calling the `into_iter` method on [`DenseSlotMap`],
849/// provided by the [`IntoIterator`] trait.
850#[derive(Debug, Clone)]
851pub struct IntoIter<K, V> {
852 inner_keys: alloc::vec::IntoIter<K>,
853 inner_values: alloc::vec::IntoIter<V>,
854}
855
856/// An iterator over the key-value pairs in a [`DenseSlotMap`].
857///
858/// This iterator is created by [`DenseSlotMap::iter`].
859#[derive(Debug)]
860pub struct Iter<'a, K: 'a + Key, V: 'a> {
861 inner_keys: core::slice::Iter<'a, K>,
862 inner_values: core::slice::Iter<'a, V>,
863}
864
865impl<'a, K: 'a + Key, V: 'a> Clone for Iter<'a, K, V> {
866 fn clone(&self) -> Self {
867 Iter {
868 inner_keys: self.inner_keys.clone(),
869 inner_values: self.inner_values.clone(),
870 }
871 }
872}
873
874/// A mutable iterator over the key-value pairs in a [`DenseSlotMap`].
875///
876/// This iterator is created by [`DenseSlotMap::iter_mut`].
877#[derive(Debug)]
878pub struct IterMut<'a, K: 'a + Key, V: 'a> {
879 inner_keys: core::slice::Iter<'a, K>,
880 inner_values: core::slice::IterMut<'a, V>,
881}
882
883/// An iterator over the keys in a [`DenseSlotMap`].
884///
885/// This iterator is created by [`DenseSlotMap::keys`].
886#[derive(Debug)]
887pub struct Keys<'a, K: 'a + Key, V> {
888 inner: Iter<'a, K, V>,
889}
890
891impl<'a, K: 'a + Key, V: 'a> Clone for Keys<'a, K, V> {
892 fn clone(&self) -> Self {
893 Keys {
894 inner: self.inner.clone(),
895 }
896 }
897}
898
899/// An iterator over the values in a [`DenseSlotMap`].
900///
901/// This iterator is created by [`DenseSlotMap::values`].
902#[derive(Debug)]
903pub struct Values<'a, K: 'a + Key, V> {
904 inner: Iter<'a, K, V>,
905}
906
907impl<'a, K: 'a + Key, V: 'a> Clone for Values<'a, K, V> {
908 fn clone(&self) -> Self {
909 Values {
910 inner: self.inner.clone(),
911 }
912 }
913}
914
915/// A mutable iterator over the values in a [`DenseSlotMap`].
916///
917/// This iterator is created by [`DenseSlotMap::values_mut`].
918#[derive(Debug)]
919pub struct ValuesMut<'a, K: 'a + Key, V: 'a> {
920 inner: IterMut<'a, K, V>,
921}
922
923impl<'a, K: Key, V> Iterator for Drain<'a, K, V> {
924 type Item = (K, V);
925
926 fn next(&mut self) -> Option<(K, V)> {
927 // We make no iteration order guarantees, so we just repeatedly pop.
928 let key: Option = self.sm.keys.pop();
929 let value: Option = self.sm.values.pop();
930
931 if let (Some(k: K), Some(v: V)) = (key, value) {
932 self.sm.free_slot(slot_idx:k.data().idx as usize);
933 Some((k, v))
934 } else {
935 None
936 }
937 }
938
939 fn size_hint(&self) -> (usize, Option<usize>) {
940 let len: usize = self.sm.keys.len();
941 (len, Some(len))
942 }
943}
944
945impl<'a, K: Key, V> Drop for Drain<'a, K, V> {
946 fn drop(&mut self) {
947 self.for_each(|_drop: (K, V)| {});
948 }
949}
950
951impl<K: Key, V> Iterator for IntoIter<K, V> {
952 type Item = (K, V);
953
954 fn next(&mut self) -> Option<(K, V)> {
955 let key: Option = self.inner_keys.next();
956 let value: Option = self.inner_values.next();
957
958 if let (Some(k: K), Some(v: V)) = (key, value) {
959 Some((k, v))
960 } else {
961 None
962 }
963 }
964
965 fn size_hint(&self) -> (usize, Option<usize>) {
966 self.inner_keys.size_hint()
967 }
968}
969
970impl<'a, K: 'a + Key, V> Iterator for Iter<'a, K, V> {
971 type Item = (K, &'a V);
972
973 fn next(&mut self) -> Option<(K, &'a V)> {
974 let key: Option<&K> = self.inner_keys.next();
975 let value: Option<&V> = self.inner_values.next();
976
977 if let (Some(k: &K), Some(v: &V)) = (key, value) {
978 Some((*k, v))
979 } else {
980 None
981 }
982 }
983
984 fn size_hint(&self) -> (usize, Option<usize>) {
985 self.inner_keys.size_hint()
986 }
987}
988
989impl<'a, K: 'a + Key, V> Iterator for IterMut<'a, K, V> {
990 type Item = (K, &'a mut V);
991
992 fn next(&mut self) -> Option<(K, &'a mut V)> {
993 let key: Option<&K> = self.inner_keys.next();
994 let value: Option<&mut V> = self.inner_values.next();
995
996 if let (Some(k: &K), Some(v: &mut V)) = (key, value) {
997 Some((*k, v))
998 } else {
999 None
1000 }
1001 }
1002
1003 fn size_hint(&self) -> (usize, Option<usize>) {
1004 self.inner_keys.size_hint()
1005 }
1006}
1007
1008impl<'a, K: 'a + Key, V> Iterator for Keys<'a, K, V> {
1009 type Item = K;
1010
1011 fn next(&mut self) -> Option<K> {
1012 self.inner.next().map(|(key: K, _)| key)
1013 }
1014
1015 fn size_hint(&self) -> (usize, Option<usize>) {
1016 self.inner.size_hint()
1017 }
1018}
1019
1020impl<'a, K: 'a + Key, V> Iterator for Values<'a, K, V> {
1021 type Item = &'a V;
1022
1023 fn next(&mut self) -> Option<&'a V> {
1024 self.inner.next().map(|(_, value: &V)| value)
1025 }
1026
1027 fn size_hint(&self) -> (usize, Option<usize>) {
1028 self.inner.size_hint()
1029 }
1030}
1031
1032impl<'a, K: 'a + Key, V> Iterator for ValuesMut<'a, K, V> {
1033 type Item = &'a mut V;
1034
1035 fn next(&mut self) -> Option<&'a mut V> {
1036 self.inner.next().map(|(_, value: &mut V)| value)
1037 }
1038
1039 fn size_hint(&self) -> (usize, Option<usize>) {
1040 self.inner.size_hint()
1041 }
1042}
1043
1044impl<'a, K: 'a + Key, V> IntoIterator for &'a DenseSlotMap<K, V> {
1045 type Item = (K, &'a V);
1046 type IntoIter = Iter<'a, K, V>;
1047
1048 fn into_iter(self) -> Self::IntoIter {
1049 self.iter()
1050 }
1051}
1052
1053impl<'a, K: 'a + Key, V> IntoIterator for &'a mut DenseSlotMap<K, V> {
1054 type Item = (K, &'a mut V);
1055 type IntoIter = IterMut<'a, K, V>;
1056
1057 fn into_iter(self) -> Self::IntoIter {
1058 self.iter_mut()
1059 }
1060}
1061
1062impl<K: Key, V> IntoIterator for DenseSlotMap<K, V> {
1063 type Item = (K, V);
1064 type IntoIter = IntoIter<K, V>;
1065
1066 fn into_iter(self) -> Self::IntoIter {
1067 IntoIter {
1068 inner_keys: self.keys.into_iter(),
1069 inner_values: self.values.into_iter(),
1070 }
1071 }
1072}
1073
1074impl<'a, K: 'a + Key, V> FusedIterator for Iter<'a, K, V> {}
1075impl<'a, K: 'a + Key, V> FusedIterator for IterMut<'a, K, V> {}
1076impl<'a, K: 'a + Key, V> FusedIterator for Keys<'a, K, V> {}
1077impl<'a, K: 'a + Key, V> FusedIterator for Values<'a, K, V> {}
1078impl<'a, K: 'a + Key, V> FusedIterator for ValuesMut<'a, K, V> {}
1079impl<'a, K: 'a + Key, V> FusedIterator for Drain<'a, K, V> {}
1080impl<K: Key, V> FusedIterator for IntoIter<K, V> {}
1081
1082impl<'a, K: 'a + Key, V> ExactSizeIterator for Iter<'a, K, V> {}
1083impl<'a, K: 'a + Key, V> ExactSizeIterator for IterMut<'a, K, V> {}
1084impl<'a, K: 'a + Key, V> ExactSizeIterator for Keys<'a, K, V> {}
1085impl<'a, K: 'a + Key, V> ExactSizeIterator for Values<'a, K, V> {}
1086impl<'a, K: 'a + Key, V> ExactSizeIterator for ValuesMut<'a, K, V> {}
1087impl<'a, K: 'a + Key, V> ExactSizeIterator for Drain<'a, K, V> {}
1088impl<K: Key, V> ExactSizeIterator for IntoIter<K, V> {}
1089
1090// Serialization with serde.
1091#[cfg(feature = "serde")]
1092mod serialize {
1093 use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
1094
1095 use super::*;
1096
1097 #[derive(Serialize, Deserialize)]
1098 struct SerdeSlot<T> {
1099 value: Option<T>,
1100 version: u32,
1101 }
1102
1103 impl<K: Key, V: Serialize> Serialize for DenseSlotMap<K, V> {
1104 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1105 where
1106 S: Serializer,
1107 {
1108 let serde_slots: Vec<_> = self
1109 .slots
1110 .iter()
1111 .map(|slot| SerdeSlot {
1112 value: if slot.version % 2 == 1 {
1113 self.values.get(slot.idx_or_free as usize)
1114 } else {
1115 None
1116 },
1117 version: slot.version,
1118 })
1119 .collect();
1120 serde_slots.serialize(serializer)
1121 }
1122 }
1123
1124 impl<'de, K: Key, V: Deserialize<'de>> Deserialize<'de> for DenseSlotMap<K, V> {
1125 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1126 where
1127 D: Deserializer<'de>,
1128 {
1129 let serde_slots: Vec<SerdeSlot<V>> = Deserialize::deserialize(deserializer)?;
1130 if serde_slots.len() >= u32::max_value() as usize {
1131 return Err(de::Error::custom(&"too many slots"));
1132 }
1133
1134 // Ensure the first slot exists and is empty for the sentinel.
1135 if serde_slots.get(0).map_or(true, |slot| slot.version % 2 == 1) {
1136 return Err(de::Error::custom(&"first slot not empty"));
1137 }
1138
1139 // Rebuild slots, key and values.
1140 let mut keys = Vec::new();
1141 let mut values = Vec::new();
1142 let mut slots = Vec::new();
1143 slots.push(Slot {
1144 idx_or_free: 0,
1145 version: 0,
1146 });
1147
1148 let mut next_free = serde_slots.len();
1149 for (i, serde_slot) in serde_slots.into_iter().enumerate().skip(1) {
1150 let occupied = serde_slot.version % 2 == 1;
1151 if occupied ^ serde_slot.value.is_some() {
1152 return Err(de::Error::custom(&"inconsistent occupation in Slot"));
1153 }
1154
1155 if let Some(value) = serde_slot.value {
1156 let kd = KeyData::new(i as u32, serde_slot.version);
1157 keys.push(kd.into());
1158 values.push(value);
1159 slots.push(Slot {
1160 version: serde_slot.version,
1161 idx_or_free: (keys.len() - 1) as u32,
1162 });
1163 } else {
1164 slots.push(Slot {
1165 version: serde_slot.version,
1166 idx_or_free: next_free as u32,
1167 });
1168 next_free = i;
1169 }
1170 }
1171
1172 Ok(DenseSlotMap {
1173 keys,
1174 values,
1175 slots,
1176 free_head: next_free as u32,
1177 })
1178 }
1179 }
1180}
1181
1182#[cfg(test)]
1183mod tests {
1184 use std::collections::{HashMap, HashSet};
1185
1186 use quickcheck::quickcheck;
1187
1188 use super::*;
1189
1190 #[derive(Clone)]
1191 struct CountDrop<'a>(&'a core::cell::RefCell<usize>);
1192
1193 impl<'a> Drop for CountDrop<'a> {
1194 fn drop(&mut self) {
1195 *self.0.borrow_mut() += 1;
1196 }
1197 }
1198
1199 #[test]
1200 fn check_drops() {
1201 let drops = core::cell::RefCell::new(0usize);
1202
1203 {
1204 let mut clone = {
1205 // Insert 1000 items.
1206 let mut sm = DenseSlotMap::new();
1207 let mut sm_keys = Vec::new();
1208 for _ in 0..1000 {
1209 sm_keys.push(sm.insert(CountDrop(&drops)));
1210 }
1211
1212 // Remove even keys.
1213 for i in (0..1000).filter(|i| i % 2 == 0) {
1214 sm.remove(sm_keys[i]);
1215 }
1216
1217 // Should only have dropped 500 so far.
1218 assert_eq!(*drops.borrow(), 500);
1219
1220 // Let's clone ourselves and then die.
1221 sm.clone()
1222 };
1223
1224 // Now all original items should have been dropped exactly once.
1225 assert_eq!(*drops.borrow(), 1000);
1226
1227 // Re-use some empty slots.
1228 for _ in 0..250 {
1229 clone.insert(CountDrop(&drops));
1230 }
1231 }
1232
1233 // 1000 + 750 drops in total should have happened.
1234 assert_eq!(*drops.borrow(), 1750);
1235 }
1236
1237 #[cfg(all(nightly, feature = "unstable"))]
1238 #[test]
1239 fn disjoint() {
1240 // Intended to be run with miri to find any potential UB.
1241 let mut sm = DenseSlotMap::new();
1242
1243 // Some churn.
1244 for i in 0..20usize {
1245 sm.insert(i);
1246 }
1247 sm.retain(|_, i| *i % 2 == 0);
1248
1249 let keys: Vec<_> = sm.keys().collect();
1250 for i in 0..keys.len() {
1251 for j in 0..keys.len() {
1252 if let Some([r0, r1]) = sm.get_disjoint_mut([keys[i], keys[j]]) {
1253 *r0 ^= *r1;
1254 *r1 = r1.wrapping_add(*r0);
1255 } else {
1256 assert!(i == j);
1257 }
1258 }
1259 }
1260
1261 for i in 0..keys.len() {
1262 for j in 0..keys.len() {
1263 for k in 0..keys.len() {
1264 if let Some([r0, r1, r2]) = sm.get_disjoint_mut([keys[i], keys[j], keys[k]]) {
1265 *r0 ^= *r1;
1266 *r0 = r0.wrapping_add(*r2);
1267 *r1 ^= *r0;
1268 *r1 = r1.wrapping_add(*r2);
1269 *r2 ^= *r0;
1270 *r2 = r2.wrapping_add(*r1);
1271 } else {
1272 assert!(i == j || j == k || i == k);
1273 }
1274 }
1275 }
1276 }
1277 }
1278
1279 quickcheck! {
1280 fn qc_slotmap_equiv_hashmap(operations: Vec<(u8, u32)>) -> bool {
1281 let mut hm = HashMap::new();
1282 let mut hm_keys = Vec::new();
1283 let mut unique_key = 0u32;
1284 let mut sm = DenseSlotMap::new();
1285 let mut sm_keys = Vec::new();
1286
1287 #[cfg(not(feature = "serde"))]
1288 let num_ops = 3;
1289 #[cfg(feature = "serde")]
1290 let num_ops = 4;
1291
1292 for (op, val) in operations {
1293 match op % num_ops {
1294 // Insert.
1295 0 => {
1296 hm.insert(unique_key, val);
1297 hm_keys.push(unique_key);
1298 unique_key += 1;
1299
1300 sm_keys.push(sm.insert(val));
1301 }
1302
1303 // Delete.
1304 1 => {
1305 // 10% of the time test clear.
1306 if val % 10 == 0 {
1307 let hmvals: HashSet<_> = hm.drain().map(|(_, v)| v).collect();
1308 let smvals: HashSet<_> = sm.drain().map(|(_, v)| v).collect();
1309 if hmvals != smvals {
1310 return false;
1311 }
1312 }
1313 if hm_keys.is_empty() { continue; }
1314
1315 let idx = val as usize % hm_keys.len();
1316 if hm.remove(&hm_keys[idx]) != sm.remove(sm_keys[idx]) {
1317 return false;
1318 }
1319 }
1320
1321 // Access.
1322 2 => {
1323 if hm_keys.is_empty() { continue; }
1324 let idx = val as usize % hm_keys.len();
1325 let (hm_key, sm_key) = (&hm_keys[idx], sm_keys[idx]);
1326
1327 if hm.contains_key(hm_key) != sm.contains_key(sm_key) ||
1328 hm.get(hm_key) != sm.get(sm_key) {
1329 return false;
1330 }
1331 }
1332
1333 // Serde round-trip.
1334 #[cfg(feature = "serde")]
1335 3 => {
1336 let ser = serde_json::to_string(&sm).unwrap();
1337 sm = serde_json::from_str(&ser).unwrap();
1338 }
1339
1340 _ => unreachable!(),
1341 }
1342 }
1343
1344 let mut smv: Vec<_> = sm.values().collect();
1345 let mut hmv: Vec<_> = hm.values().collect();
1346 smv.sort();
1347 hmv.sort();
1348 smv == hmv
1349 }
1350 }
1351
1352 #[cfg(feature = "serde")]
1353 #[test]
1354 fn slotmap_serde() {
1355 let mut sm = DenseSlotMap::new();
1356 // Self-referential structure.
1357 let first = sm.insert_with_key(|k| (k, 23i32));
1358 let second = sm.insert((first, 42));
1359
1360 // Make some empty slots.
1361 let empties = vec![sm.insert((first, 0)), sm.insert((first, 0))];
1362 empties.iter().for_each(|k| {
1363 sm.remove(*k);
1364 });
1365
1366 let third = sm.insert((second, 0));
1367 sm[first].0 = third;
1368
1369 let ser = serde_json::to_string(&sm).unwrap();
1370 let de: DenseSlotMap<DefaultKey, (DefaultKey, i32)> = serde_json::from_str(&ser).unwrap();
1371 assert_eq!(de.len(), sm.len());
1372
1373 let mut smkv: Vec<_> = sm.iter().collect();
1374 let mut dekv: Vec<_> = de.iter().collect();
1375 smkv.sort();
1376 dekv.sort();
1377 assert_eq!(smkv, dekv);
1378 }
1379
1380 #[cfg(feature = "serde")]
1381 #[test]
1382 fn slotmap_serde_freelist() {
1383 let mut sm = DenseSlotMap::new();
1384 let k0 = sm.insert(5i32);
1385 let k1 = sm.insert(5i32);
1386 sm.remove(k0);
1387 sm.remove(k1);
1388
1389 let ser = serde_json::to_string(&sm).unwrap();
1390 let mut de: DenseSlotMap<DefaultKey, i32> = serde_json::from_str(&ser).unwrap();
1391
1392 de.insert(0);
1393 de.insert(1);
1394 de.insert(2);
1395 assert_eq!(de.len(), 3);
1396 }
1397}
1398