7 个稳定版本
1.1.1 | 2024年1月31日 |
---|---|
1.1.0 | 2024年1月27日 |
1.0.3 | 2023年10月26日 |
1.0.2 | 2023年9月25日 |
1.0.0 | 2023年7月30日 |
#55 在 缓存 中排名
每月下载量 46
在 3 个 Crates 中使用(通过 lmfu)
90KB
748 代码行
字符串池 / 字符串内联
功能
- 快速
Deref<str>
实现 - 一个指针解析,一个比较和一个指针递增 - 轻量级
PoolStr
类型 - 一个指针 - 池仅在引用它的每个对象都已释放时才被释放。
- 无_std,但需要
alloc
- 线程安全
Pool
的Debug
实现允许您查看其所有字符串- 简单的 O(n /
P
) 插入/搜索,其中P
是Pool
的 const 泛型参数
示例
# use {strpool::{Pool, PoolStr}, core::ops::Deref};
// you can reduce insertion/search complexity by raising this number,
// at the expense of more frequent allocations for small strings.
// strings are spread evenly into these subpools based on their hash.
// => must be a non-zero power of two.
const SUB_POOLS: usize = 1;
// no need for mutability, the pool uses atomic operations
let pool: Pool<SUB_POOLS> = Pool::new();
// use Pool::intern(&self, &str) to insert a string slice into the pool
// if the string was already present, that PoolStr will be reused.
let pool_string = pool.intern("Hello world!");
// you can obtain a &str with the Deref implementation
assert_eq!(pool_string.deref(), "Hello world!");
// Hash, Eq, Debug, Display are implemented as well.
// you can use Pool::find(&self, &str) to check if the pool contains a string
assert_eq!(pool.find("oh hi mark"), None);
// the empty string doesn't rely on a pool, it's always there
assert_eq!(pool.find(""), Some(PoolStr::empty()));
// See all interned strings via the Debug implementation
println!("{:#?}", pool);
内部内存结构(示例)
依赖关系
~165–365KB
~10K SLoC