#stack #vec #static #array #const

no-std stack-stack

一个简单的用于栈分配的栈的crate

1 个不稳定版本

0.1.0 2023年2月26日

#2035数据结构

Apache-2.0

27KB
335

一个简单的用于栈分配的栈的crate。当你需要一个小型且具有已知大小界限的Vec,并希望避免动态分配时非常有用。

设计

Stack 实现了一个基本的固定大小、栈分配的、FIFO数据结构。

使用 const 泛型以使类型更易于使用。

为了处理溢出,任何增加栈大小的方法都会返回一个包含任何超出容量的值的Result,其中包含在 Err 变异中的任何值。即使超出容量,也完全没有动态分配。

注意

显然这与 smallvec 很相似,坦白说,你可能应该直接使用 smallvec。开发者们做了出色的作品。我只是想找到与我设计偏好更接近的东西,这是一个有趣的周末项目。

示例

use stack_stack::{Stack, stack};

//Manual creation
let mut s1 = Stack::with_capacity::<5>();

//Pushing returns a result
assert_eq!(s1.push(6), Ok(()));
assert_eq!(s1.push(2), Ok(()));
assert_eq!(s1.push(8), Ok(()));
assert_eq!(s1, [6,2,8]);

//We can ergonomically ignore the #[must_use] warning if needed with `Result::ok()`
s1.push(3).ok();
s1.push(1).ok();
assert_eq!(s1, [6,2,8,3,1]);

//Overflows return return the extra value(s) in a `Result::Err()`
assert_eq!(s1.push(101), Err(101));

//Creation using a list of values and a capacity
let s2 = stack![6,2,8,3,1; 10];
assert_eq!(s2, [6,2,8,3,1]);
assert_eq!(s2.capacity(), 10);

//Repeating a value of `3` 4x times with a capacity of 5
let s3 = stack![3; 4; 5];
assert_eq!(s3, [3,3,3,3]);
assert_eq!(s3.len(), 4);
assert_eq!(s3.capacity(), 5);

无运行时依赖