#索引 #无标准库

无标准库 multindex

使用多个常量索引/范围索引切片

4 个版本

0.1.3 2021年1月8日
0.1.2 2020年7月28日
0.1.1 2020年7月28日
0.1.0 2020年7月28日

2071Rust 模式

Zlib 许可证

60KB
1.5K SLoC

Rust crates-io api-docs

用于使用多个编译时索引/范围索引切片/数组的宏。

这些索引宏会检查索引/范围是否重叠,如果重叠则在编译时出错,然后根据每个传入的参数返回元素/数组/切片的引用元组。

示例

切片作为字段

此示例演示了如何将多个索引和范围借用到一个 Vec 中(也适用于切片和数组)。

use multindex::multindex_mut;

let mut field = (100..200).collect::<Vec<u32>>();

const FIELD_A: usize = 32;
const FIELD_B: usize = 40;
const FIELD_C: usize = 60;
const FIELD_E: usize = 62;

// `&mut` in here copies the value through the mutable reference
let (field_a, &mut field_b, &mut field_c_to_e) =
    multindex_mut!(field; FIELD_A, FIELD_B, FIELD_C..=FIELD_E);

assert_eq!(*field_a, 132);
assert_eq!(field_b, 140);
assert_eq!(field_c_to_e, [160, 161, 162]);

*field_a = field_b;
assert_eq!(*field_a, 140);

*field_a += field_c_to_e.iter().sum::<u32>();
assert_eq!(*field_a, 623);

解析整数

此示例演示了如何将切片的前4个字节作为数组,其余部分作为切片。

use multindex::multiget;

let mut slice = &[0, 0, 1, 10, 20][..];

assert_eq!(grab_u32(&mut slice), Some(266));
assert_eq!(slice, &[20]);

assert_eq!(grab_u32(&mut slice), None);
assert_eq!(slice, &[20]);


fn grab_u32(slice: &mut &[u8]) -> Option<u32> {
    let (u32_bytes, rem) = multiget!(*slice; ..4, ..)?;
    *slice = rem;
    Some(u32::from_be_bytes(*u32_bytes))
}

分割数组

此示例演示了如何将数组分割成更小的数组的引用。

use multindex::multindex;

const ROW_SIZE: usize = 5;

let array: [u16; ROW_SIZE * 4] = [
    1, 2, 3, 5, 8,
    13, 21, 34, 55, 89,
    144, 233, 377, 610, 987,
    1597, 2584, 4181, 6765, 10946,
];


type Row = [u16; ROW_SIZE];
// The type annotation is for the reader, the type can be inferred.
let (row0, row1, row2, row3): (&Row, &Row, &Row, &Row) =
    multindex!(array; ..ROW_SIZE, ..ROW_SIZE * 2, ..ROW_SIZE * 3, ..ROW_SIZE * 4);

assert_eq!(row0, &[1, 2, 3, 5, 8]);
assert_eq!(row1, &[13, 21, 34, 55, 89]);
assert_eq!(row2, &[144, 233, 377, 610, 987]);
assert_eq!(row3, &[1597, 2584, 4181, 6765, 10946]);

最低支持的 Rust 版本

此包需要至少 Rust 1.46.0。

它使用编译时的分支和循环,以检查传递给宏的索引/范围是否重叠(对于可变索引的宏是必需的)。

无标准库支持

此包是 #[no-std]。如果新版本添加了需要 std 的功能,它们将基于是否启用了 "std" 功能进行条件编译(默认情况下不会启用)。

未来计划

目前没有。

许可证

许可协议:Zlib

无运行时依赖