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