25次发布
0.4.0 | 2024年8月13日 |
---|---|
0.3.10 | 2024年8月13日 |
0.3.7 | 2024年7月30日 |
0.3.5 | 2024年5月15日 |
0.1.2 | 2024年3月28日 |
#351 in 数据结构
830 每月下载量
用于 liberty-db
52KB
698 行
mut_set
使用readonly的思想实现具有iter_mut
和get_mut
的HashSet。
按照以下命令添加crates
cargo add mut_set mut_set_derive
或将它添加到Cargo.toml
[dependencies]
mut_set = "0.3"
mut_set_derive = "0.3"
示例
#[derive(Debug)]
#[mut_set_derive::item]
pub(super) struct MyItem<T1, T2>
where
T1: Sized,
{
#[id]
pub id1: usize,
pub ctx1: T1,
pub(in crate::derive) ctx2: T2,
#[id]
pub id2: String,
}
#[test]
fn test() {
let mut set = mut_set::MutSet::new();
println!("{:?}", set);
set.insert(MyItem {
id1: 2,
id2: "www".to_string(),
ctx1: -1,
ctx2: "ccc".to_string(),
});
set.insert(MyItem {
id1: 1,
id2: "ww".to_string(),
ctx1: -2,
ctx2: "cc".to_string(),
});
println!("{:?}", set);
for v in set.iter() {
println!("{:?}", v);
}
for v in set.iter_mut() {
v.ctx1 = 0;
println!("{:?}", v.id1);
// In `iter_mut` IDs write will be prohibited
// v.id1 = 0;
}
println!("{:?}", set);
let id1 = MyItem::id(2, "www".to_string());
println!("{:?}", set.get(&id1));
for v in set.into_iter() {
println!("{:?}", v);
}
}
mut_set是如何工作的
宏将在tests/src/basic_expand.rs中实现所有内容。
以Xxx
为例
- 创建两个结构体
ImmutIdXxx
和XxxId
。其中ImmutIdXxx
与Xxx
相同,但具有私有的id字段,而XxxId
只包含id字段。 - 进行排列,使所有id字段都位于结构体的开头。借助
#[repr(C)]
,我们可以使用原始指针操作将Xxx
、ImmutIdXxx
和XxxId
进行(零成本?)转换。 impl mut_set::Itemfor Xxx<ImmutIdItem = ImmutIdXxx>
MutSet<T: Item> = HashMap<u64, T::ImmutIdItem>
,其中u64
是哈希值。- 包装迭代函数
iter(&self) -> Iter<&Xxx>
into_iter(self) -> Iter<Xxx>
iter_mut(&mut self) -> Iter<&mutImmutIdXxx>
其他功能
-
如果您想向
ImmutIdXxx/
XxxId
添加一些derive/
proc_macro
。您可以向mut_set_derive::item
添加参数,指定应该添加到ImmutIdXxx/
XxxId
的derive
,以及字段的过滤器属性。例如:#[mut_set_derive::item( macro(derive(Debug, Clone); derive(derivative::Derivative); derivative(Default);), attr_filter(derivative;) )] struct Xxx { #[id] id: usize, #[derivative(Default(value = "8"))] #[some_attr] ctx: usize, }
将实现
#[derive(Debug, Clone)] #[derive(derivative::Derivative)] #[derivative(Default)] struct ImmutIdXxx { id: usize, #[derivative(Default(value = "8"))] ctx: usize, } #[derive(Debug, Clone)] #[derive(derivative::Derivative)] #[derivative(Default)] struct XxxId { id: usize, }
在这里,
some_attr
不在attr_filter()
中,所以它将被移除。更多内容请参阅 tests/src/derive.rs 和 tests/src/derive_expand.rs。
依赖项
~0.4–1MB
~22K SLoC