| 0.1.1 |  | 
|---|---|
| 0.1.0 |  | 
#15 在 #generational-arena
每月60次 下载
45KB
616 代码行
generational_token_list
一个由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两个功能都实现了)。
- 相对其他项插入项
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]
}
- 所有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);
}
- 从generational-arena中传递get2_mut方法。
- 实现Iter和IterMut特性。
安全性
仅在使用unsafe时,在iter_mut的实现中。我认为没有其他方法。
类似crate
待办事项
欢迎拉取请求 :)
- 实现Index和IndexMut特性
- 实现Drain
- 实现try_push_*和try_insert_*方法
- 实现允许有误插入项的push_*_with和insert_*_with变体?例如。
pub fn push_back_fallible(&mut self, create: impl FnOnce(ItemToken) -> Result<T>) -> Result<ItemToken> {
    //...
}
- 添加no-std支持?
- 考虑将#[inline]添加到某些方法中?
免责声明
这不是Agilent的官方产品。没有暗示支持。
依赖关系
~56KB