1 个不稳定版本

0.1.0 2023 年 12 月 12 日

#1207数据结构

MPL-2.0 许可证

14KB
210

Rustifact extras — 最新版本 docs

未来,这个包可能为 Rustifact 提供其他扩展,但现阶段,它主要用于提供锯齿形数组支持。

动机

定义:一个 锯齿形数组 是具有长度不等的行的数组。

假设我们有一个数组集合 [T; N1][T; N2]...,[T; Nn] 我们希望在编译时预先计算。我们可以将这些元素存储在 Vec<Vec<T>> 中,或者一个 [Vec<T>; n] 中,但这些不适合静态内存。

JaggedArrayBareJaggedArray 类型允许我们通过在构建脚本中使用 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在其JaggedArrayBareJaggedArray实现中使用了少量的unsafe代码。请注意,主要的rustifactcrate并没有使用unsafe

许可证

rustifact_extra是自由软件,根据Mozilla公共许可证第2.0版发布。请参阅LICENSE

依赖项

~0.6-1MB
~26K SLoC