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

Download history 86/week @ 2024-07-13 20/week @ 2024-07-20 11/week @ 2024-07-27

每月下载 56

MIT/Apache

80KB
1.5K SLoC

Riddance 提供了 Registry 容器,用于存储对象并为它们分配唯一的 ID,也称为“槽映射”或“竞技场”。功能包括

  • 新 ID 可以原子性地“预留”,而不锁定 Registry。请参阅 reserve_idreserve_ids
  • 当槽的生成达到最大值时,槽会被“退役”而不是让生成回滚到零。这可以防止 ID 冲突的逻辑错误。
  • 默认的 [Id] 类型是 64 位,但需要更小 ID 的调用者可以使用 Id32,它具有可配置的生成位数。
  • recycle_retired 方法使重用之前退役的槽成为可能,尽管如果您违反其合同,它可能引入逻辑错误。它主要用于使用 Id32 的调用者。
  • 默认情况下,ID 类型包含创建它们的 RegistryT 类型参数,以避免混淆来自不同注册表的 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