6个版本

0.3.0 2019年4月12日
0.2.3 2019年2月24日
0.2.1 2019年1月5日
0.2.0 2018年8月16日
0.1.0 2018年8月4日

#1890 in 数据结构

Download history 29/week @ 2024-03-11 22/week @ 2024-03-18 6/week @ 2024-03-25 34/week @ 2024-04-01 9/week @ 2024-04-08 16/week @ 2024-04-15 23/week @ 2024-04-22 13/week @ 2024-04-29 9/week @ 2024-05-06 22/week @ 2024-05-13 18/week @ 2024-05-20 24/week @ 2024-05-27 16/week @ 2024-06-03 10/week @ 2024-06-10 14/week @ 2024-06-17 9/week @ 2024-06-24

每月 56 次下载

MPL-2.0+

35KB
701

尺寸向量

Rust类型级别尺寸的向量。

文档

示例

#[macro_use]
use sized_vec::Vec;
use typenum::{U2, U8};

fn main() {
    let vec = svec![1, 2, 3, 4, 5];
    // Use typenums for type safe index access:
    assert_eq!(3, vec[U2::new()]);
    // Out of bounds access won't even compile:
    assert_eq!(0, vec[U8::new()]); // <- type error!
}

许可

版权所有 2018 Bodil Stokke

本软件受Mozilla公共许可证第2.0版的条款约束。如果随此文件未分发MPL副本,您可以在http://mozilla.org/MPL/2.0/ 获取一份。

行为准则

请注意,该项目以贡献者行为准则发布。通过参与此项目,您同意遵守其条款。


lib.rs:

类型级别尺寸向量

此包提供了一个Vec<N, A>类型,它包装了标准Vec<A>并跟踪其类型级别的尺寸N

因为尺寸嵌入在类型中,所以我们可以做一些事情,比如在编译时验证索引查找是否在范围内。

let vec = svec![1, 2, 3];
// This index lookup won't compile, because index `U8` is outside
// the vector's length of `U3`:
assert_eq!(5, vec[U8::new()]);
let vec = svec![1, 2, 3];
// On the other hand, this lookup can be verified to be correct
// by the type system:
assert_eq!(3, vec[U2::new()]);

限制

如果这看起来太好了,那是因为它附带了一些限制:您无法执行可能导致向量长度在编译时无法确定的操作。这包括Extend::extend()和过滤操作,如Vec::retain()

值得注意的是,FromIterator::from_iter也不可用,但您可以使用Vec::try_from作为替代。请注意,try_from需要能够在编译时推断出结果向量的尺寸;无法构建任意长度的向量。

let vec = svec![1, 2, 3, 4, 5];
let new_vec = Vec::try_from_iter(vec.into_iter().map(|i| i + 10));
assert_eq!(Some(svec![11, 12, 13, 14, 15]), new_vec);

依赖项

~0.1–0.9MB
~16K SLoC