3个版本
0.0.4 | 2022年11月4日 |
---|---|
0.0.3 | 2022年11月3日 |
0.0.2 | 2021年12月13日 |
0.0.1 |
|
#1570 in 数据结构
49KB
1K SLoC
fr-trie
这是一个通用的模糊和紧凑的Trie实现,专注于
- 小内存占用。
- 高效的缓存。
Trie通过类型为K
的列表进行键控,这些列表可以是任何满足KeyPrefix
和Clone
特质的对象。
这种结构被认为适用于某些特定场景,其中
- 键的前缀基于字符串且高度重复。
- 要存储的键的数量不是很大。
- 需要模糊和可定制的键匹配策略。
更多信息,请参阅API文档。
用法
将fr-trie
添加到您的Cargo.toml
。
[dependencies]
fr-trie = "*"
示例
具有多个结果的Glob匹配
use fr_trie::glob::acl::{Acl, AclTrie, Permissions};
use fr_trie::glob::GlobMatcher;
fn demo() {
let mut trie = AclTrie::new();
trie.insert(Acl::new("/path/*"), Permissions::READ);
trie.insert(Acl::new("/path/to/resource"), Permissions::WRITE);
// Multiget example 1
let result = trie.get_merge::<GlobMatcher>(&Acl::new("/path/to/anything"));
if let Some(value) = result {
if value == Permissions::READ {
println!("Expecting /path/* wilcard key is accessed");
}
}
// Multiget example 2
let result = trie.get_merge::<GlobMatcher>(&Acl::new("/path/to/resource"));
if let Some(value) = result {
if value == (Permissions::READ | Permissions::WRITE) {
println!("Expecting both /path/* wilcard key and /path/to/resource is accessed");
}
}
// Dump trie structure
trie.foreach(|tup| {
let indent= String::from_utf8(vec![b' '; tup.0 *3]).unwrap();
println!("{} {} = {:?}", indent, tup.1, tup.2);
});
}
注意事项
- 尚未完全投入生产
类似的工作
- Radix Trie – Rust中实现的快速通用Radix Trie
- Sequence Trie – 便捷的Trie数据结构
许可证
受MIT许可证许可
依赖项
~0.5–1MB
~25K SLoC