#dynamically-sized #dst #vec #dyn #collection #allocation

no-std dynsequence

用于存储动态大小类型的序列化数据结构

4个版本

0.1.0-alpha.42023年5月4日
0.1.0-alpha.32023年1月7日
0.1.0-alpha.22023年1月4日

#1153 in 数据结构

MIT/Apache

20KB
462

dynsequence

Crates.io docs.rs license: MIT/Apache-2.0 Rust CI

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)。无需额外配置。

许可证

该项目受以下任一许可证的许可:

您可以选择。

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,无需任何附加条款或条件。

无运行时依赖项

功能