6 个版本 (1 个稳定版本)
1.0.0 | 2023 年 10 月 26 日 |
---|---|
1.0.0-beta.2 | 2023 年 10 月 24 日 |
1.0.0-beta.0 | 2021 年 6 月 30 日 |
0.0.2 | 2020 年 9 月 23 日 |
0.0.1 | 2020 年 4 月 7 日 |
在 Rust 模式 中排名 504
每月下载量 104
用于 sprint-dir
105KB
1.5K SLoC
index-ext
一个用于灵活索引的 crate,提高正确性和明确意图。
自动索引类型转换
此 crate 使使用任意整数类型作为数学索引变得方便。这对于索引由外部标准决定的库尤为重要。另一个原因可能是由于平台或性能要求,因此 usize
不是最佳选择。使用此处提供的数据类型和特质,这同样适用于小于或大于 usize
的整数类型。
use index_ext::{Intex, SliceIntExt};
let buffer = [0; 256];
assert_eq!(buffer[Intex(255_u8)], 0);
assert_eq!(buffer[Intex(255_i32)], 0);
assert_eq!(buffer.get_int(-1_i8), None);
assert_eq!(buffer.get_int(u128::max_value()), None);
将索引插入切片以生成数组
泛型提供了更多的可能性。目前,当想要在动态切片中引用静态大小的数组时,最佳选择并不是最方便的。在最新的 nightly Rust 中,我们可以利用参数推导和泛型来设计一个结合最佳特性的索引类型。
use index_ext::ArrayPrefix;
let rgba = [0; 4];
let rgb: [u8; 3] = rgba[ArrayPrefix];
let [r, g, b] = &rgba[ArrayPrefix];
静态检查索引
标签的概念,一个标识唯一切片长度的类型,允许通过类型系统证明某些整数是切片的有效索引。有两种安全使用它的方法,通过借用原始切片和生成生命周期,或者使用编译时常量,以及一种不安全使用任意类型的方法。
use index_ext::tag;
tag::with_ref(&[0, 1, 2, 3][..], |slice, len| {
// Index construction is checked/fallible..
let idx = len.into_len().index(2).unwrap();
// But use is NOT. The method get_safe does no runtime checks.
assert_eq!(*slice.get_safe(idx), 2);
});
这看起来不如实际那么令人印象深刻,因为任何简短的示例也会被优化器的值范围分析捕获。然而,您可以将这些索引安全地存储在结构中,并在函数边界之间传递而不会失败,并且您会得到一个 保证,即访问检查被省略。参见 Huffman 示例以了解具有真实差异的使用案例。
许可证
根据 Apache-2.0、MIT 或 zlib 条款进行三重许可。