#list #generational-arena #backed #data #structure #items #generational-token-list

已删除 generational_indexlist

这个crate已被重命名为generational_token_list。如果您想使用这个crate名称,请与我联系,我会提供给您。

0.1.1 2021年11月27日
0.1.0 2021年11月27日

#15#generational-arena

Download history 22/week @ 2024-04-03 58/week @ 2024-06-19 4/week @ 2024-06-26

每月60次 下载

MIT 许可证

45KB
616 代码行

generational_token_list

Rust MIT licensed

一个由generational-arena支持的循环链表。受indexlist启发。

与返回指向项的指针或数值索引不同,此数据结构返回不透明的ItemToken

fn main() {
    let mut list = GenerationalTokenList::<i32>::new();
    let item1 = list.push_back(10);
    let item2 = list.push_back(20);
    let item3 = list.push_back(30);

    let data = list.into_iter().collect::<Vec<_>>();
    assert_eq!(data, vec![10, 20, 30]);
}

无论插入或删除其他项,令牌仍然有效。删除项会使令牌无效。清空列表会使所有令牌无效。

有关方法和示例的详细信息,请参阅文档。

有用功能

有几个功能我认为使这个crate与众不同,与其他类似crate相比。一些crate实现了这些功能中的一些,但我还没有找到实现所有这些功能的一个(至少,1和2两个功能都实现了)。

  1. 相对其他项插入项
fn main() {
    let mut list = GenerationalTokenList::<i32>::new();
    let item1 = list.push_back(10);
    list.push_back(20);
    list.insert_after(item1, 300);
    // list: [10, 300, 20]
}
  1. 所有push/insert方法都有一个变体,它接受一个FnOnce,允许创建知道自身令牌的项
fn main() {
    struct Meta {
        data: u8,
        my_token: ItemToken,
    }

    let mut list = GenerationalTokenList::new();
    let item1 = list.push_back_with(|token| Meta { data: 1, my_token: token });
    let item2 = list.push_back_with(|token| Meta { data: 2, my_token: token });

    let item1_data = list.head().unwrap();
    assert_eq!(item1, item1_data.my_token);
}
  1. generational-arena中传递get2_mut方法。
  2. 实现IterIterMut特性。

安全性

仅在使用unsafe时,在iter_mut的实现中。我认为没有其他方法。

类似crate

待办事项

欢迎拉取请求 :)

  • 实现IndexIndexMut特性
  • 实现Drain
  • 实现try_push_*try_insert_*方法
  • 实现允许有误插入项的push_*_withinsert_*_with变体?例如。
pub fn push_back_fallible(&mut self, create: impl FnOnce(ItemToken) -> Result<T>) -> Result<ItemToken> {
    //...
}
  • 添加no-std支持?
  • 考虑将#[inline]添加到某些方法中?

免责声明

这不是Agilent的官方产品。没有暗示支持。

依赖关系

~56KB