#dynamic #vec #any #homogeneous

univec

可以存储任何单一类型元素的向量

11个版本 (2个稳定版)

1.0.1 2024年5月2日
0.9.0 2024年4月22日
0.4.0 2023年10月7日

#450Rust模式

Download history 818/week @ 2024-04-19 133/week @ 2024-04-26 45/week @ 2024-05-03

每月803次下载

MIT/Apache

39KB
342

一个动态向量,可以存储任何单一类型的元素。

用法

UniVec 是一个动态向量,它封装了任何 Vec<T> 以存储在运行时确定的任何单一类型。其主要用途是在需要存储单个类型的元素,但此类型可能因上下文而异的情况下。

类型 T 在首次插入类型 T 的元素后与 UniVec 的一个实例相关联。一旦设置了类型,后续的所有插入都必须是同一类型。

它包含push/pop API,以实现高效的栈功能。

示例

# use univec::{UniVec, univec};
# use std::collections::HashMap;
let mut things = HashMap::<String, UniVec>::new();

things.insert("integers".to_string(), univec![1, 2, 3]);
things.insert("names".to_string(), univec!["foo", "bar", "baz"]);

assert_eq!(things["integers"].get::<i32>(0), Some(&1));
assert_eq!(things["names"].get::<&str>(0), Some(&"foo"));

便捷功能

此包重新导出 IntoIndex 特征,可以将任何整数类型转换为 usize

这反过来被 At 特征用于提供 at()at_mut() 方法,这些方法可以用来通过任何整数类型访问 UniVecVec 的元素。

性能

UniVecVec<T> 的 dyn 特征包装。大多数操作只是对底层 Vec 的单层间接引用。因此,UniVec 的性能应接近 Vec

限制

  • 由于它基于 std::any::Any 引用,存储对象中包含的引用必须具有 'static 生命周期。
  • 由于结果类型仅在运行时才知,因此没有为 UniVec 实现 IndexIndexMut 特征。相反,使用 At 特征的 at()at_mut() 方法。

趣味事实

这个仓库是一个使用ChatGPT和Codepilot进行代码和文档生成的测试平台。尽管如此,所有代码都经过了人工审计,并使用miri和cargo mutants进行测试。

贡献

欢迎贡献!请随意提交问题或发送pull request。

致谢

  • FSMaxB -- 辅助特质实现想法。

依赖项

~265–720KB
~17K SLoC