Struct heapless::Vec[][src]

pub struct Vec<T, const N: usize> { /* fields omitted */ }
Expand description

A fixed capacity Vec

Examples

use heapless::Vec;


// A vector with a fixed capacity of 8 elements allocated on the stack
let mut vec = Vec::<_, 8>::new();
vec.push(1);
vec.push(2);

assert_eq!(vec.len(), 2);
assert_eq!(vec[0], 1);

assert_eq!(vec.pop(), Some(2));
assert_eq!(vec.len(), 1);

vec[0] = 7;
assert_eq!(vec[0], 7);

vec.extend([1, 2, 3].iter().cloned());

for x in &vec {
    println!("{}", x);
}
assert_eq!(*vec, [7, 1, 2, 3]);

Implementations

impl<T, const N: usize> Vec<T, N>[src]

pub const fn new() -> Self[src]

Constructs a new, empty vector with a fixed capacity of N

Examples

use heapless::Vec;

// allocate the vector on the stack
let mut x: Vec<u8, 16> = Vec::new();

// allocate the vector in a static variable
static mut X: Vec<u8, 16> = Vec::new();

Vec const constructor; wrap the returned value in Vec

pub fn from_slice(other: &[T]) -> Result<Self, ()> where
    T: Clone
[src]

Constructs a new vector with a fixed capacity of N and fills it with the provided slice.

This is equivalent to the following code:

use heapless::Vec;

let mut v: Vec<u8, 16> = Vec::new();
v.extend_from_slice(&[1, 2, 3]).unwrap();

pub fn as_slice(&self) -> &[T][src]

Extracts a slice containing the entire vector.

Equivalent to &s[..].

Examples

use heapless::Vec;
let buffer: Vec<u8, 5> = Vec::from_slice(&[1, 2, 3, 5, 8]).unwrap();
assert_eq!(buffer.as_slice(), &[1, 2, 3, 5, 8]);

pub const fn capacity(&self) -> usize[src]

Returns the maximum number of elements the vector can hold.

pub fn clear(&mut self)[src]

Clears the vector, removing all values.

pub fn extend<I>(&mut self, iter: I) where
    I: IntoIterator<Item = T>, 
[src]

Extends the vec from an iterator.

Panic

Panics if the vec cannot hold all elements of the iterator.

pub fn extend_from_slice(&mut self, other: &[T]) -> Result<(), ()> where
    T: Clone
[src]

Clones and appends all elements in a slice to the Vec.

Iterates over the slice other, clones each element, and then appends it to this Vec. The other vector is traversed in-order.

Examples

use heapless::Vec;

let mut vec = Vec::<u8, 8>::new();
vec.push(1).unwrap();
vec.extend_from_slice(&[2, 3, 4]).unwrap();
assert_eq!(*vec, [1, 2, 3, 4]);

pub fn pop(&mut self) -> Option<T>[src]

Removes the last element from a vector and returns it, or None if it’s empty

pub fn push(&mut self, item: T) -> Result<(), T>[src]

Appends an item to the back of the collection

Returns back the item if the vector is full

pub unsafe fn push_unchecked(&mut self, item: T)[src]

Appends an item to the back of the collection

Safety

This assumes the vec is not full.

pub fn truncate(&mut self, len: usize)[src]

Shortens the vector, keeping the first len elements and dropping the rest.

pub fn resize(&mut self, new_len: usize, value: T) -> Result<(), ()> where
    T: Clone
[src]

Resizes the Vec in-place so that len is equal to new_len.

If new_len is greater than len, the Vec is extended by the difference, with each additional slot filled with value. If new_len is less than len, the Vec is simply truncated.

See also resize_default.

pub fn resize_default(&mut self, new_len: usize) -> Result<(), ()> where
    T: Clone + Default
[src]

Resizes the Vec in-place so that len is equal to new_len.

If new_len is greater than len, the Vec is extended by the difference, with each additional slot filled with Default::default(). If new_len is less than len, the Vec is simply truncated.

See also resize.

pub unsafe fn set_len(&mut self, new_len: usize)[src]

Forces the length of the vector to new_len.

This is a low-level operation that maintains none of the normal invariants of the type. Normally changing the length of a vector is done using one of the safe operations instead, such as truncate, resize, extend, or clear.

Safety

  • new_len must be less than or equal to capacity().
  • The elements at old_len..new_len must be initialized.

Examples

This method can be useful for situations in which the vector is serving as a buffer for other code, particularly over FFI:

use heapless::Vec;

pub fn get_dictionary(&self) -> Option<Vec<u8, 32768>> {
    // Per the FFI method's docs, "32768 bytes is always enough".
    let mut dict = Vec::new();
    let mut dict_length = 0;
    // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that:
    // 1. `dict_length` elements were initialized.
    // 2. `dict_length` <= the capacity (32_768)
    // which makes `set_len` safe to call.
    unsafe {
        // Make the FFI call...
        let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length);
        if r == Z_OK {
            // ...and update the length to what was initialized.
            dict.set_len(dict_length);
            Some(dict)
        } else {
            None
        }
    }
}

While the following example is sound, there is a memory leak since the inner vectors were not freed prior to the set_len call:

use core::iter::FromIterator;
use heapless::Vec;

let mut vec = Vec::<Vec<u8, 3>, 3>::from_iter(
    [
        Vec::from_iter([1, 0, 0].iter().cloned()),
        Vec::from_iter([0, 1, 0].iter().cloned()),
        Vec::from_iter([0, 0, 1].iter().cloned()),
    ]
    .iter()
    .cloned()
);
// SAFETY:
// 1. `old_len..0` is empty so no elements need to be initialized.
// 2. `0 <= capacity` always holds whatever `capacity` is.
unsafe {
    vec.set_len(0);
}

Normally, here, one would use clear instead to correctly drop the contents and thus not leak memory.

pub fn swap_remove(&mut self, index: usize) -> T[src]

Removes an element from the vector and returns it.

The removed element is replaced by the last element of the vector.

This does not preserve ordering, but is O(1).

Panics

Panics if index is out of bounds.

Examples

use heapless::Vec;

let mut v: Vec<_, 8> = Vec::new();
v.push("foo").unwrap();
v.push("bar").unwrap();
v.push("baz").unwrap();
v.push("qux").unwrap();

assert_eq!(v.swap_remove(1), "bar");
assert_eq!(&*v, ["foo", "qux", "baz"]);

assert_eq!(v.swap_remove(0), "foo");
assert_eq!(&*v, ["baz", "qux"]);

pub unsafe fn swap_remove_unchecked(&mut self, index: usize) -> T[src]

Removes an element from the vector and returns it.

The removed element is replaced by the last element of the vector.

This does not preserve ordering, but is O(1).

Safety

Assumes index within bounds.

Examples

use heapless::Vec;

let mut v: Vec<_, 8> = Vec::new();
v.push("foo").unwrap();
v.push("bar").unwrap();
v.push("baz").unwrap();
v.push("qux").unwrap();

assert_eq!(unsafe { v.swap_remove_unchecked(1) }, "bar");
assert_eq!(&*v, ["foo", "qux", "baz"]);

assert_eq!(unsafe { v.swap_remove_unchecked(0) }, "foo");
assert_eq!(&*v, ["baz", "qux"]);

pub fn is_full(&self) -> bool[src]

Returns true if the vec is full

pub fn starts_with(&self, needle: &[T]) -> bool where
    T: PartialEq
[src]

Returns true if needle is a prefix of the Vec.

Always returns true if needle is an empty slice.

Examples

use heapless::Vec;

let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
assert_eq!(v.starts_with(b""), true);
assert_eq!(v.starts_with(b"ab"), true);
assert_eq!(v.starts_with(b"bc"), false);

pub fn ends_with(&self, needle: &[T]) -> bool where
    T: PartialEq
[src]

Returns true if needle is a suffix of the Vec.

Always returns true if needle is an empty slice.

Examples

use heapless::Vec;

let v: Vec<_, 8> = Vec::from_slice(b"abc").unwrap();
assert_eq!(v.ends_with(b""), true);
assert_eq!(v.ends_with(b"ab"), false);
assert_eq!(v.ends_with(b"bc"), true);

Trait Implementations

impl<T, const N: usize> AsMut<[T]> for Vec<T, N>[src]

fn as_mut(&mut self) -> &mut [T][src]

Performs the conversion.

impl<T, const N: usize> AsMut<Vec<T, N>> for Vec<T, N>[src]

fn as_mut(&mut self) -> &mut Self[src]

Performs the conversion.

impl<T, const N: usize> AsRef<[T]> for Vec<T, N>[src]

fn as_ref(&self) -> &[T][src]

Performs the conversion.

impl<T, const N: usize> AsRef<Vec<T, N>> for Vec<T, N>[src]

fn as_ref(&self) -> &Self[src]

Performs the conversion.

impl<T, const N: usize> Clone for Vec<T, N> where
    T: Clone
[src]

fn clone(&self) -> Self[src]

Returns a copy of the value. Read more

fn clone_from(&mut self, source: &Self)1.0.0[src]

Performs copy-assignment from source. Read more

impl<T, const N: usize> Debug for Vec<T, N> where
    T: Debug
[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

Formats the value using the given formatter. Read more

impl<T, const N: usize> Default for Vec<T, N>[src]

fn default() -> Self[src]

Returns the “default value” for a type. Read more

impl<T, const N: usize> Deref for Vec<T, N>[src]

type Target = [T]

The resulting type after dereferencing.

fn deref(&self) -> &[T][src]

Dereferences the value.

impl<T, const N: usize> DerefMut for Vec<T, N>[src]

fn deref_mut(&mut self) -> &mut [T][src]

Mutably dereferences the value.

impl<T, const N: usize> Drop for Vec<T, N>[src]

fn drop(&mut self)[src]

Executes the destructor for this type. Read more

impl<'a, T, const N: usize> Extend<&'a T> for Vec<T, N> where
    T: 'a + Copy
[src]

fn extend<I>(&mut self, iter: I) where
    I: IntoIterator<Item = &'a T>, 
[src]

Extends a collection with the contents of an iterator. Read more

fn extend_one(&mut self, item: A)[src]

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

fn extend_reserve(&mut self, additional: usize)[src]

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

impl<T, const N: usize> Extend<T> for Vec<T, N>[src]

fn extend<I>(&mut self, iter: I) where
    I: IntoIterator<Item = T>, 
[src]

Extends a collection with the contents of an iterator. Read more

fn extend_one(&mut self, item: A)[src]

🔬 This is a nightly-only experimental API. (extend_one)

Extends a collection with exactly one element.

fn extend_reserve(&mut self, additional: usize)[src]

🔬 This is a nightly-only experimental API. (extend_one)

Reserves capacity in a collection for the given number of additional elements. Read more

impl<T, const N: usize> FromIterator<T> for Vec<T, N>[src]

fn from_iter<I>(iter: I) -> Self where
    I: IntoIterator<Item = T>, 
[src]

Creates a value from an iterator. Read more

impl<T, const N: usize> Hash for Vec<T, N> where
    T: Hash
[src]

fn hash<H: Hasher>(&self, state: &mut H)[src]

Feeds this value into the given Hasher. Read more

fn hash_slice<H>(data: &[Self], state: &mut H) where
    H: Hasher
1.3.0[src]

Feeds a slice of this type into the given Hasher. Read more

impl<T, const N: usize> Hash for Vec<T, N> where
    T: Hash
[src]

fn hash<H: Hasher>(&self, state: &mut H)[src]

Feeds this value into the given Hasher.

fn hash_slice<H>(data: &[Self], state: &mut H) where
    H: Hasher
[src]

Feeds a slice of this type into the given Hasher.

impl<'a, T, const N: usize> IntoIterator for &'a Vec<T, N>[src]

type Item = &'a T

The type of the elements being iterated over.

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?

fn into_iter(self) -> Self::IntoIter[src]

Creates an iterator from a value. Read more

impl<'a, T, const N: usize> IntoIterator for &'a mut Vec<T, N>[src]

type Item = &'a mut T

The type of the elements being iterated over.

type IntoIter = IterMut<'a, T>

Which kind of iterator are we turning this into?

fn into_iter(self) -> Self::IntoIter[src]

Creates an iterator from a value. Read more

impl<T, const N: usize> IntoIterator for Vec<T, N>[src]

type Item = T

The type of the elements being iterated over.

type IntoIter = IntoIter<T, N>

Which kind of iterator are we turning this into?

fn into_iter(self) -> Self::IntoIter[src]

Creates an iterator from a value. Read more

impl<A, B, const N: usize, const M: usize> PartialEq<&'_ [B; M]> for Vec<A, N> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &&[B; M]) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<A, B, const N: usize> PartialEq<&'_ [B]> for Vec<A, N> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &&[B]) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<A, B, const N: usize> PartialEq<&'_ mut [B]> for Vec<A, N> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &&mut [B]) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<A, B, const N: usize, const M: usize> PartialEq<[B; M]> for Vec<A, N> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &[B; M]) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<A, B, const N: usize> PartialEq<[B]> for Vec<A, N> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &[B]) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<A, B, const N1: usize, const N2: usize> PartialEq<Vec<B, N2>> for Vec<A, N1> where
    A: PartialEq<B>, 
[src]

fn eq(&self, other: &Vec<B, N2>) -> bool[src]

This method tests for self and other values to be equal, and is used by ==. Read more

#[must_use]
fn ne(&self, other: &Rhs) -> bool
1.0.0[src]

This method tests for !=.

impl<const N: usize> Write for Vec<u8, N>[src]

fn write_str(&mut self, s: &str) -> Result[src]

Writes a string slice into this writer, returning whether the write succeeded. Read more

fn write_char(&mut self, c: char) -> Result<(), Error>1.1.0[src]

Writes a char into this writer, returning whether the write succeeded. Read more

fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>1.0.0[src]

Glue for usage of the write! macro with implementors of this trait. Read more

impl<T, const N: usize> Eq for Vec<T, N> where
    T: Eq
[src]

Auto Trait Implementations

impl<T, const N: usize> Send for Vec<T, N> where
    T: Send

impl<T, const N: usize> Sync for Vec<T, N> where
    T: Sync

impl<T, const N: usize> Unpin for Vec<T, N> where
    T: Unpin

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

pub fn type_id(&self) -> TypeId[src]

Gets the TypeId of self. Read more

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

pub fn borrow(&self) -> &T[src]

Immutably borrows from an owned value. Read more

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

pub fn borrow_mut(&mut self) -> &mut T[src]

Mutably borrows from an owned value. Read more

impl<T> From<T> for T[src]

pub fn from(t: T) -> T[src]

Performs the conversion.

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

pub fn into(self) -> U[src]

Performs the conversion.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]

Performs the conversion.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>[src]

Performs the conversion.