4 个版本 (2 个破坏性更新)
0.2.0 | 2024 年 7 月 18 日 |
---|---|
0.1.1 | 2023 年 12 月 18 日 |
0.1.0 | 2023 年 12 月 11 日 |
0.0.0 | 2023 年 11 月 7 日 |
#8 在 #slotmap
每月下载 56 次
80KB
1.5K SLoC
Riddance 提供了 Registry
容器,用于存储对象并为它们分配唯一的 ID,也称为“槽映射”或“竞技场”。功能包括
- 新 ID 可以原子性地“预留”,而不锁定
Registry
。请参阅reserve_id
和reserve_ids
。 - 当槽的生成达到最大值时,槽会被“退役”而不是让生成回滚到零。这可以防止 ID 冲突的逻辑错误。
- 默认的 [
Id
] 类型是 64 位,但需要更小 ID 的调用者可以使用Id32
,它具有可配置的生成位数。 recycle_retired
方法使重用之前退役的槽成为可能,尽管如果您违反其合同,它可能引入逻辑错误。它主要用于使用Id32
的调用者。- 默认情况下,ID 类型包含创建它们的
Registry
的T
类型参数,以避免混淆来自不同注册表的 ID。
示例
use riddance::{Id, Registry};
struct Person {
name: String,
friends: Vec<Id<Person>>,
}
let mut people = Registry::new();
let alice_id = people.insert(Person { name: "Alice".into(), friends: vec![] });
let bob_id = people.insert(Person { name: "Bob".into(), friends: vec![] });
people[alice_id].friends.push(bob_id);
people[bob_id].friends.push(alice_id);
people.remove(bob_id);
assert!(people.get(alice_id).is_some());
assert!(people.get(bob_id).is_none());
依赖
~2MB
~29K SLoC