3个版本

0.0.4 2022年11月4日
0.0.3 2022年11月3日
0.0.2 2021年12月13日
0.0.1 2021年12月13日

#1570 in 数据结构

MIT 协议

49KB
1K SLoC

fr-trie

CI CodeCov

这是一个通用的模糊和紧凑的Trie实现,专注于

  • 小内存占用。
  • 高效的缓存。

Trie通过类型为K的列表进行键控,这些列表可以是任何满足KeyPrefixClone特质的对象。

这种结构被认为适用于某些特定场景,其中

  • 键的前缀基于字符串且高度重复。
  • 要存储的键的数量不是很大。
  • 需要模糊和可定制的键匹配策略。

更多信息,请参阅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);
    });
}

注意事项

  • 尚未完全投入生产

类似的工作

许可证

MIT许可证许可

依赖项

~0.5–1MB
~25K SLoC