type TypeWalkerStack<'tcx> = SmallVec<[GenericArg<'tcx>; 8]>;
Aliased Type§
struct TypeWalkerStack<'tcx> { /* private fields */ }
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 72 bytes
Implementations
Source§impl<A> SmallVec<A>
impl<A> SmallVec<A>
Sourcepub fn from_slice(slice: &[<A as Array>::Item]) -> SmallVec<A>
pub fn from_slice(slice: &[<A as Array>::Item]) -> SmallVec<A>
Copy the elements from a slice into a new SmallVec
.
For slices of Copy
types, this is more efficient than SmallVec::from(slice)
.
Sourcepub fn insert_from_slice(&mut self, index: usize, slice: &[<A as Array>::Item])
pub fn insert_from_slice(&mut self, index: usize, slice: &[<A as Array>::Item])
Copy elements from a slice into the vector at position index
, shifting any following
elements toward the back.
For slices of Copy
types, this is more efficient than insert
.
Sourcepub fn extend_from_slice(&mut self, slice: &[<A as Array>::Item])
pub fn extend_from_slice(&mut self, slice: &[<A as Array>::Item])
Copy elements from a slice and append them to the vector.
For slices of Copy
types, this is more efficient than extend
.
Source§impl<A> SmallVec<A>
impl<A> SmallVec<A>
Source§impl<A> SmallVec<A>where
A: Array,
impl<A> SmallVec<A>where
A: Array,
Sourcepub fn with_capacity(n: usize) -> SmallVec<A>
pub fn with_capacity(n: usize) -> SmallVec<A>
Construct an empty vector with enough capacity pre-allocated to store at least n
elements.
Will create a heap allocation only if n
is larger than the inline capacity.
let v: SmallVec<[u8; 3]> = SmallVec::with_capacity(100);
assert!(v.is_empty());
assert!(v.capacity() >= 100);
Sourcepub fn from_vec(vec: Vec<<A as Array>::Item>) -> SmallVec<A>
pub fn from_vec(vec: Vec<<A as Array>::Item>) -> SmallVec<A>
Construct a new SmallVec
from a Vec<A::Item>
.
Elements will be copied to the inline buffer if vec.capacity() <= Self::inline_capacity()
.
use smallvec::SmallVec;
let vec = vec![1, 2, 3, 4, 5];
let small_vec: SmallVec<[_; 3]> = SmallVec::from_vec(vec);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Sourcepub fn from_buf(buf: A) -> SmallVec<A>
pub fn from_buf(buf: A) -> SmallVec<A>
Constructs a new SmallVec
on the stack from an A
without
copying elements.
use smallvec::SmallVec;
let buf = [1, 2, 3, 4, 5];
let small_vec: SmallVec<_> = SmallVec::from_buf(buf);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Sourcepub fn from_buf_and_len(buf: A, len: usize) -> SmallVec<A>
pub fn from_buf_and_len(buf: A, len: usize) -> SmallVec<A>
Constructs a new SmallVec
on the stack from an A
without
copying elements. Also sets the length, which must be less or
equal to the size of buf
.
use smallvec::SmallVec;
let buf = [1, 2, 3, 4, 5, 0, 0, 0];
let small_vec: SmallVec<_> = SmallVec::from_buf_and_len(buf, 5);
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Sourcepub unsafe fn from_buf_and_len_unchecked(
buf: MaybeUninit<A>,
len: usize,
) -> SmallVec<A>
pub unsafe fn from_buf_and_len_unchecked( buf: MaybeUninit<A>, len: usize, ) -> SmallVec<A>
Constructs a new SmallVec
on the stack from an A
without
copying elements. Also sets the length. The user is responsible
for ensuring that len <= A::size()
.
use smallvec::SmallVec;
use std::mem::MaybeUninit;
let buf = [1, 2, 3, 4, 5, 0, 0, 0];
let small_vec: SmallVec<_> = unsafe {
SmallVec::from_buf_and_len_unchecked(MaybeUninit::new(buf), 5)
};
assert_eq!(&*small_vec, &[1, 2, 3, 4, 5]);
Sourcepub unsafe fn set_len(&mut self, new_len: usize)
pub unsafe fn set_len(&mut self, new_len: usize)
Sets the length of a vector.
This will explicitly set the size of the vector, without actually modifying its buffers, so it is up to the caller to ensure that the vector is actually the specified size.
Sourcepub fn inline_size(&self) -> usize
pub fn inline_size(&self) -> usize
The maximum number of elements this vector can hold inline
Sourcepub fn spilled(&self) -> bool
pub fn spilled(&self) -> bool
Returns true
if the data has spilled into a separate heap-allocated buffer.
Sourcepub fn drain<R>(&mut self, range: R) -> Drain<'_, A>where
R: RangeBounds<usize>,
pub fn drain<R>(&mut self, range: R) -> Drain<'_, A>where
R: RangeBounds<usize>,
Creates a draining iterator that removes the specified range in the vector and yields the removed items.
Note 1: The element range is removed even if the iterator is only partially consumed or not consumed at all.
Note 2: It is unspecified how many elements are removed from the vector
if the Drain
value is leaked.
§Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Sourcepub fn pop(&mut self) -> Option<<A as Array>::Item>
pub fn pop(&mut self) -> Option<<A as Array>::Item>
Remove an item from the end of the vector and return it, or None if empty.
Sourcepub fn append<B>(&mut self, other: &mut SmallVec<B>)
pub fn append<B>(&mut self, other: &mut SmallVec<B>)
Moves all the elements of other
into self
, leaving other
empty.
§Example
let mut v0: SmallVec<[u8; 16]> = smallvec![1, 2, 3];
let mut v1: SmallVec<[u8; 32]> = smallvec![4, 5, 6];
v0.append(&mut v1);
assert_eq!(*v0, [1, 2, 3, 4, 5, 6]);
assert_eq!(*v1, []);
Sourcepub fn grow(&mut self, new_cap: usize)
pub fn grow(&mut self, new_cap: usize)
Re-allocate to set the capacity to max(new_cap, inline_size())
.
Panics if new_cap
is less than the vector’s length
or if the capacity computation overflows usize
.
Sourcepub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr>
pub fn try_grow(&mut self, new_cap: usize) -> Result<(), CollectionAllocErr>
Re-allocate to set the capacity to max(new_cap, inline_size())
.
Panics if new_cap
is less than the vector’s length
Sourcepub fn reserve(&mut self, additional: usize)
pub fn reserve(&mut self, additional: usize)
Reserve capacity for additional
more elements to be inserted.
May reserve more space to avoid frequent reallocations.
Panics if the capacity computation overflows usize
.
Sourcepub fn try_reserve(
&mut self,
additional: usize,
) -> Result<(), CollectionAllocErr>
pub fn try_reserve( &mut self, additional: usize, ) -> Result<(), CollectionAllocErr>
Reserve capacity for additional
more elements to be inserted.
May reserve more space to avoid frequent reallocations.
Sourcepub fn reserve_exact(&mut self, additional: usize)
pub fn reserve_exact(&mut self, additional: usize)
Reserve the minimum capacity for additional
more elements to be inserted.
Panics if the new capacity overflows usize
.
Sourcepub fn try_reserve_exact(
&mut self,
additional: usize,
) -> Result<(), CollectionAllocErr>
pub fn try_reserve_exact( &mut self, additional: usize, ) -> Result<(), CollectionAllocErr>
Reserve the minimum capacity for additional
more elements to be inserted.
Sourcepub fn shrink_to_fit(&mut self)
pub fn shrink_to_fit(&mut self)
Shrink the capacity of the vector as much as possible.
When possible, this will move data from an external heap buffer to the vector’s inline storage.
Sourcepub fn truncate(&mut self, len: usize)
pub fn truncate(&mut self, len: usize)
Shorten the vector, keeping the first len
elements and dropping the rest.
If len
is greater than or equal to the vector’s current length, this has no
effect.
This does not re-allocate. If you want the vector’s capacity to shrink, call
shrink_to_fit
after truncating.
Sourcepub fn as_slice(&self) -> &[<A as Array>::Item]
pub fn as_slice(&self) -> &[<A as Array>::Item]
Extracts a slice containing the entire vector.
Equivalent to &s[..]
.
Sourcepub fn as_mut_slice(&mut self) -> &mut [<A as Array>::Item]
pub fn as_mut_slice(&mut self) -> &mut [<A as Array>::Item]
Extracts a mutable slice of the entire vector.
Equivalent to &mut s[..]
.
Sourcepub fn swap_remove(&mut self, index: usize) -> <A as Array>::Item
pub fn swap_remove(&mut self, index: usize) -> <A as Array>::Item
Remove the element at position index
, replacing it with the last element.
This does not preserve ordering, but is O(1).
Panics if index
is out of bounds.
Sourcepub fn remove(&mut self, index: usize) -> <A as Array>::Item
pub fn remove(&mut self, index: usize) -> <A as Array>::Item
Remove and return the element at position index
, shifting all elements after it to the
left.
Panics if index
is out of bounds.
Sourcepub fn insert(&mut self, index: usize, element: <A as Array>::Item)
pub fn insert(&mut self, index: usize, element: <A as Array>::Item)
Insert an element at position index
, shifting all elements after it to the right.
Panics if index > len
.
Sourcepub fn insert_many<I>(&mut self, index: usize, iterable: I)
pub fn insert_many<I>(&mut self, index: usize, iterable: I)
Insert multiple elements at position index
, shifting all following elements toward the
back.
Sourcepub fn into_vec(self) -> Vec<<A as Array>::Item>
pub fn into_vec(self) -> Vec<<A as Array>::Item>
Convert a SmallVec
to a Vec
, without reallocating if the SmallVec
has already spilled onto
the heap.
Sourcepub fn into_boxed_slice(self) -> Box<[<A as Array>::Item]>
pub fn into_boxed_slice(self) -> Box<[<A as Array>::Item]>
Converts a SmallVec
into a Box<[T]>
without reallocating if the SmallVec
has already spilled
onto the heap.
Note that this will drop any excess capacity.
Sourcepub fn into_inner(self) -> Result<A, SmallVec<A>>
pub fn into_inner(self) -> Result<A, SmallVec<A>>
Convert the SmallVec
into an A
if possible. Otherwise return Err(Self)
.
This method returns Err(Self)
if the SmallVec
is too short (and the A
contains uninitialized elements),
or if the SmallVec
is too long (and all the elements were spilled to the heap).
Sourcepub fn retain<F>(&mut self, f: F)
pub fn retain<F>(&mut self, f: F)
Retains only the elements specified by the predicate.
In other words, remove all elements e
such that f(&e)
returns false
.
This method operates in place and preserves the order of the retained
elements.
Sourcepub fn retain_mut<F>(&mut self, f: F)
pub fn retain_mut<F>(&mut self, f: F)
Retains only the elements specified by the predicate.
This method is identical in behaviour to [retain
]; it is included only
to maintain api-compatability with std::Vec
, where the methods are
separate for historical reasons.
Sourcepub fn dedup_by<F>(&mut self, same_bucket: F)
pub fn dedup_by<F>(&mut self, same_bucket: F)
Removes consecutive duplicate elements using the given equality relation.
Sourcepub fn dedup_by_key<F, K>(&mut self, key: F)
pub fn dedup_by_key<F, K>(&mut self, key: F)
Removes consecutive elements that map to the same key.
Sourcepub fn resize_with<F>(&mut self, new_len: usize, f: F)
pub fn resize_with<F>(&mut self, new_len: usize, f: F)
Resizes the SmallVec
in-place so that len
is equal to new_len
.
If new_len
is greater than len
, the SmallVec
is extended by the difference, with each
additional slot filled with the result of calling the closure f
. The return values from f
will end up in the SmallVec
in the order they have been generated.
If new_len
is less than len
, the SmallVec
is simply truncated.
This method uses a closure to create new values on every push. If you’d rather Clone
a given
value, use resize
. If you want to use the Default
trait to generate values, you can pass
Default::default()
as the second argument.
Added for std::vec::Vec
compatibility (added in Rust 1.33.0)
let mut vec : SmallVec<[_; 4]> = smallvec![1, 2, 3];
vec.resize_with(5, Default::default);
assert_eq!(&*vec, &[1, 2, 3, 0, 0]);
let mut vec : SmallVec<[_; 4]> = smallvec![];
let mut p = 1;
vec.resize_with(4, || { p *= 2; p });
assert_eq!(&*vec, &[2, 4, 8, 16]);
Sourcepub unsafe fn from_raw_parts(
ptr: *mut <A as Array>::Item,
length: usize,
capacity: usize,
) -> SmallVec<A>
pub unsafe fn from_raw_parts( ptr: *mut <A as Array>::Item, length: usize, capacity: usize, ) -> SmallVec<A>
Creates a SmallVec
directly from the raw components of another
SmallVec
.
§Safety
This is highly unsafe, due to the number of invariants that aren’t checked:
ptr
needs to have been previously allocated viaSmallVec
for its spilled storage (at least, it’s highly likely to be incorrect if it wasn’t).ptr
’sA::Item
type needs to be the same size and alignment that it was allocated withlength
needs to be less than or equal tocapacity
.capacity
needs to be the capacity that the pointer was allocated with.
Violating these may cause problems like corrupting the allocator’s internal data structures.
Additionally, capacity
must be greater than the amount of inline
storage A
has; that is, the new SmallVec
must need to spill over
into heap allocated storage. This condition is asserted against.
The ownership of ptr
is effectively transferred to the
SmallVec
which may then deallocate, reallocate or change the
contents of memory pointed to by the pointer at will. Ensure
that nothing else uses the pointer after calling this
function.
§Examples
use std::mem;
use std::ptr;
fn main() {
let mut v: SmallVec<[_; 1]> = smallvec![1, 2, 3];
// Pull out the important parts of `v`.
let p = v.as_mut_ptr();
let len = v.len();
let cap = v.capacity();
let spilled = v.spilled();
unsafe {
// Forget all about `v`. The heap allocation that stored the
// three values won't be deallocated.
mem::forget(v);
// Overwrite memory with [4, 5, 6].
//
// This is only safe if `spilled` is true! Otherwise, we are
// writing into the old `SmallVec`'s inline storage on the
// stack.
assert!(spilled);
for i in 0..len {
ptr::write(p.add(i), 4 + i);
}
// Put everything back together into a SmallVec with a different
// amount of inline storage, but which is still less than `cap`.
let rebuilt = SmallVec::<[_; 2]>::from_raw_parts(p, len, cap);
assert_eq!(&*rebuilt, &[4, 5, 6]);
}
}
Sourcepub fn as_ptr(&self) -> *const <A as Array>::Item
pub fn as_ptr(&self) -> *const <A as Array>::Item
Returns a raw pointer to the vector’s buffer.
Sourcepub fn as_mut_ptr(&mut self) -> *mut <A as Array>::Item
pub fn as_mut_ptr(&mut self) -> *mut <A as Array>::Item
Returns a raw mutable pointer to the vector’s buffer.
Trait Implementations
Source§impl<A> Extend<<A as Array>::Item> for SmallVec<A>where
A: Array,
impl<A> Extend<<A as Array>::Item> for SmallVec<A>where
A: Array,
Source§fn extend<I>(&mut self, iterable: I)
fn extend<I>(&mut self, iterable: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)