5个版本 (3个重大变更)
0.10.0 | 2022年8月3日 |
---|---|
0.9.0 | 2022年7月15日 |
0.8.0 | 2021年5月4日 |
0.7.1 | 2020年10月28日 |
0.3.0 |
|
#191 in 嵌入式开发
每月791次下载
在 14 个包中使用 (直接使用2个)
61KB
1K SLoC
fixed-slice-vec
FixedSliceVec
是一个由切片支持,具有运行时确定的最大容量的动态长度 Vec。
概览
此库专注于满足以下狭窄用例
no_std
:无需 std 库的 Rust 编程。- 无全局分配器:无法访问
alloc
包。 - 运行时容量:集合中的最大可能项数或存储的最大可能支持字节数在运行时未知。
入门指南
fixed-slice-vec
是一个 Rust 库,通过 Cargo 构建,并通过 Cargo 进行测试。它除了 Rust 核心库之外没有其他依赖。
要将 fixed-slice-vec
添加到您的 Rust 项目中,请在 Cargo.toml 文件中添加对其的依赖关系。
fixed-slice-vec = "0.10.0"
使用方法
FixedSliceVec
在您的 Rust 项目源代码中,您可以通过多种方式创建 FixedSliceVec(请参阅项目的 Rust API 文档以获取详细信息)。最常见的形式是从未初始化的字节切片构建。
use fixed_slice_vec::FixedSliceVec;
use core::mem::MaybeUninit;
// Safe to construct arrays of uninitialized values.
let mut bytes: [MaybeUninit<u8>; 1024] = unsafe { MaybeUninit::uninit().assume_init() };
let byte_slice = &mut bytes[..512];
let mut vec: FixedSliceVec<f64> = FixedSliceVec::from_uninit_bytes(byte_slice);
assert_eq!(0, vec.len());
assert!(vec.capacity() >= 63, "The exact capacity will depend on source-slice alignment");
vec.try_push(2.7f64).expect("Ran out of capacity unexpectedly");
assert_eq!(1, vec.len());
vec.clear();
assert!(vec.is_empty());
单个模块
作为 FixedSliceVec
的配套,single
子模块提供了用于处理由任意字节切片支持的单个 Rust 值的函数。请参阅 API 文档以获取详细信息及示例。
比较
存在几个其他类似于 Vec
的包,应将其视为替代 FixedSliceVec
的可能选择。
- 标准库中的 Vec 有由分配器支持的运行时动态容量。如果您可以访问分配器,这可能是您的首选。
- ArrayVec 具有编译时固定的容量。它被广泛使用,并可在稳定版中找到。
- StaticVec 具有编译时固定的容量。它使用最新的 const 泛型特性,目前仅在 nightly 版本中可用。
- SliceVec 具有运行时固定的容量。在其目标用例中,这是与
FixedSliceVec
最接近的。我们是在开发FixedSliceVec
后才发现它的存在,因此有一些证据表明存在收敛的设计或需求。在过去几年中,它似乎几乎没有维护,没有使用 Rust 中处理未初始化数据的 MaybeUninit 模式,并且在某些情况下未能正确地丢弃项目。它不支持从原始字节创建实例,并且对于某些操作需要Default
元素。
许可证
版权所有 2020 年 Auxon Corporation,在 Apache 2.0 许可证 下发布。