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
和IterMut
1特性。
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