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次下载
51KB
750 行
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实现了这些特性中的几个,但我还没有找到一个实现了所有这些特性的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和IterMut1特性。
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_*_with和insert_*_with变体?例如。
pub fn push_back_fallible(&mut self, create: impl FnOnce(ItemToken) -> Result<T>) -> Result<ItemToken> {
    //...
}
- 添加 no-std支持?'
- 考虑将 #[inline]添加到某些方法中?
免责声明
这不是 Agilent 的官方产品。不提供支持。
依赖项
~56KB