1 #![cfg_attr(not(feature = "std"), no_std)]
2 #![warn(
3     missing_debug_implementations,
4     missing_docs,
5     rust_2018_idioms,
6     unreachable_pub
7 )]
8 #![doc(test(
9     no_crate_inject,
10     attr(deny(warnings, rust_2018_idioms), allow(dead_code, unused_variables))
11 ))]
12 
13 //! Pre-allocated storage for a uniform data type.
14 //!
15 //! `Slab` provides pre-allocated storage for a single data type. If many values
16 //! of a single type are being allocated, it can be more efficient to
17 //! pre-allocate the necessary storage. Since the size of the type is uniform,
18 //! memory fragmentation can be avoided. Storing, clearing, and lookup
19 //! operations become very cheap.
20 //!
21 //! While `Slab` may look like other Rust collections, it is not intended to be
22 //! used as a general purpose collection. The primary difference between `Slab`
23 //! and `Vec` is that `Slab` returns the key when storing the value.
24 //!
25 //! It is important to note that keys may be reused. In other words, once a
26 //! value associated with a given key is removed from a slab, that key may be
27 //! returned from future calls to `insert`.
28 //!
29 //! # Examples
30 //!
31 //! Basic storing and retrieval.
32 //!
33 //! ```
34 //! # use slab::*;
35 //! let mut slab = Slab::new();
36 //!
37 //! let hello = slab.insert("hello");
38 //! let world = slab.insert("world");
39 //!
40 //! assert_eq!(slab[hello], "hello");
41 //! assert_eq!(slab[world], "world");
42 //!
43 //! slab[world] = "earth";
44 //! assert_eq!(slab[world], "earth");
45 //! ```
46 //!
47 //! Sometimes it is useful to be able to associate the key with the value being
48 //! inserted in the slab. This can be done with the `vacant_entry` API as such:
49 //!
50 //! ```
51 //! # use slab::*;
52 //! let mut slab = Slab::new();
53 //!
54 //! let hello = {
55 //!     let entry = slab.vacant_entry();
56 //!     let key = entry.key();
57 //!
58 //!     entry.insert((key, "hello"));
59 //!     key
60 //! };
61 //!
62 //! assert_eq!(hello, slab[hello].0);
63 //! assert_eq!("hello", slab[hello].1);
64 //! ```
65 //!
66 //! It is generally a good idea to specify the desired capacity of a slab at
67 //! creation time. Note that `Slab` will grow the internal capacity when
68 //! attempting to insert a new value once the existing capacity has been reached.
69 //! To avoid this, add a check.
70 //!
71 //! ```
72 //! # use slab::*;
73 //! let mut slab = Slab::with_capacity(1024);
74 //!
75 //! // ... use the slab
76 //!
77 //! if slab.len() == slab.capacity() {
78 //!     panic!("slab full");
79 //! }
80 //!
81 //! slab.insert("the slab is not at capacity yet");
82 //! ```
83 //!
84 //! # Capacity and reallocation
85 //!
86 //! The capacity of a slab is the amount of space allocated for any future
87 //! values that will be inserted in the slab. This is not to be confused with
88 //! the *length* of the slab, which specifies the number of actual values
89 //! currently being inserted. If a slab's length is equal to its capacity, the
90 //! next value inserted into the slab will require growing the slab by
91 //! reallocating.
92 //!
93 //! For example, a slab with capacity 10 and length 0 would be an empty slab
94 //! with space for 10 more stored values. Storing 10 or fewer elements into the
95 //! slab will not change its capacity or cause reallocation to occur. However,
96 //! if the slab length is increased to 11 (due to another `insert`), it will
97 //! have to reallocate, which can be slow. For this reason, it is recommended to
98 //! use [`Slab::with_capacity`] whenever possible to specify how many values the
99 //! slab is expected to store.
100 //!
101 //! # Implementation
102 //!
103 //! `Slab` is backed by a `Vec` of slots. Each slot is either occupied or
104 //! vacant. `Slab` maintains a stack of vacant slots using a linked list. To
105 //! find a vacant slot, the stack is popped. When a slot is released, it is
106 //! pushed onto the stack.
107 //!
108 //! If there are no more available slots in the stack, then `Vec::reserve(1)` is
109 //! called and a new slot is created.
110 //!
111 //! [`Slab::with_capacity`]: struct.Slab.html#with_capacity
112 
113 #[cfg(not(feature = "std"))]
114 extern crate alloc;
115 #[cfg(feature = "std")]
116 extern crate std as alloc;
117 
118 #[cfg(feature = "serde")]
119 mod serde;
120 
121 mod builder;
122 
123 use alloc::vec::{self, Vec};
124 use core::iter::{self, FromIterator, FusedIterator};
125 use core::{fmt, mem, ops, slice};
126 
127 /// Pre-allocated storage for a uniform data type
128 ///
129 /// See the [module documentation] for more details.
130 ///
131 /// [module documentation]: index.html
132 pub struct Slab<T> {
133     // Chunk of memory
134     entries: Vec<Entry<T>>,
135 
136     // Number of Filled elements currently in the slab
137     len: usize,
138 
139     // Offset of the next available slot in the slab. Set to the slab's
140     // capacity when the slab is full.
141     next: usize,
142 }
143 
144 impl<T> Clone for Slab<T>
145 where
146     T: Clone,
147 {
clone(&self) -> Self148     fn clone(&self) -> Self {
149         Self {
150             entries: self.entries.clone(),
151             len: self.len,
152             next: self.next,
153         }
154     }
155 
clone_from(&mut self, source: &Self)156     fn clone_from(&mut self, source: &Self) {
157         self.entries.clone_from(&source.entries);
158         self.len = source.len;
159         self.next = source.next;
160     }
161 }
162 
163 impl<T> Default for Slab<T> {
default() -> Self164     fn default() -> Self {
165         Slab::new()
166     }
167 }
168 
169 /// A handle to a vacant entry in a `Slab`.
170 ///
171 /// `VacantEntry` allows constructing values with the key that they will be
172 /// assigned to.
173 ///
174 /// # Examples
175 ///
176 /// ```
177 /// # use slab::*;
178 /// let mut slab = Slab::new();
179 ///
180 /// let hello = {
181 ///     let entry = slab.vacant_entry();
182 ///     let key = entry.key();
183 ///
184 ///     entry.insert((key, "hello"));
185 ///     key
186 /// };
187 ///
188 /// assert_eq!(hello, slab[hello].0);
189 /// assert_eq!("hello", slab[hello].1);
190 /// ```
191 #[derive(Debug)]
192 pub struct VacantEntry<'a, T> {
193     slab: &'a mut Slab<T>,
194     key: usize,
195 }
196 
197 /// A consuming iterator over the values stored in a `Slab`
198 pub struct IntoIter<T> {
199     entries: iter::Enumerate<vec::IntoIter<Entry<T>>>,
200     len: usize,
201 }
202 
203 /// An iterator over the values stored in the `Slab`
204 pub struct Iter<'a, T> {
205     entries: iter::Enumerate<slice::Iter<'a, Entry<T>>>,
206     len: usize,
207 }
208 
209 impl<'a, T> Clone for Iter<'a, T> {
clone(&self) -> Self210     fn clone(&self) -> Self {
211         Self {
212             entries: self.entries.clone(),
213             len: self.len,
214         }
215     }
216 }
217 
218 /// A mutable iterator over the values stored in the `Slab`
219 pub struct IterMut<'a, T> {
220     entries: iter::Enumerate<slice::IterMut<'a, Entry<T>>>,
221     len: usize,
222 }
223 
224 /// A draining iterator for `Slab`
225 pub struct Drain<'a, T> {
226     inner: vec::Drain<'a, Entry<T>>,
227     len: usize,
228 }
229 
230 #[derive(Clone)]
231 enum Entry<T> {
232     Vacant(usize),
233     Occupied(T),
234 }
235 
236 impl<T> Slab<T> {
237     /// Construct a new, empty `Slab`.
238     ///
239     /// The function does not allocate and the returned slab will have no
240     /// capacity until `insert` is called or capacity is explicitly reserved.
241     ///
242     /// This is `const fn` on Rust 1.39+.
243     ///
244     /// # Examples
245     ///
246     /// ```
247     /// # use slab::*;
248     /// let slab: Slab<i32> = Slab::new();
249     /// ```
250     #[cfg(not(slab_no_const_vec_new))]
new() -> Self251     pub const fn new() -> Self {
252         Self {
253             entries: Vec::new(),
254             next: 0,
255             len: 0,
256         }
257     }
258     /// Construct a new, empty `Slab`.
259     ///
260     /// The function does not allocate and the returned slab will have no
261     /// capacity until `insert` is called or capacity is explicitly reserved.
262     ///
263     /// This is `const fn` on Rust 1.39+.
264     #[cfg(slab_no_const_vec_new)]
new() -> Self265     pub fn new() -> Self {
266         Self {
267             entries: Vec::new(),
268             next: 0,
269             len: 0,
270         }
271     }
272 
273     /// Construct a new, empty `Slab` with the specified capacity.
274     ///
275     /// The returned slab will be able to store exactly `capacity` without
276     /// reallocating. If `capacity` is 0, the slab will not allocate.
277     ///
278     /// It is important to note that this function does not specify the *length*
279     /// of the returned slab, but only the capacity. For an explanation of the
280     /// difference between length and capacity, see [Capacity and
281     /// reallocation](index.html#capacity-and-reallocation).
282     ///
283     /// # Examples
284     ///
285     /// ```
286     /// # use slab::*;
287     /// let mut slab = Slab::with_capacity(10);
288     ///
289     /// // The slab contains no values, even though it has capacity for more
290     /// assert_eq!(slab.len(), 0);
291     ///
292     /// // These are all done without reallocating...
293     /// for i in 0..10 {
294     ///     slab.insert(i);
295     /// }
296     ///
297     /// // ...but this may make the slab reallocate
298     /// slab.insert(11);
299     /// ```
with_capacity(capacity: usize) -> Slab<T>300     pub fn with_capacity(capacity: usize) -> Slab<T> {
301         Slab {
302             entries: Vec::with_capacity(capacity),
303             next: 0,
304             len: 0,
305         }
306     }
307 
308     /// Return the number of values the slab can store without reallocating.
309     ///
310     /// # Examples
311     ///
312     /// ```
313     /// # use slab::*;
314     /// let slab: Slab<i32> = Slab::with_capacity(10);
315     /// assert_eq!(slab.capacity(), 10);
316     /// ```
capacity(&self) -> usize317     pub fn capacity(&self) -> usize {
318         self.entries.capacity()
319     }
320 
321     /// Reserve capacity for at least `additional` more values to be stored
322     /// without allocating.
323     ///
324     /// `reserve` does nothing if the slab already has sufficient capacity for
325     /// `additional` more values. If more capacity is required, a new segment of
326     /// memory will be allocated and all existing values will be copied into it.
327     /// As such, if the slab is already very large, a call to `reserve` can end
328     /// up being expensive.
329     ///
330     /// The slab may reserve more than `additional` extra space in order to
331     /// avoid frequent reallocations. Use `reserve_exact` instead to guarantee
332     /// that only the requested space is allocated.
333     ///
334     /// # Panics
335     ///
336     /// Panics if the new capacity exceeds `isize::MAX` bytes.
337     ///
338     /// # Examples
339     ///
340     /// ```
341     /// # use slab::*;
342     /// let mut slab = Slab::new();
343     /// slab.insert("hello");
344     /// slab.reserve(10);
345     /// assert!(slab.capacity() >= 11);
346     /// ```
reserve(&mut self, additional: usize)347     pub fn reserve(&mut self, additional: usize) {
348         if self.capacity() - self.len >= additional {
349             return;
350         }
351         let need_add = additional - (self.entries.len() - self.len);
352         self.entries.reserve(need_add);
353     }
354 
355     /// Reserve the minimum capacity required to store exactly `additional`
356     /// more values.
357     ///
358     /// `reserve_exact` does nothing if the slab already has sufficient capacity
359     /// for `additional` more values. If more capacity is required, a new segment
360     /// of memory will be allocated and all existing values will be copied into
361     /// it.  As such, if the slab is already very large, a call to `reserve` can
362     /// end up being expensive.
363     ///
364     /// Note that the allocator may give the slab more space than it requests.
365     /// Therefore capacity can not be relied upon to be precisely minimal.
366     /// Prefer `reserve` if future insertions are expected.
367     ///
368     /// # Panics
369     ///
370     /// Panics if the new capacity exceeds `isize::MAX` bytes.
371     ///
372     /// # Examples
373     ///
374     /// ```
375     /// # use slab::*;
376     /// let mut slab = Slab::new();
377     /// slab.insert("hello");
378     /// slab.reserve_exact(10);
379     /// assert!(slab.capacity() >= 11);
380     /// ```
reserve_exact(&mut self, additional: usize)381     pub fn reserve_exact(&mut self, additional: usize) {
382         if self.capacity() - self.len >= additional {
383             return;
384         }
385         let need_add = additional - (self.entries.len() - self.len);
386         self.entries.reserve_exact(need_add);
387     }
388 
389     /// Shrink the capacity of the slab as much as possible without invalidating keys.
390     ///
391     /// Because values cannot be moved to a different index, the slab cannot
392     /// shrink past any stored values.
393     /// It will drop down as close as possible to the length but the allocator may
394     /// still inform the underlying vector that there is space for a few more elements.
395     ///
396     /// This function can take O(n) time even when the capacity cannot be reduced
397     /// or the allocation is shrunk in place. Repeated calls run in O(1) though.
398     ///
399     /// # Examples
400     ///
401     /// ```
402     /// # use slab::*;
403     /// let mut slab = Slab::with_capacity(10);
404     ///
405     /// for i in 0..3 {
406     ///     slab.insert(i);
407     /// }
408     ///
409     /// slab.shrink_to_fit();
410     /// assert!(slab.capacity() >= 3 && slab.capacity() < 10);
411     /// ```
412     ///
413     /// The slab cannot shrink past the last present value even if previous
414     /// values are removed:
415     ///
416     /// ```
417     /// # use slab::*;
418     /// let mut slab = Slab::with_capacity(10);
419     ///
420     /// for i in 0..4 {
421     ///     slab.insert(i);
422     /// }
423     ///
424     /// slab.remove(0);
425     /// slab.remove(3);
426     ///
427     /// slab.shrink_to_fit();
428     /// assert!(slab.capacity() >= 3 && slab.capacity() < 10);
429     /// ```
shrink_to_fit(&mut self)430     pub fn shrink_to_fit(&mut self) {
431         // Remove all vacant entries after the last occupied one, so that
432         // the capacity can be reduced to what is actually needed.
433         // If the slab is empty the vector can simply be cleared, but that
434         // optimization would not affect time complexity when T: Drop.
435         let len_before = self.entries.len();
436         while let Some(&Entry::Vacant(_)) = self.entries.last() {
437             self.entries.pop();
438         }
439 
440         // Removing entries breaks the list of vacant entries,
441         // so it must be repaired
442         if self.entries.len() != len_before {
443             // Some vacant entries were removed, so the list now likely¹
444             // either contains references to the removed entries, or has an
445             // invalid end marker. Fix this by recreating the list.
446             self.recreate_vacant_list();
447             // ¹: If the removed entries formed the tail of the list, with the
448             // most recently popped entry being the head of them, (so that its
449             // index is now the end marker) the list is still valid.
450             // Checking for that unlikely scenario of this infrequently called
451             // is not worth the code complexity.
452         }
453 
454         self.entries.shrink_to_fit();
455     }
456 
457     /// Iterate through all entries to recreate and repair the vacant list.
458     /// self.len must be correct and is not modified.
recreate_vacant_list(&mut self)459     fn recreate_vacant_list(&mut self) {
460         self.next = self.entries.len();
461         // We can stop once we've found all vacant entries
462         let mut remaining_vacant = self.entries.len() - self.len;
463         if remaining_vacant == 0 {
464             return;
465         }
466 
467         // Iterate in reverse order so that lower keys are at the start of
468         // the vacant list. This way future shrinks are more likely to be
469         // able to remove vacant entries.
470         for (i, entry) in self.entries.iter_mut().enumerate().rev() {
471             if let Entry::Vacant(ref mut next) = *entry {
472                 *next = self.next;
473                 self.next = i;
474                 remaining_vacant -= 1;
475                 if remaining_vacant == 0 {
476                     break;
477                 }
478             }
479         }
480     }
481 
482     /// Reduce the capacity as much as possible, changing the key for elements when necessary.
483     ///
484     /// To allow updating references to the elements which must be moved to a new key,
485     /// this function takes a closure which is called before moving each element.
486     /// The second and third parameters to the closure are the current key and
487     /// new key respectively.
488     /// In case changing the key for one element turns out not to be possible,
489     /// the move can be cancelled by returning `false` from the closure.
490     /// In that case no further attempts at relocating elements is made.
491     /// If the closure unwinds, the slab will be left in a consistent state,
492     /// but the value that the closure panicked on might be removed.
493     ///
494     /// # Examples
495     ///
496     /// ```
497     /// # use slab::*;
498     ///
499     /// let mut slab = Slab::with_capacity(10);
500     /// let a = slab.insert('a');
501     /// slab.insert('b');
502     /// slab.insert('c');
503     /// slab.remove(a);
504     /// slab.compact(|&mut value, from, to| {
505     ///     assert_eq!((value, from, to), ('c', 2, 0));
506     ///     true
507     /// });
508     /// assert!(slab.capacity() >= 2 && slab.capacity() < 10);
509     /// ```
510     ///
511     /// The value is not moved when the closure returns `Err`:
512     ///
513     /// ```
514     /// # use slab::*;
515     ///
516     /// let mut slab = Slab::with_capacity(100);
517     /// let a = slab.insert('a');
518     /// let b = slab.insert('b');
519     /// slab.remove(a);
520     /// slab.compact(|&mut value, from, to| false);
521     /// assert_eq!(slab.iter().next(), Some((b, &'b')));
522     /// ```
compact<F>(&mut self, mut rekey: F) where F: FnMut(&mut T, usize, usize) -> bool,523     pub fn compact<F>(&mut self, mut rekey: F)
524     where
525         F: FnMut(&mut T, usize, usize) -> bool,
526     {
527         // If the closure unwinds, we need to restore a valid list of vacant entries
528         struct CleanupGuard<'a, T> {
529             slab: &'a mut Slab<T>,
530             decrement: bool,
531         }
532         impl<T> Drop for CleanupGuard<'_, T> {
533             fn drop(&mut self) {
534                 if self.decrement {
535                     // Value was popped and not pushed back on
536                     self.slab.len -= 1;
537                 }
538                 self.slab.recreate_vacant_list();
539             }
540         }
541         let mut guard = CleanupGuard {
542             slab: self,
543             decrement: true,
544         };
545 
546         let mut occupied_until = 0;
547         // While there are vacant entries
548         while guard.slab.entries.len() > guard.slab.len {
549             // Find a value that needs to be moved,
550             // by popping entries until we find an occupied one.
551             // (entries cannot be empty because 0 is not greater than anything)
552             if let Some(Entry::Occupied(mut value)) = guard.slab.entries.pop() {
553                 // Found one, now find a vacant entry to move it to
554                 while let Some(&Entry::Occupied(_)) = guard.slab.entries.get(occupied_until) {
555                     occupied_until += 1;
556                 }
557                 // Let the caller try to update references to the key
558                 if !rekey(&mut value, guard.slab.entries.len(), occupied_until) {
559                     // Changing the key failed, so push the entry back on at its old index.
560                     guard.slab.entries.push(Entry::Occupied(value));
561                     guard.decrement = false;
562                     guard.slab.entries.shrink_to_fit();
563                     return;
564                     // Guard drop handles cleanup
565                 }
566                 // Put the value in its new spot
567                 guard.slab.entries[occupied_until] = Entry::Occupied(value);
568                 // ... and mark it as occupied (this is optional)
569                 occupied_until += 1;
570             }
571         }
572         guard.slab.next = guard.slab.len;
573         guard.slab.entries.shrink_to_fit();
574         // Normal cleanup is not necessary
575         mem::forget(guard);
576     }
577 
578     /// Clear the slab of all values.
579     ///
580     /// # Examples
581     ///
582     /// ```
583     /// # use slab::*;
584     /// let mut slab = Slab::new();
585     ///
586     /// for i in 0..3 {
587     ///     slab.insert(i);
588     /// }
589     ///
590     /// slab.clear();
591     /// assert!(slab.is_empty());
592     /// ```
clear(&mut self)593     pub fn clear(&mut self) {
594         self.entries.clear();
595         self.len = 0;
596         self.next = 0;
597     }
598 
599     /// Return the number of stored values.
600     ///
601     /// # Examples
602     ///
603     /// ```
604     /// # use slab::*;
605     /// let mut slab = Slab::new();
606     ///
607     /// for i in 0..3 {
608     ///     slab.insert(i);
609     /// }
610     ///
611     /// assert_eq!(3, slab.len());
612     /// ```
len(&self) -> usize613     pub fn len(&self) -> usize {
614         self.len
615     }
616 
617     /// Return `true` if there are no values stored in the slab.
618     ///
619     /// # Examples
620     ///
621     /// ```
622     /// # use slab::*;
623     /// let mut slab = Slab::new();
624     /// assert!(slab.is_empty());
625     ///
626     /// slab.insert(1);
627     /// assert!(!slab.is_empty());
628     /// ```
is_empty(&self) -> bool629     pub fn is_empty(&self) -> bool {
630         self.len == 0
631     }
632 
633     /// Return an iterator over the slab.
634     ///
635     /// This function should generally be **avoided** as it is not efficient.
636     /// Iterators must iterate over every slot in the slab even if it is
637     /// vacant. As such, a slab with a capacity of 1 million but only one
638     /// stored value must still iterate the million slots.
639     ///
640     /// # Examples
641     ///
642     /// ```
643     /// # use slab::*;
644     /// let mut slab = Slab::new();
645     ///
646     /// for i in 0..3 {
647     ///     slab.insert(i);
648     /// }
649     ///
650     /// let mut iterator = slab.iter();
651     ///
652     /// assert_eq!(iterator.next(), Some((0, &0)));
653     /// assert_eq!(iterator.next(), Some((1, &1)));
654     /// assert_eq!(iterator.next(), Some((2, &2)));
655     /// assert_eq!(iterator.next(), None);
656     /// ```
iter(&self) -> Iter<'_, T>657     pub fn iter(&self) -> Iter<'_, T> {
658         Iter {
659             entries: self.entries.iter().enumerate(),
660             len: self.len,
661         }
662     }
663 
664     /// Return an iterator that allows modifying each value.
665     ///
666     /// This function should generally be **avoided** as it is not efficient.
667     /// Iterators must iterate over every slot in the slab even if it is
668     /// vacant. As such, a slab with a capacity of 1 million but only one
669     /// stored value must still iterate the million slots.
670     ///
671     /// # Examples
672     ///
673     /// ```
674     /// # use slab::*;
675     /// let mut slab = Slab::new();
676     ///
677     /// let key1 = slab.insert(0);
678     /// let key2 = slab.insert(1);
679     ///
680     /// for (key, val) in slab.iter_mut() {
681     ///     if key == key1 {
682     ///         *val += 2;
683     ///     }
684     /// }
685     ///
686     /// assert_eq!(slab[key1], 2);
687     /// assert_eq!(slab[key2], 1);
688     /// ```
iter_mut(&mut self) -> IterMut<'_, T>689     pub fn iter_mut(&mut self) -> IterMut<'_, T> {
690         IterMut {
691             entries: self.entries.iter_mut().enumerate(),
692             len: self.len,
693         }
694     }
695 
696     /// Return a reference to the value associated with the given key.
697     ///
698     /// If the given key is not associated with a value, then `None` is
699     /// returned.
700     ///
701     /// # Examples
702     ///
703     /// ```
704     /// # use slab::*;
705     /// let mut slab = Slab::new();
706     /// let key = slab.insert("hello");
707     ///
708     /// assert_eq!(slab.get(key), Some(&"hello"));
709     /// assert_eq!(slab.get(123), None);
710     /// ```
get(&self, key: usize) -> Option<&T>711     pub fn get(&self, key: usize) -> Option<&T> {
712         match self.entries.get(key) {
713             Some(Entry::Occupied(val)) => Some(val),
714             _ => None,
715         }
716     }
717 
718     /// Return a mutable reference to the value associated with the given key.
719     ///
720     /// If the given key is not associated with a value, then `None` is
721     /// returned.
722     ///
723     /// # Examples
724     ///
725     /// ```
726     /// # use slab::*;
727     /// let mut slab = Slab::new();
728     /// let key = slab.insert("hello");
729     ///
730     /// *slab.get_mut(key).unwrap() = "world";
731     ///
732     /// assert_eq!(slab[key], "world");
733     /// assert_eq!(slab.get_mut(123), None);
734     /// ```
get_mut(&mut self, key: usize) -> Option<&mut T>735     pub fn get_mut(&mut self, key: usize) -> Option<&mut T> {
736         match self.entries.get_mut(key) {
737             Some(&mut Entry::Occupied(ref mut val)) => Some(val),
738             _ => None,
739         }
740     }
741 
742     /// Return two mutable references to the values associated with the two
743     /// given keys simultaneously.
744     ///
745     /// If any one of the given keys is not associated with a value, then `None`
746     /// is returned.
747     ///
748     /// This function can be used to get two mutable references out of one slab,
749     /// so that you can manipulate both of them at the same time, eg. swap them.
750     ///
751     /// # Panics
752     ///
753     /// This function will panic if `key1` and `key2` are the same.
754     ///
755     /// # Examples
756     ///
757     /// ```
758     /// # use slab::*;
759     /// use std::mem;
760     ///
761     /// let mut slab = Slab::new();
762     /// let key1 = slab.insert(1);
763     /// let key2 = slab.insert(2);
764     /// let (value1, value2) = slab.get2_mut(key1, key2).unwrap();
765     /// mem::swap(value1, value2);
766     /// assert_eq!(slab[key1], 2);
767     /// assert_eq!(slab[key2], 1);
768     /// ```
get2_mut(&mut self, key1: usize, key2: usize) -> Option<(&mut T, &mut T)>769     pub fn get2_mut(&mut self, key1: usize, key2: usize) -> Option<(&mut T, &mut T)> {
770         assert!(key1 != key2);
771 
772         let (entry1, entry2);
773 
774         if key1 > key2 {
775             let (slice1, slice2) = self.entries.split_at_mut(key1);
776             entry1 = slice2.get_mut(0);
777             entry2 = slice1.get_mut(key2);
778         } else {
779             let (slice1, slice2) = self.entries.split_at_mut(key2);
780             entry1 = slice1.get_mut(key1);
781             entry2 = slice2.get_mut(0);
782         }
783 
784         match (entry1, entry2) {
785             (
786                 Some(&mut Entry::Occupied(ref mut val1)),
787                 Some(&mut Entry::Occupied(ref mut val2)),
788             ) => Some((val1, val2)),
789             _ => None,
790         }
791     }
792 
793     /// Return a reference to the value associated with the given key without
794     /// performing bounds checking.
795     ///
796     /// For a safe alternative see [`get`](Slab::get).
797     ///
798     /// This function should be used with care.
799     ///
800     /// # Safety
801     ///
802     /// The key must be within bounds.
803     ///
804     /// # Examples
805     ///
806     /// ```
807     /// # use slab::*;
808     /// let mut slab = Slab::new();
809     /// let key = slab.insert(2);
810     ///
811     /// unsafe {
812     ///     assert_eq!(slab.get_unchecked(key), &2);
813     /// }
814     /// ```
get_unchecked(&self, key: usize) -> &T815     pub unsafe fn get_unchecked(&self, key: usize) -> &T {
816         match *self.entries.get_unchecked(key) {
817             Entry::Occupied(ref val) => val,
818             _ => unreachable!(),
819         }
820     }
821 
822     /// Return a mutable reference to the value associated with the given key
823     /// without performing bounds checking.
824     ///
825     /// For a safe alternative see [`get_mut`](Slab::get_mut).
826     ///
827     /// This function should be used with care.
828     ///
829     /// # Safety
830     ///
831     /// The key must be within bounds.
832     ///
833     /// # Examples
834     ///
835     /// ```
836     /// # use slab::*;
837     /// let mut slab = Slab::new();
838     /// let key = slab.insert(2);
839     ///
840     /// unsafe {
841     ///     let val = slab.get_unchecked_mut(key);
842     ///     *val = 13;
843     /// }
844     ///
845     /// assert_eq!(slab[key], 13);
846     /// ```
get_unchecked_mut(&mut self, key: usize) -> &mut T847     pub unsafe fn get_unchecked_mut(&mut self, key: usize) -> &mut T {
848         match *self.entries.get_unchecked_mut(key) {
849             Entry::Occupied(ref mut val) => val,
850             _ => unreachable!(),
851         }
852     }
853 
854     /// Return two mutable references to the values associated with the two
855     /// given keys simultaneously without performing bounds checking and safety
856     /// condition checking.
857     ///
858     /// For a safe alternative see [`get2_mut`](Slab::get2_mut).
859     ///
860     /// This function should be used with care.
861     ///
862     /// # Safety
863     ///
864     /// - Both keys must be within bounds.
865     /// - The condition `key1 != key2` must hold.
866     ///
867     /// # Examples
868     ///
869     /// ```
870     /// # use slab::*;
871     /// use std::mem;
872     ///
873     /// let mut slab = Slab::new();
874     /// let key1 = slab.insert(1);
875     /// let key2 = slab.insert(2);
876     /// let (value1, value2) = unsafe { slab.get2_unchecked_mut(key1, key2) };
877     /// mem::swap(value1, value2);
878     /// assert_eq!(slab[key1], 2);
879     /// assert_eq!(slab[key2], 1);
880     /// ```
get2_unchecked_mut(&mut self, key1: usize, key2: usize) -> (&mut T, &mut T)881     pub unsafe fn get2_unchecked_mut(&mut self, key1: usize, key2: usize) -> (&mut T, &mut T) {
882         debug_assert_ne!(key1, key2);
883         let ptr = self.entries.as_mut_ptr();
884         let ptr1 = ptr.add(key1);
885         let ptr2 = ptr.add(key2);
886         match (&mut *ptr1, &mut *ptr2) {
887             (&mut Entry::Occupied(ref mut val1), &mut Entry::Occupied(ref mut val2)) => {
888                 (val1, val2)
889             }
890             _ => unreachable!(),
891         }
892     }
893 
894     /// Get the key for an element in the slab.
895     ///
896     /// The reference must point to an element owned by the slab.
897     /// Otherwise this function will panic.
898     /// This is a constant-time operation because the key can be calculated
899     /// from the reference with pointer arithmetic.
900     ///
901     /// # Panics
902     ///
903     /// This function will panic if the reference does not point to an element
904     /// of the slab.
905     ///
906     /// # Examples
907     ///
908     /// ```
909     /// # use slab::*;
910     ///
911     /// let mut slab = Slab::new();
912     /// let key = slab.insert(String::from("foo"));
913     /// let value = &slab[key];
914     /// assert_eq!(slab.key_of(value), key);
915     /// ```
916     ///
917     /// Values are not compared, so passing a reference to a different location
918     /// will result in a panic:
919     ///
920     /// ```should_panic
921     /// # use slab::*;
922     ///
923     /// let mut slab = Slab::new();
924     /// let key = slab.insert(0);
925     /// let bad = &0;
926     /// slab.key_of(bad); // this will panic
927     /// unreachable!();
928     /// ```
929     #[cfg_attr(not(slab_no_track_caller), track_caller)]
key_of(&self, present_element: &T) -> usize930     pub fn key_of(&self, present_element: &T) -> usize {
931         let element_ptr = present_element as *const T as usize;
932         let base_ptr = self.entries.as_ptr() as usize;
933         // Use wrapping subtraction in case the reference is bad
934         let byte_offset = element_ptr.wrapping_sub(base_ptr);
935         // The division rounds away any offset of T inside Entry
936         // The size of Entry<T> is never zero even if T is due to Vacant(usize)
937         let key = byte_offset / mem::size_of::<Entry<T>>();
938         // Prevent returning unspecified (but out of bounds) values
939         if key >= self.entries.len() {
940             panic!("The reference points to a value outside this slab");
941         }
942         // The reference cannot point to a vacant entry, because then it would not be valid
943         key
944     }
945 
946     /// Insert a value in the slab, returning key assigned to the value.
947     ///
948     /// The returned key can later be used to retrieve or remove the value using indexed
949     /// lookup and `remove`. Additional capacity is allocated if needed. See
950     /// [Capacity and reallocation](index.html#capacity-and-reallocation).
951     ///
952     /// # Panics
953     ///
954     /// Panics if the new storage in the vector exceeds `isize::MAX` bytes.
955     ///
956     /// # Examples
957     ///
958     /// ```
959     /// # use slab::*;
960     /// let mut slab = Slab::new();
961     /// let key = slab.insert("hello");
962     /// assert_eq!(slab[key], "hello");
963     /// ```
insert(&mut self, val: T) -> usize964     pub fn insert(&mut self, val: T) -> usize {
965         let key = self.next;
966 
967         self.insert_at(key, val);
968 
969         key
970     }
971 
972     /// Returns the key of the next vacant entry.
973     ///
974     /// This function returns the key of the vacant entry which  will be used
975     /// for the next insertion. This is equivalent to
976     /// `slab.vacant_entry().key()`, but it doesn't require mutable access.
977     ///
978     /// # Examples
979     ///
980     /// ```
981     /// # use slab::*;
982     /// let mut slab = Slab::new();
983     /// assert_eq!(slab.vacant_key(), 0);
984     ///
985     /// slab.insert(0);
986     /// assert_eq!(slab.vacant_key(), 1);
987     ///
988     /// slab.insert(1);
989     /// slab.remove(0);
990     /// assert_eq!(slab.vacant_key(), 0);
991     /// ```
vacant_key(&self) -> usize992     pub fn vacant_key(&self) -> usize {
993         self.next
994     }
995 
996     /// Return a handle to a vacant entry allowing for further manipulation.
997     ///
998     /// This function is useful when creating values that must contain their
999     /// slab key. The returned `VacantEntry` reserves a slot in the slab and is
1000     /// able to query the associated key.
1001     ///
1002     /// # Examples
1003     ///
1004     /// ```
1005     /// # use slab::*;
1006     /// let mut slab = Slab::new();
1007     ///
1008     /// let hello = {
1009     ///     let entry = slab.vacant_entry();
1010     ///     let key = entry.key();
1011     ///
1012     ///     entry.insert((key, "hello"));
1013     ///     key
1014     /// };
1015     ///
1016     /// assert_eq!(hello, slab[hello].0);
1017     /// assert_eq!("hello", slab[hello].1);
1018     /// ```
vacant_entry(&mut self) -> VacantEntry<'_, T>1019     pub fn vacant_entry(&mut self) -> VacantEntry<'_, T> {
1020         VacantEntry {
1021             key: self.next,
1022             slab: self,
1023         }
1024     }
1025 
insert_at(&mut self, key: usize, val: T)1026     fn insert_at(&mut self, key: usize, val: T) {
1027         self.len += 1;
1028 
1029         if key == self.entries.len() {
1030             self.entries.push(Entry::Occupied(val));
1031             self.next = key + 1;
1032         } else {
1033             self.next = match self.entries.get(key) {
1034                 Some(&Entry::Vacant(next)) => next,
1035                 _ => unreachable!(),
1036             };
1037             self.entries[key] = Entry::Occupied(val);
1038         }
1039     }
1040 
1041     /// Tries to remove the value associated with the given key,
1042     /// returning the value if the key existed.
1043     ///
1044     /// The key is then released and may be associated with future stored
1045     /// values.
1046     ///
1047     /// # Examples
1048     ///
1049     /// ```
1050     /// # use slab::*;
1051     /// let mut slab = Slab::new();
1052     ///
1053     /// let hello = slab.insert("hello");
1054     ///
1055     /// assert_eq!(slab.try_remove(hello), Some("hello"));
1056     /// assert!(!slab.contains(hello));
1057     /// ```
try_remove(&mut self, key: usize) -> Option<T>1058     pub fn try_remove(&mut self, key: usize) -> Option<T> {
1059         if let Some(entry) = self.entries.get_mut(key) {
1060             // Swap the entry at the provided value
1061             let prev = mem::replace(entry, Entry::Vacant(self.next));
1062 
1063             match prev {
1064                 Entry::Occupied(val) => {
1065                     self.len -= 1;
1066                     self.next = key;
1067                     return val.into();
1068                 }
1069                 _ => {
1070                     // Woops, the entry is actually vacant, restore the state
1071                     *entry = prev;
1072                 }
1073             }
1074         }
1075         None
1076     }
1077 
1078     /// Remove and return the value associated with the given key.
1079     ///
1080     /// The key is then released and may be associated with future stored
1081     /// values.
1082     ///
1083     /// # Panics
1084     ///
1085     /// Panics if `key` is not associated with a value.
1086     ///
1087     /// # Examples
1088     ///
1089     /// ```
1090     /// # use slab::*;
1091     /// let mut slab = Slab::new();
1092     ///
1093     /// let hello = slab.insert("hello");
1094     ///
1095     /// assert_eq!(slab.remove(hello), "hello");
1096     /// assert!(!slab.contains(hello));
1097     /// ```
1098     #[cfg_attr(not(slab_no_track_caller), track_caller)]
remove(&mut self, key: usize) -> T1099     pub fn remove(&mut self, key: usize) -> T {
1100         self.try_remove(key).expect("invalid key")
1101     }
1102 
1103     /// Return `true` if a value is associated with the given key.
1104     ///
1105     /// # Examples
1106     ///
1107     /// ```
1108     /// # use slab::*;
1109     /// let mut slab = Slab::new();
1110     ///
1111     /// let hello = slab.insert("hello");
1112     /// assert!(slab.contains(hello));
1113     ///
1114     /// slab.remove(hello);
1115     ///
1116     /// assert!(!slab.contains(hello));
1117     /// ```
contains(&self, key: usize) -> bool1118     pub fn contains(&self, key: usize) -> bool {
1119         match self.entries.get(key) {
1120             Some(&Entry::Occupied(_)) => true,
1121             _ => false,
1122         }
1123     }
1124 
1125     /// Retain only the elements specified by the predicate.
1126     ///
1127     /// In other words, remove all elements `e` such that `f(usize, &mut e)`
1128     /// returns false. This method operates in place and preserves the key
1129     /// associated with the retained values.
1130     ///
1131     /// # Examples
1132     ///
1133     /// ```
1134     /// # use slab::*;
1135     /// let mut slab = Slab::new();
1136     ///
1137     /// let k1 = slab.insert(0);
1138     /// let k2 = slab.insert(1);
1139     /// let k3 = slab.insert(2);
1140     ///
1141     /// slab.retain(|key, val| key == k1 || *val == 1);
1142     ///
1143     /// assert!(slab.contains(k1));
1144     /// assert!(slab.contains(k2));
1145     /// assert!(!slab.contains(k3));
1146     ///
1147     /// assert_eq!(2, slab.len());
1148     /// ```
retain<F>(&mut self, mut f: F) where F: FnMut(usize, &mut T) -> bool,1149     pub fn retain<F>(&mut self, mut f: F)
1150     where
1151         F: FnMut(usize, &mut T) -> bool,
1152     {
1153         for i in 0..self.entries.len() {
1154             let keep = match self.entries[i] {
1155                 Entry::Occupied(ref mut v) => f(i, v),
1156                 _ => true,
1157             };
1158 
1159             if !keep {
1160                 self.remove(i);
1161             }
1162         }
1163     }
1164 
1165     /// Return a draining iterator that removes all elements from the slab and
1166     /// yields the removed items.
1167     ///
1168     /// Note: Elements are removed even if the iterator is only partially
1169     /// consumed or not consumed at all.
1170     ///
1171     /// # Examples
1172     ///
1173     /// ```
1174     /// # use slab::*;
1175     /// let mut slab = Slab::new();
1176     ///
1177     /// let _ = slab.insert(0);
1178     /// let _ = slab.insert(1);
1179     /// let _ = slab.insert(2);
1180     ///
1181     /// {
1182     ///     let mut drain = slab.drain();
1183     ///
1184     ///     assert_eq!(Some(0), drain.next());
1185     ///     assert_eq!(Some(1), drain.next());
1186     ///     assert_eq!(Some(2), drain.next());
1187     ///     assert_eq!(None, drain.next());
1188     /// }
1189     ///
1190     /// assert!(slab.is_empty());
1191     /// ```
drain(&mut self) -> Drain<'_, T>1192     pub fn drain(&mut self) -> Drain<'_, T> {
1193         let old_len = self.len;
1194         self.len = 0;
1195         self.next = 0;
1196         Drain {
1197             inner: self.entries.drain(..),
1198             len: old_len,
1199         }
1200     }
1201 }
1202 
1203 impl<T> ops::Index<usize> for Slab<T> {
1204     type Output = T;
1205 
1206     #[cfg_attr(not(slab_no_track_caller), track_caller)]
index(&self, key: usize) -> &T1207     fn index(&self, key: usize) -> &T {
1208         match self.entries.get(key) {
1209             Some(Entry::Occupied(v)) => v,
1210             _ => panic!("invalid key"),
1211         }
1212     }
1213 }
1214 
1215 impl<T> ops::IndexMut<usize> for Slab<T> {
1216     #[cfg_attr(not(slab_no_track_caller), track_caller)]
index_mut(&mut self, key: usize) -> &mut T1217     fn index_mut(&mut self, key: usize) -> &mut T {
1218         match self.entries.get_mut(key) {
1219             Some(&mut Entry::Occupied(ref mut v)) => v,
1220             _ => panic!("invalid key"),
1221         }
1222     }
1223 }
1224 
1225 impl<T> IntoIterator for Slab<T> {
1226     type Item = (usize, T);
1227     type IntoIter = IntoIter<T>;
1228 
into_iter(self) -> IntoIter<T>1229     fn into_iter(self) -> IntoIter<T> {
1230         IntoIter {
1231             entries: self.entries.into_iter().enumerate(),
1232             len: self.len,
1233         }
1234     }
1235 }
1236 
1237 impl<'a, T> IntoIterator for &'a Slab<T> {
1238     type Item = (usize, &'a T);
1239     type IntoIter = Iter<'a, T>;
1240 
into_iter(self) -> Iter<'a, T>1241     fn into_iter(self) -> Iter<'a, T> {
1242         self.iter()
1243     }
1244 }
1245 
1246 impl<'a, T> IntoIterator for &'a mut Slab<T> {
1247     type Item = (usize, &'a mut T);
1248     type IntoIter = IterMut<'a, T>;
1249 
into_iter(self) -> IterMut<'a, T>1250     fn into_iter(self) -> IterMut<'a, T> {
1251         self.iter_mut()
1252     }
1253 }
1254 
1255 /// Create a slab from an iterator of key-value pairs.
1256 ///
1257 /// If the iterator produces duplicate keys, the previous value is replaced with the later one.
1258 /// The keys does not need to be sorted beforehand, and this function always
1259 /// takes O(n) time.
1260 /// Note that the returned slab will use space proportional to the largest key,
1261 /// so don't use `Slab` with untrusted keys.
1262 ///
1263 /// # Examples
1264 ///
1265 /// ```
1266 /// # use slab::*;
1267 ///
1268 /// let vec = vec![(2,'a'), (6,'b'), (7,'c')];
1269 /// let slab = vec.into_iter().collect::<Slab<char>>();
1270 /// assert_eq!(slab.len(), 3);
1271 /// assert!(slab.capacity() >= 8);
1272 /// assert_eq!(slab[2], 'a');
1273 /// ```
1274 ///
1275 /// With duplicate and unsorted keys:
1276 ///
1277 /// ```
1278 /// # use slab::*;
1279 ///
1280 /// let vec = vec![(20,'a'), (10,'b'), (11,'c'), (10,'d')];
1281 /// let slab = vec.into_iter().collect::<Slab<char>>();
1282 /// assert_eq!(slab.len(), 3);
1283 /// assert_eq!(slab[10], 'd');
1284 /// ```
1285 impl<T> FromIterator<(usize, T)> for Slab<T> {
from_iter<I>(iterable: I) -> Self where I: IntoIterator<Item = (usize, T)>,1286     fn from_iter<I>(iterable: I) -> Self
1287     where
1288         I: IntoIterator<Item = (usize, T)>,
1289     {
1290         let iterator = iterable.into_iter();
1291         let mut builder = builder::Builder::with_capacity(iterator.size_hint().0);
1292 
1293         for (key, value) in iterator {
1294             builder.pair(key, value)
1295         }
1296         builder.build()
1297     }
1298 }
1299 
1300 impl<T> fmt::Debug for Slab<T>
1301 where
1302     T: fmt::Debug,
1303 {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result1304     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1305         if fmt.alternate() {
1306             fmt.debug_map().entries(self.iter()).finish()
1307         } else {
1308             fmt.debug_struct("Slab")
1309                 .field("len", &self.len)
1310                 .field("cap", &self.capacity())
1311                 .finish()
1312         }
1313     }
1314 }
1315 
1316 impl<T> fmt::Debug for IntoIter<T>
1317 where
1318     T: fmt::Debug,
1319 {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result1320     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1321         fmt.debug_struct("IntoIter")
1322             .field("remaining", &self.len)
1323             .finish()
1324     }
1325 }
1326 
1327 impl<T> fmt::Debug for Iter<'_, T>
1328 where
1329     T: fmt::Debug,
1330 {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result1331     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1332         fmt.debug_struct("Iter")
1333             .field("remaining", &self.len)
1334             .finish()
1335     }
1336 }
1337 
1338 impl<T> fmt::Debug for IterMut<'_, T>
1339 where
1340     T: fmt::Debug,
1341 {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result1342     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1343         fmt.debug_struct("IterMut")
1344             .field("remaining", &self.len)
1345             .finish()
1346     }
1347 }
1348 
1349 impl<T> fmt::Debug for Drain<'_, T> {
fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result1350     fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1351         fmt.debug_struct("Drain").finish()
1352     }
1353 }
1354 
1355 // ===== VacantEntry =====
1356 
1357 impl<'a, T> VacantEntry<'a, T> {
1358     /// Insert a value in the entry, returning a mutable reference to the value.
1359     ///
1360     /// To get the key associated with the value, use `key` prior to calling
1361     /// `insert`.
1362     ///
1363     /// # Examples
1364     ///
1365     /// ```
1366     /// # use slab::*;
1367     /// let mut slab = Slab::new();
1368     ///
1369     /// let hello = {
1370     ///     let entry = slab.vacant_entry();
1371     ///     let key = entry.key();
1372     ///
1373     ///     entry.insert((key, "hello"));
1374     ///     key
1375     /// };
1376     ///
1377     /// assert_eq!(hello, slab[hello].0);
1378     /// assert_eq!("hello", slab[hello].1);
1379     /// ```
insert(self, val: T) -> &'a mut T1380     pub fn insert(self, val: T) -> &'a mut T {
1381         self.slab.insert_at(self.key, val);
1382 
1383         match self.slab.entries.get_mut(self.key) {
1384             Some(&mut Entry::Occupied(ref mut v)) => v,
1385             _ => unreachable!(),
1386         }
1387     }
1388 
1389     /// Return the key associated with this entry.
1390     ///
1391     /// A value stored in this entry will be associated with this key.
1392     ///
1393     /// # Examples
1394     ///
1395     /// ```
1396     /// # use slab::*;
1397     /// let mut slab = Slab::new();
1398     ///
1399     /// let hello = {
1400     ///     let entry = slab.vacant_entry();
1401     ///     let key = entry.key();
1402     ///
1403     ///     entry.insert((key, "hello"));
1404     ///     key
1405     /// };
1406     ///
1407     /// assert_eq!(hello, slab[hello].0);
1408     /// assert_eq!("hello", slab[hello].1);
1409     /// ```
key(&self) -> usize1410     pub fn key(&self) -> usize {
1411         self.key
1412     }
1413 }
1414 
1415 // ===== IntoIter =====
1416 
1417 impl<T> Iterator for IntoIter<T> {
1418     type Item = (usize, T);
1419 
next(&mut self) -> Option<Self::Item>1420     fn next(&mut self) -> Option<Self::Item> {
1421         for (key, entry) in &mut self.entries {
1422             if let Entry::Occupied(v) = entry {
1423                 self.len -= 1;
1424                 return Some((key, v));
1425             }
1426         }
1427 
1428         debug_assert_eq!(self.len, 0);
1429         None
1430     }
1431 
size_hint(&self) -> (usize, Option<usize>)1432     fn size_hint(&self) -> (usize, Option<usize>) {
1433         (self.len, Some(self.len))
1434     }
1435 }
1436 
1437 impl<T> DoubleEndedIterator for IntoIter<T> {
next_back(&mut self) -> Option<Self::Item>1438     fn next_back(&mut self) -> Option<Self::Item> {
1439         while let Some((key, entry)) = self.entries.next_back() {
1440             if let Entry::Occupied(v) = entry {
1441                 self.len -= 1;
1442                 return Some((key, v));
1443             }
1444         }
1445 
1446         debug_assert_eq!(self.len, 0);
1447         None
1448     }
1449 }
1450 
1451 impl<T> ExactSizeIterator for IntoIter<T> {
len(&self) -> usize1452     fn len(&self) -> usize {
1453         self.len
1454     }
1455 }
1456 
1457 impl<T> FusedIterator for IntoIter<T> {}
1458 
1459 // ===== Iter =====
1460 
1461 impl<'a, T> Iterator for Iter<'a, T> {
1462     type Item = (usize, &'a T);
1463 
next(&mut self) -> Option<Self::Item>1464     fn next(&mut self) -> Option<Self::Item> {
1465         for (key, entry) in &mut self.entries {
1466             if let Entry::Occupied(ref v) = *entry {
1467                 self.len -= 1;
1468                 return Some((key, v));
1469             }
1470         }
1471 
1472         debug_assert_eq!(self.len, 0);
1473         None
1474     }
1475 
size_hint(&self) -> (usize, Option<usize>)1476     fn size_hint(&self) -> (usize, Option<usize>) {
1477         (self.len, Some(self.len))
1478     }
1479 }
1480 
1481 impl<T> DoubleEndedIterator for Iter<'_, T> {
next_back(&mut self) -> Option<Self::Item>1482     fn next_back(&mut self) -> Option<Self::Item> {
1483         while let Some((key, entry)) = self.entries.next_back() {
1484             if let Entry::Occupied(ref v) = *entry {
1485                 self.len -= 1;
1486                 return Some((key, v));
1487             }
1488         }
1489 
1490         debug_assert_eq!(self.len, 0);
1491         None
1492     }
1493 }
1494 
1495 impl<T> ExactSizeIterator for Iter<'_, T> {
len(&self) -> usize1496     fn len(&self) -> usize {
1497         self.len
1498     }
1499 }
1500 
1501 impl<T> FusedIterator for Iter<'_, T> {}
1502 
1503 // ===== IterMut =====
1504 
1505 impl<'a, T> Iterator for IterMut<'a, T> {
1506     type Item = (usize, &'a mut T);
1507 
next(&mut self) -> Option<Self::Item>1508     fn next(&mut self) -> Option<Self::Item> {
1509         for (key, entry) in &mut self.entries {
1510             if let Entry::Occupied(ref mut v) = *entry {
1511                 self.len -= 1;
1512                 return Some((key, v));
1513             }
1514         }
1515 
1516         debug_assert_eq!(self.len, 0);
1517         None
1518     }
1519 
size_hint(&self) -> (usize, Option<usize>)1520     fn size_hint(&self) -> (usize, Option<usize>) {
1521         (self.len, Some(self.len))
1522     }
1523 }
1524 
1525 impl<T> DoubleEndedIterator for IterMut<'_, T> {
next_back(&mut self) -> Option<Self::Item>1526     fn next_back(&mut self) -> Option<Self::Item> {
1527         while let Some((key, entry)) = self.entries.next_back() {
1528             if let Entry::Occupied(ref mut v) = *entry {
1529                 self.len -= 1;
1530                 return Some((key, v));
1531             }
1532         }
1533 
1534         debug_assert_eq!(self.len, 0);
1535         None
1536     }
1537 }
1538 
1539 impl<T> ExactSizeIterator for IterMut<'_, T> {
len(&self) -> usize1540     fn len(&self) -> usize {
1541         self.len
1542     }
1543 }
1544 
1545 impl<T> FusedIterator for IterMut<'_, T> {}
1546 
1547 // ===== Drain =====
1548 
1549 impl<T> Iterator for Drain<'_, T> {
1550     type Item = T;
1551 
next(&mut self) -> Option<Self::Item>1552     fn next(&mut self) -> Option<Self::Item> {
1553         for entry in &mut self.inner {
1554             if let Entry::Occupied(v) = entry {
1555                 self.len -= 1;
1556                 return Some(v);
1557             }
1558         }
1559 
1560         debug_assert_eq!(self.len, 0);
1561         None
1562     }
1563 
size_hint(&self) -> (usize, Option<usize>)1564     fn size_hint(&self) -> (usize, Option<usize>) {
1565         (self.len, Some(self.len))
1566     }
1567 }
1568 
1569 impl<T> DoubleEndedIterator for Drain<'_, T> {
next_back(&mut self) -> Option<Self::Item>1570     fn next_back(&mut self) -> Option<Self::Item> {
1571         while let Some(entry) = self.inner.next_back() {
1572             if let Entry::Occupied(v) = entry {
1573                 self.len -= 1;
1574                 return Some(v);
1575             }
1576         }
1577 
1578         debug_assert_eq!(self.len, 0);
1579         None
1580     }
1581 }
1582 
1583 impl<T> ExactSizeIterator for Drain<'_, T> {
len(&self) -> usize1584     fn len(&self) -> usize {
1585         self.len
1586     }
1587 }
1588 
1589 impl<T> FusedIterator for Drain<'_, T> {}
1590