1 个不稳定版本
0.1.0 | 2023 年 12 月 12 日 |
---|
#1207 在 数据结构
14KB
210 行
Rustifact extras —
未来,这个包可能为 Rustifact 提供其他扩展,但现阶段,它主要用于提供锯齿形数组支持。
动机
定义:一个 锯齿形数组 是具有长度不等的行的数组。
假设我们有一个数组集合 [T; N1]
,[T; N2]
...,[T; Nn]
我们希望在编译时预先计算。我们可以将这些元素存储在 Vec<Vec<T>>
中,或者一个 [Vec<T>; n]
中,但这些不适合静态内存。
JaggedArray
和 BareJaggedArray
类型允许我们通过在构建脚本中使用 Rustifact 预填充来高效地将锯齿形数组存储在静态内存中。
类型
JaggedArray
在编译时和运行时提供索引功能。如果您不确定需求,请使用此类型。BareJaggedArray
在编译时提供索引功能。索引作为令牌流注入到运行时。
一个简单的例子
build.rs
use rustifact::ToTokenStream;
use rustifact_extra::JaggedArrayBuilder;
fn main() {
let mut num_array = JaggedArrayBuilder::new();
num_array.push(vec![1, 2, 3]);
num_array.push(vec![4]);
num_array.push(vec![5, 6]);
rustifact::write_const!(NUM_ARRAY_LEN, usize, num_array.len());
rustifact::write_const!(NUM_ARRAY_ELEMS_LEN, usize, num_array.elems_len());
rustifact::write_static!(NUM_ARRAY, JaggedArray<i32, NUM_ARRAY_LEN, NUM_ARRAY_ELEMS_LEN>, &num_array);
}
src/main.rs
rustifact::use_symbols!(NUM_ARRAY, NUM_ARRAY_LEN, NUM_ARRAY_ELEMS_LEN);
use rustifact_extra::JaggedArray;
fn main() {
assert_eq!(NUM_ARRAY[0], [1, 2, 3]);
assert_eq!(NUM_ARRAY[1], [4]);
assert_eq!(NUM_ARRAY[2], [5, 6]);
}
Cargo.toml
[package]
## ...
[build-dependencies]
rustifact = "0.9"
rustifact_extra = "0.1"
[dependencies]
rustifact = "0.9"
rustifact_extra = "0.1"
更多示例
-
jagged 在运行时生成 JaggedArray 并对其进行索引。
-
barejagged 生成 BareJaggedArray,在编译时对其进行索引,并在运行时访问索引。
不安全代码
不幸的是,截至2023年底,Rust生态系统尚未提供在编译时创建切片的机制。因此,rustifact_extra在其JaggedArray和BareJaggedArray实现中使用了少量的unsafe
代码。请注意,主要的rustifactcrate并没有使用unsafe
。
许可证
rustifact_extra是自由软件,根据Mozilla公共许可证第2.0版发布。请参阅LICENSE。
依赖项
~0.6-1MB
~26K SLoC