Coverage Report

Created: 2025-11-28 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/slab-0.4.9/src/lib.rs
Line
Count
Source
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
{
148
    fn clone(&self) -> Self {
149
        Self {
150
            entries: self.entries.clone(),
151
            len: self.len,
152
            next: self.next,
153
        }
154
    }
155
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> {
164
    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> {
210
    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))]
251
0
    pub const fn new() -> Self {
252
0
        Self {
253
0
            entries: Vec::new(),
254
0
            next: 0,
255
0
            len: 0,
256
0
        }
257
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::new
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::new
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>>>::new
Unexecuted instantiation: <slab::Slab<h2::proto::streams::stream::Stream>>::new
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)]
265
    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
    /// ```
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
    /// ```
317
    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
    /// ```
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
    /// ```
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
    /// ```
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.
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
    /// ```
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
    /// ```
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
    /// ```
613
0
    pub fn len(&self) -> usize {
614
0
        self.len
615
0
    }
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
    /// ```
629
0
    pub fn is_empty(&self) -> bool {
630
0
        self.len == 0
631
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::is_empty
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::is_empty
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
    /// ```
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
    /// ```
689
0
    pub fn iter_mut(&mut self) -> IterMut<'_, T> {
690
0
        IterMut {
691
0
            entries: self.entries.iter_mut().enumerate(),
692
0
            len: self.len,
693
0
        }
694
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::iter_mut
Unexecuted instantiation: <slab::Slab<core::option::Option<core::task::wake::Waker>>>::iter_mut
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
    /// ```
711
0
    pub fn get(&self, key: usize) -> Option<&T> {
712
0
        match self.entries.get(key) {
713
0
            Some(Entry::Occupied(val)) => Some(val),
714
0
            _ => None,
715
        }
716
0
    }
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
    /// ```
735
0
    pub fn get_mut(&mut self, key: usize) -> Option<&mut T> {
736
0
        match self.entries.get_mut(key) {
737
0
            Some(&mut Entry::Occupied(ref mut val)) => Some(val),
738
0
            _ => None,
739
        }
740
0
    }
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
    /// ```
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
    /// ```
815
    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
    /// ```
847
    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
    /// ```
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)]
930
    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
    /// ```
964
0
    pub fn insert(&mut self, val: T) -> usize {
965
0
        let key = self.next;
966
967
0
        self.insert_at(key, val);
968
969
0
        key
970
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::insert
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::insert
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>>>::insert
Unexecuted instantiation: <slab::Slab<h2::proto::streams::stream::Stream>>::insert
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
    /// ```
992
    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
    /// ```
1019
    pub fn vacant_entry(&mut self) -> VacantEntry<'_, T> {
1020
        VacantEntry {
1021
            key: self.next,
1022
            slab: self,
1023
        }
1024
    }
1025
1026
0
    fn insert_at(&mut self, key: usize, val: T) {
1027
0
        self.len += 1;
1028
1029
0
        if key == self.entries.len() {
1030
0
            self.entries.push(Entry::Occupied(val));
1031
0
            self.next = key + 1;
1032
0
        } else {
1033
0
            self.next = match self.entries.get(key) {
1034
0
                Some(&Entry::Vacant(next)) => next,
1035
0
                _ => unreachable!(),
1036
            };
1037
0
            self.entries[key] = Entry::Occupied(val);
1038
        }
1039
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::insert_at
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::insert_at
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>>>::insert_at
Unexecuted instantiation: <slab::Slab<h2::proto::streams::stream::Stream>>::insert_at
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
    /// ```
1058
0
    pub fn try_remove(&mut self, key: usize) -> Option<T> {
1059
0
        if let Some(entry) = self.entries.get_mut(key) {
1060
            // Swap the entry at the provided value
1061
0
            let prev = mem::replace(entry, Entry::Vacant(self.next));
1062
1063
0
            match prev {
1064
0
                Entry::Occupied(val) => {
1065
0
                    self.len -= 1;
1066
0
                    self.next = key;
1067
0
                    return val.into();
1068
                }
1069
0
                _ => {
1070
0
                    // Woops, the entry is actually vacant, restore the state
1071
0
                    *entry = prev;
1072
0
                }
1073
            }
1074
0
        }
1075
0
        None
1076
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::try_remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::try_remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>>>::try_remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::stream::Stream>>::try_remove
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)]
1099
0
    pub fn remove(&mut self, key: usize) -> T {
1100
0
        self.try_remove(key).expect("invalid key")
1101
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter>>::remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>>>::remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>>>::remove
Unexecuted instantiation: <slab::Slab<h2::proto::streams::stream::Stream>>::remove
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
    /// ```
1118
    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
    /// ```
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
    /// ```
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)]
1207
    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)]
1217
0
    fn index_mut(&mut self, key: usize) -> &mut T {
1218
0
        match self.entries.get_mut(key) {
1219
0
            Some(&mut Entry::Occupied(ref mut v)) => v,
1220
0
            _ => panic!("invalid key"),
1221
        }
1222
0
    }
Unexecuted instantiation: <slab::Slab<futures_util::lock::mutex::Waiter> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::frame::Frame<hyper::proto::h2::SendBuf<bytes::bytes::Bytes>>>> as core::ops::index::IndexMut<usize>>::index_mut
Unexecuted instantiation: <slab::Slab<h2::proto::streams::buffer::Slot<h2::proto::streams::recv::Event>> as core::ops::index::IndexMut<usize>>::index_mut
1223
}
1224
1225
impl<T> IntoIterator for Slab<T> {
1226
    type Item = (usize, T);
1227
    type IntoIter = IntoIter<T>;
1228
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
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
1250
0
    fn into_iter(self) -> IterMut<'a, T> {
1251
0
        self.iter_mut()
1252
0
    }
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> {
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
{
1304
    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
{
1320
    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
{
1331
    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
{
1342
    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> {
1350
    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
    /// ```
1380
    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
    /// ```
1410
    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
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
1432
    fn size_hint(&self) -> (usize, Option<usize>) {
1433
        (self.len, Some(self.len))
1434
    }
1435
}
1436
1437
impl<T> DoubleEndedIterator for IntoIter<T> {
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> {
1452
    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
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
1476
    fn size_hint(&self) -> (usize, Option<usize>) {
1477
        (self.len, Some(self.len))
1478
    }
1479
}
1480
1481
impl<T> DoubleEndedIterator for Iter<'_, T> {
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> {
1496
    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
1508
0
    fn next(&mut self) -> Option<Self::Item> {
1509
0
        for (key, entry) in &mut self.entries {
1510
0
            if let Entry::Occupied(ref mut v) = *entry {
1511
0
                self.len -= 1;
1512
0
                return Some((key, v));
1513
0
            }
1514
        }
1515
1516
0
        debug_assert_eq!(self.len, 0);
1517
0
        None
1518
0
    }
Unexecuted instantiation: <slab::IterMut<futures_util::lock::mutex::Waiter> as core::iter::traits::iterator::Iterator>::next
Unexecuted instantiation: <slab::IterMut<core::option::Option<core::task::wake::Waker>> as core::iter::traits::iterator::Iterator>::next
1519
1520
    fn size_hint(&self) -> (usize, Option<usize>) {
1521
        (self.len, Some(self.len))
1522
    }
1523
}
1524
1525
impl<T> DoubleEndedIterator for IterMut<'_, T> {
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> {
1540
    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
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
1564
    fn size_hint(&self) -> (usize, Option<usize>) {
1565
        (self.len, Some(self.len))
1566
    }
1567
}
1568
1569
impl<T> DoubleEndedIterator for Drain<'_, T> {
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> {
1584
    fn len(&self) -> usize {
1585
        self.len
1586
    }
1587
}
1588
1589
impl<T> FusedIterator for Drain<'_, T> {}