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

generational_token_list

由generational-arena支持的链表

5次发布

0.1.5 2022年5月24日
0.1.4 2022年5月19日
0.1.3 2021年12月3日
0.1.2 2021年11月29日
0.1.1 2021年11月27日

#1213数据结构

每月44次下载

MIT 许可证

51KB
750

generational_token_list

crates.io 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实现了这些特性中的几个,但我还没有找到一个实现了所有这些特性的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. 实现IterIterMut1特性。

1需要启用iter-mut功能

Cargo功能

  • iter-mut:启用iter_mut方法。有关更多详细信息,请参阅“安全性”部分。

安全性

默认情况下,此crate是forbid(unsafe_code)

如果您需要 GenerationalTokenList::iter_mut 和/或 GenerationalTokenList::iter_with_tokens_mut,则必须启用 iter-mut 功能。这样做会使包 deny(unsafe_code),并通过 allow(unsafe_code) 排除 iter_mut 中的 unsafe 块。

类似包

TODO

欢迎提交 pull request :)

  • 实现 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