#string-interning #interning #string #symbol #str

tiny-interner

易于使用,快速访问底层字符串并占用内存极小的字符串连接器

4个版本

0.1.5 2023年4月22日
0.1.3 2023年4月22日
0.1.2 2023年4月22日
0.1.1 2023年4月22日

#2268 in 数据结构

每月 34 次下载

MIT 许可证

12KB
219

🪐 tiny_interner 包。

约300行Rust代码,实现了针对您的编程语言编译器的字符串连接功能。

示例

fn main() {
    let interner = Interner::default();
    let s1 = interner.get_or_intern("test");
    let s2 = interner.get_or_intern("test");
    assert_eq!(s1, s2);

    assert_eq!(interner.resolve(0).unwrap(), "test");
}

lib.rs:

约300行Rust代码,实现了针对您的编程语言编译器的字符串连接功能。

该包缓存字符串并将它们与唯一的符号相关联。这允许对底层连接字符串进行常数时间的比较和查找。

示例

连接

use tiny_interner::Interner;

let mut interner = Interner::default();
let symbol0 = interner.get_or_intern("A");
let symbol1 = interner.get_or_intern("B");
let symbol2 = interner.get_or_intern("C");
let symbol3 = interner.get_or_intern("A");

assert_ne!(symbol0, symbol1);
assert_ne!(symbol0, symbol2);
assert_ne!(symbol1, symbol2);
assert_eq!(symbol0, symbol3);

解析符号

use tiny_interner::Interner;

let mut interner = Interner::default();
let symbol0 = interner.get_or_intern("A");
let symbol1 = interner.get_or_intern("B");

assert_eq!(interner.resolve(0), Some("A"));
assert_eq!(interner.resolve(1), Some("B"));
assert_eq!(interner.resolve(2), None);

依赖关系

~1.5MB
~24K SLoC