Struct Slab
struct Slab<T> { ... }
Pre-allocated storage for a uniform data type
See the module documentation for more details.
Implementations
impl<T> Slab<T>
const fn new() -> SelfConstruct a new, empty
Slab.The function does not allocate and the returned slab will have no capacity until
insertis called or capacity is explicitly reserved.Examples
# use *; let slab: = new;fn with_capacity(capacity: usize) -> Slab<T>Construct a new, empty
Slabwith the specified capacity.The returned slab will be able to store exactly
capacitywithout reallocating. Ifcapacityis 0, the slab will not allocate.It is important to note that this function does not specify the length of the returned slab, but only the capacity. For an explanation of the difference between length and capacity, see Capacity and reallocation.
Examples
# use *; let mut slab = with_capacity; // The slab contains no values, even though it has capacity for more assert_eq!; // These are all done without reallocating... for i in 0..10 // ...but this may make the slab reallocate slab.insert;fn capacity(self: &Self) -> usizeReturn the number of values the slab can store without reallocating.
Examples
# use *; let slab: = with_capacity; assert_eq!;fn reserve(self: &mut Self, additional: usize)Reserve capacity for at least
additionalmore values to be stored without allocating.reservedoes nothing if the slab already has sufficient capacity foradditionalmore values. If more capacity is required, a new segment of memory will be allocated and all existing values will be copied into it. As such, if the slab is already very large, a call toreservecan end up being expensive.The slab may reserve more than
additionalextra space in order to avoid frequent reallocations. Usereserve_exactinstead to guarantee that only the requested space is allocated.Panics
Panics if the new capacity exceeds
isize::MAXbytes.Examples
# use *; let mut slab = new; slab.insert; slab.reserve; assert!;fn reserve_exact(self: &mut Self, additional: usize)Reserve the minimum capacity required to store exactly
additionalmore values.reserve_exactdoes nothing if the slab already has sufficient capacity foradditionalmore values. If more capacity is required, a new segment of memory will be allocated and all existing values will be copied into it. As such, if the slab is already very large, a call toreservecan end up being expensive.Note that the allocator may give the slab more space than it requests. Therefore capacity can not be relied upon to be precisely minimal. Prefer
reserveif future insertions are expected.Panics
Panics if the new capacity exceeds
isize::MAXbytes.Examples
# use *; let mut slab = new; slab.insert; slab.reserve_exact; assert!;fn shrink_to_fit(self: &mut Self)Shrink the capacity of the slab as much as possible without invalidating keys.
Because values cannot be moved to a different index, the slab cannot shrink past any stored values. It will drop down as close as possible to the length but the allocator may still inform the underlying vector that there is space for a few more elements.
This function can take O(n) time even when the capacity cannot be reduced or the allocation is shrunk in place. Repeated calls run in O(1) though.
Examples
# use *; let mut slab = with_capacity; for i in 0..3 slab.shrink_to_fit; assert!;The slab cannot shrink past the last present value even if previous values are removed:
# use *; let mut slab = with_capacity; for i in 0..4 slab.remove; slab.remove; slab.shrink_to_fit; assert!;fn compact<F>(self: &mut Self, rekey: F) where F: FnMut(&mut T, usize, usize) -> boolReduce the capacity as much as possible, changing the key for elements when necessary.
To allow updating references to the elements which must be moved to a new key, this function takes a closure which is called before moving each element. The second and third parameters to the closure are the current key and new key respectively. In case changing the key for one element turns out not to be possible, the move can be cancelled by returning
falsefrom the closure. In that case no further attempts at relocating elements is made. If the closure unwinds, the slab will be left in a consistent state, but the value that the closure panicked on might be removed.Examples
# use *; let mut slab = with_capacity; let a = slab.insert; slab.insert; slab.insert; slab.remove; slab.compact; assert!;The value is not moved when the closure returns
Err:# use *; let mut slab = with_capacity; let a = slab.insert; let b = slab.insert; slab.remove; slab.compact; assert_eq!;fn clear(self: &mut Self)Clear the slab of all values.
Examples
# use *; let mut slab = new; for i in 0..3 slab.clear; assert!;fn len(self: &Self) -> usizeReturn the number of stored values.
Examples
# use *; let mut slab = new; for i in 0..3 assert_eq!;fn is_empty(self: &Self) -> boolReturn
trueif there are no values stored in the slab.Examples
# use *; let mut slab = new; assert!; slab.insert; assert!;fn iter(self: &Self) -> Iter<'_, T>Return an iterator over the slab.
This function should generally be avoided as it is not efficient. Iterators must iterate over every slot in the slab even if it is vacant. As such, a slab with a capacity of 1 million but only one stored value must still iterate the million slots.
Examples
# use *; let mut slab = new; for i in 0..3 let mut iterator = slab.iter; assert_eq!; assert_eq!; assert_eq!; assert_eq!;fn iter_mut(self: &mut Self) -> IterMut<'_, T>Return an iterator that allows modifying each value.
This function should generally be avoided as it is not efficient. Iterators must iterate over every slot in the slab even if it is vacant. As such, a slab with a capacity of 1 million but only one stored value must still iterate the million slots.
Examples
# use *; let mut slab = new; let key1 = slab.insert; let key2 = slab.insert; for in slab.iter_mut assert_eq!; assert_eq!;fn get(self: &Self, key: usize) -> Option<&T>Return a reference to the value associated with the given key.
If the given key is not associated with a value, then
Noneis returned.Examples
# use *; let mut slab = new; let key = slab.insert; assert_eq!; assert_eq!;fn get_mut(self: &mut Self, key: usize) -> Option<&mut T>Return a mutable reference to the value associated with the given key.
If the given key is not associated with a value, then
Noneis returned.Examples
# use *; let mut slab = new; let key = slab.insert; *slab.get_mut.unwrap = "world"; assert_eq!; assert_eq!;fn get2_mut(self: &mut Self, key1: usize, key2: usize) -> Option<(&mut T, &mut T)>Return two mutable references to the values associated with the two given keys simultaneously.
If any one of the given keys is not associated with a value, then
Noneis returned.This function can be used to get two mutable references out of one slab, so that you can manipulate both of them at the same time, eg. swap them.
Panics
This function will panic if
key1andkey2are the same.Examples
# use *; use mem; let mut slab = new; let key1 = slab.insert; let key2 = slab.insert; let = slab.get2_mut.unwrap; swap; assert_eq!; assert_eq!;fn get_disjoint_mut<N: usize>(self: &mut Self, keys: [usize; N]) -> Result<[&mut T; N], GetDisjointMutError>Returns mutable references to many indices at once.
Returns
GetDisjointMutErrorif the indices are out of bounds, overlapping, or vacant.unsafe fn get_unchecked(self: &Self, key: usize) -> &TReturn a reference to the value associated with the given key without performing bounds checking.
For a safe alternative see
get.This function should be used with care.
Safety
The key must be within bounds.
Examples
# use *; let mut slab = new; let key = slab.insert; unsafeunsafe fn get_unchecked_mut(self: &mut Self, key: usize) -> &mut TReturn a mutable reference to the value associated with the given key without performing bounds checking.
For a safe alternative see
get_mut.This function should be used with care.
Safety
The key must be within bounds.
Examples
# use *; let mut slab = new; let key = slab.insert; unsafe assert_eq!;unsafe fn get2_unchecked_mut(self: &mut Self, key1: usize, key2: usize) -> (&mut T, &mut T)Return two mutable references to the values associated with the two given keys simultaneously without performing bounds checking and safety condition checking.
For a safe alternative see
get2_mut.This function should be used with care.
Safety
- Both keys must be within bounds.
- The condition
key1 != key2must hold.
Examples
# use *; use mem; let mut slab = new; let key1 = slab.insert; let key2 = slab.insert; let = unsafe ; swap; assert_eq!; assert_eq!;fn key_of(self: &Self, present_element: &T) -> usizeGet the key for an element in the slab.
The reference must point to an element owned by the slab. Otherwise this function will panic. This is a constant-time operation because the key can be calculated from the reference with pointer arithmetic.
Panics
This function will panic if the reference does not point to an element of the slab.
Examples
# use *; let mut slab = new; let key = slab.insert; let value = &slab; assert_eq!;Values are not compared, so passing a reference to a different location will result in a panic:
# use slab::*; let mut slab = Slab::new(); let key = slab.insert(0); let bad = &0; slab.key_of(bad); // this will panic unreachable!();fn insert(self: &mut Self, val: T) -> usizeInsert a value in the slab, returning key assigned to the value.
The returned key can later be used to retrieve or remove the value using indexed lookup and
remove. Additional capacity is allocated if needed. See Capacity and reallocation.Panics
Panics if the new storage in the vector exceeds
isize::MAXbytes.Examples
# use *; let mut slab = new; let key = slab.insert; assert_eq!;fn vacant_key(self: &Self) -> usizeReturns the key of the next vacant entry.
This function returns the key of the vacant entry which will be used for the next insertion. This is equivalent to
slab.vacant_entry().key(), but it doesn't require mutable access.Examples
# use *; let mut slab = new; assert_eq!; slab.insert; assert_eq!; slab.insert; slab.remove; assert_eq!;fn vacant_entry(self: &mut Self) -> VacantEntry<'_, T>Return a handle to a vacant entry allowing for further manipulation.
This function is useful when creating values that must contain their slab key. The returned
VacantEntryreserves a slot in the slab and is able to query the associated key.Examples
# use *; let mut slab = new; let hello = ; assert_eq!; assert_eq!;fn try_remove(self: &mut Self, key: usize) -> Option<T>Tries to remove the value associated with the given key, returning the value if the key existed.
The key is then released and may be associated with future stored values.
Examples
# use *; let mut slab = new; let hello = slab.insert; assert_eq!; assert!;fn remove(self: &mut Self, key: usize) -> TRemove and return the value associated with the given key.
The key is then released and may be associated with future stored values.
Panics
Panics if
keyis not associated with a value.Examples
# use *; let mut slab = new; let hello = slab.insert; assert_eq!; assert!;fn contains(self: &Self, key: usize) -> boolReturn
trueif a value is associated with the given key.Examples
# use *; let mut slab = new; let hello = slab.insert; assert!; slab.remove; assert!;fn retain<F>(self: &mut Self, f: F) where F: FnMut(usize, &mut T) -> boolRetain only the elements specified by the predicate.
In other words, remove all elements
esuch thatf(usize, &mut e)returns false. This method operates in place and preserves the key associated with the retained values.Examples
# use *; let mut slab = new; let k1 = slab.insert; let k2 = slab.insert; let k3 = slab.insert; slab.retain; assert!; assert!; assert!; assert_eq!;fn drain(self: &mut Self) -> Drain<'_, T>Return a draining iterator that removes all elements from the slab and yields the removed items.
Note: Elements are removed even if the iterator is only partially consumed or not consumed at all.
Examples
# use *; let mut slab = new; let _ = slab.insert; let _ = slab.insert; let _ = slab.insert; assert!;
impl<T> Any for Slab<T>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Slab<T>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Slab<T>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> Clone for Slab<T>
fn clone(self: &Self) -> Selffn clone_from(self: &mut Self, source: &Self)
impl<T> CloneToUninit for Slab<T>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> Debug for Slab<T>
fn fmt(self: &Self, fmt: &mut Formatter<'_>) -> Result
impl<T> Default for Slab<T>
fn default() -> Self
impl<T> Freeze for Slab<T>
impl<T> From for Slab<T>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> FromIterator for Slab<T>
fn from_iter<I>(iterable: I) -> Self where I: IntoIterator<Item = (usize, T)>
impl<T> Index for Slab<T>
fn index(self: &Self, key: usize) -> &T
impl<T> IndexMut for Slab<T>
fn index_mut(self: &mut Self, key: usize) -> &mut T
impl<T> IntoIterator for Slab<T>
fn into_iter(self: Self) -> IntoIter<T>
impl<T> RefUnwindSafe for Slab<T>
impl<T> Send for Slab<T>
impl<T> Sync for Slab<T>
impl<T> ToOwned for Slab<T>
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T> Unpin for Slab<T>
impl<T> UnsafeUnpin for Slab<T>
impl<T> UnwindSafe for Slab<T>
impl<T, U> Into for Slab<T>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Slab<T>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Slab<T>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>