#vec #array #vector #stack #no_std

nightly no-std staticvec

Implements a fixed-capacity stack-allocated Vec alternative backed by an array, using const generics

58 releases (7 breaking)

✓ Uses Rust 2018 edition

0.9.2 Mar 18, 2020
0.8.9 Mar 13, 2020
0.7.7 Dec 31, 2019
0.5.0 Nov 30, 2019
0.1.6 Jul 31, 2019

#35 in Data structures

Download history 590/week @ 2019-12-10 74/week @ 2019-12-17 98/week @ 2019-12-24 77/week @ 2019-12-31 282/week @ 2020-01-07 331/week @ 2020-01-14 23/week @ 2020-01-21 15/week @ 2020-01-28 61/week @ 2020-02-04 79/week @ 2020-02-11 190/week @ 2020-02-18 584/week @ 2020-02-25 285/week @ 2020-03-03 198/week @ 2020-03-10 420/week @ 2020-03-17 264/week @ 2020-03-24

803 downloads per month
Used in 4 crates

MIT/Apache

265KB
4.5K SLoC

Latest Version Rustc Version nightly

Build Status Build status

Implements a fixed-capacity stack-allocated Vec alternative backed by an array, using const generics.

Note: the word "static" here is meant by the traditional definition of "unchanging" / "not dynamic" etc.

This crate does not use literal static variables for anything (but does provide multiple ways to instantiate a StaticVec as a static or const variable if desired).

Fully #![no_std] compatible (with almost no loss of functionality) by setting default-features = false for the staticvec dependency in your Cargo.toml.

Optional support for serialization and deserialization of the StaticVec struct via serde is available by activating the serde_support crate feature.

StaticVec also implements both Deref and DerefMut to [T], meaning that all existing slice methods are accessible through instances of it and that references to it can be used in contexts where [T] is expected.

As of version 0.8.0, this crate additionally provides a fixed-capacity StaticString struct, which is built around an instance of StaticVec<u8, N>.

As of version 0.8.5, a fixed-capacity StaticHeap struct based on the standard library BinaryHeap and built around an instance of StaticVec<T, N> has been added as well.

Contributions/suggestions/etc. very welcome!

Minimum supported Rust version: due to the use of const generics, this is a nightly-only crate at the moment.

A basic usage example:

use staticvec::{staticvec, StaticVec};

fn main() {
  let mut v = StaticVec::<usize, 64>::new();
  for i in 0..v.capacity() {
    v.push(i);
  }
  for i in &v {
    println!("{}", i);
  }
  v.clear();
  v.insert(0, 47);
  v.insert(1, 48);
  v.insert(2, 49);
  v.insert(v.len() - 1, 50);
  v.insert(v.len() - 2, 51);
  v.insert(v.len() - 3, 52);
  for i in &v {
    println!("{}", i);
  }
  for i in &v.reversed().drain(2..4) {
    println!("{}", i);
  }
  while v.is_not_empty() {
    println!("{}", v.remove(0));
  }
  for f in staticvec![12.0, 14.0, 15.0, 16.0].iter().skip(2) {
    println!("{}", f);
  }
  for i in staticvec![
    staticvec![14, 12, 10].sorted(),
    staticvec![20, 18, 16].reversed(),
    staticvec![26, 24, 22].sorted(),
    staticvec![32, 30, 28].reversed(),
  ]
  .iter()
  .flatten()
  .collect::<StaticVec<usize, 12>>()
  .iter() {
    println!("{}", i);
  }
  // The type parameter is inferred as `StaticVec<usize, 8>`.
  let filled = StaticVec::<_, 128>::filled_with_by_index(|i| {
    staticvec![
      i + 1,
      i + 2,
      i + 3,
      i + 4,
    ]
    .intersperse((i + 4) * 4)
  });
  println!("{:?}", filled);
}

License:

Licensed under either the MIT license or version 2.0 of the Apache License. Your choice as to which! Any source code contributions will be dual-licensed in the same fashion.

Dependencies

~0–275KB