4个版本
0.1.0-alpha.4 | 2023年5月4日 |
---|---|
0.1.0-alpha.3 | 2023年1月7日 |
0.1.0-alpha.2 | 2023年1月4日 |
#1153 in 数据结构
20KB
462 行
dynsequence
DynSequence<dyn Trait>
类似于 Vec<Box<dyn Trait>>
,但通过优化避免了分配。这是通过使用多个较大的内存块并将它们的指针存储在一个 Vec
中实现的。这意味着,项目可以随机访问,但可能不在连续的内存中。
示例
此示例存储多个值到 DynSequence
并访问它们。 (push(...)
需要 "unstable"
功能(仅限nightly版本))
# #[cfg(feature="unstable")] {
use dynsequence::DynSequence;
use std::any::Any;
let mut seq: DynSequence<dyn Any> = DynSequence::new();
seq.push("foo");
seq.push(1234);
assert_eq!(Some(&1234), seq.get(1).and_then(|a| a.downcast_ref()));
assert_eq!(Some(&"foo"), seq.get(0).and_then(|a| a.downcast_ref()));
assert!(seq.get(2).is_none());
assert_eq!(None, seq.get(0).and_then(|a| a.downcast_ref::<bool>()));
# }
以下示例显示了宏的使用方法,它也适用于 stable
use dynsequence::{DynSequence,dyn_sequence};
use std::any::Any;
// construct with macro hack
let mut seq: DynSequence<dyn Any> = dyn_sequence![dyn Any => "foo", 1234];
assert_eq!(Some(&1234), seq.get(1).and_then(|a| a.downcast_ref()));
assert_eq!(Some(&"foo"), seq.get(0).and_then(|a| a.downcast_ref()));
assert!(seq.get(2).is_none());
// push with macro hack
dyn_sequence![dyn Any | &mut seq => {
push (true);
} ];
assert_eq!(Some(&true), seq.get(2).and_then(|a| a.downcast_ref()));
no_std
此crate也应该能够在没有 std
的情况下工作(使用 alloc
)。无需额外配置。
许可证
该项目受以下任一许可证的许可:
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
- Apache许可证2.0版本 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
您可以选择。
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,无需任何附加条款或条件。