Thunderdome
Thunderdome 是一个角斗场式世代竞技场,灵感来自 generational-arena、slotmap 和 slab。它通过 Arena
返回的小型(8字节)键提供常数时间的插入、查找和删除操作。
得益于 Rust 的 NonZero*
类型,Thunderdome 的键类型 Index
在 Option<T>
内部仍然只占用 8 字节。
基本示例
let mut arena = Arena::new();
let foo = arena.insert("Foo");
let bar = arena.insert("Bar");
assert_eq!(arena[foo], "Foo");
assert_eq!(arena[bar], "Bar");
arena[bar] = "Replaced";
assert_eq!(arena[bar], "Replaced");
let foo_value = arena.remove(foo);
assert_eq!(foo_value, Some("Foo"));
// foo 之前使用的槽位将被 baz 重新使用
let baz = arena.insert("Baz");
assert_eq!(arena[baz], "Baz");
// foo 不再是有效的键
assert_eq!(arena.get(foo), None);
与类似 Crate 的比较
功能 | Thunderdome | generational-arena | slotmap | slab |
---|---|---|---|---|
世代索引¹ | 是 | 是 | 是 | 否 |
size_of::<Index>() | 8 | 16 | 8 | 8 |
size_of::<Option<Index>>() | 8 | 24 | 8 | 16 |
最大元素数 | 2³² | 2⁶⁴ | 2³² | 2⁶⁴ |
非Copy 值 | 是 | 是 | 是 | 是 |
no_std 支持 | 是 | 是 | 是 | 否 |
Serde 支持 | 否 | 是 | 是 | 否 |
- 大小在 rustc
1.44.0-x86_64-pc-windows-msvc
上计算 - 有关测试的每个库的版本,请参见 Thunderdome 比较 Cargo.toml。
- 世代索引有助于解决 ABA 问题,这个问题可能导致悬空键错误地访问新插入的数据。
最低支持的 Rust 版本(MSRV)
Thunderdome 支持 Rust 1.47.0 及更高版本。在 Thunderdome 达到 1.0 版本之前,MSRV 的变更将需要主版本号的增加。1.0 版本之后,MSRV 的变更只需要次版本号的增加,但需要有充分的理由。
Crate 功能
std
(默认):使用标准库。禁用此功能可使该 crate 兼容no-std
。
许可证
根据以下两种许可证之一授权
- Apache License, Version 2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献,按照 Apache-2.0 许可证的定义,均应按上述方式双重许可,无任何附加条款或条件。