4 个版本
0.2.1 | 2023 年 6 月 25 日 |
---|---|
0.2.0 | 2023 年 6 月 2 日 |
0.1.1 | 2023 年 2 月 8 日 |
0.1.0 | 2023 年 2 月 7 日 |
编码类别下排名 293
每月下载量 2,251
用于 4 个 仓库(3 个直接使用)
51KB
1K SLoC
interner
一个无依赖项且无 unsafe 代码的 Rust 重入仓库(#![forbid(unsafe_code)]
)。大多数现有的重入仓库只提供字符串的重入。这个仓库允许重入路径和字节数据。
此仓库的工作原理
此仓库使用 HashSet
和 Vec
来存储其条目。当查找值时,如果无法在 HashSet
中找到,它将在 Vec
中分配一个槽位。未来的查找将返回一个 Arc
包装数据的克隆。
当 Pooled<T>
值的最后一个引用被丢弃时,池的 HashMap
中的值将被移除,且 Vec
的槽位将可用于重新使用。
此仓库不执行子值重入。每个值都是独立存储的,具有自己的分配。
池值哈希
Pooled<T>
类型通过哈希其内部唯一 ID 而不是使用 T::hash()
来实现 Hash
。这使得池化对象可以用作哈希表和集合中高效的关键字。
因为 T::hash()
与 Pooled<T>::hash()
不同,Pooled<T>
没有实现 Borrow<T>
。这阻止了使用一个 &str
在 HashMap
中查找值。
将 Pooled<T>
值用作基于哈希的集合中的键的另一个重要注意事项是,所有 Pooled<T>
值必须来自同一个池。使用来自不同池的值将导致在大多数情况下查找无法找到包含的键。当使用此不受支持的流程时,永远不会发生不正确的匹配,因为 Pooled<T>::eq()
被实现来验证值来自同一个池,否则将比较底层值。
全局内部字符串
use interner::global::{GlobalString, GlobalPool};
static STRINGS: GlobalPool<String> = GlobalPool::new();
let my_string = STRINGS.get("hello");
let other_copy = STRINGS.get(String::from("hello"));
// Both `my_string` and `other_copy` are pointing to the same underlying string.
assert!(GlobalString::ptr_eq(&my_string, &other_copy));
来自 StringPool 的内部字符串
use interner::shared::{StringPool, SharedString};
let pool = StringPool::default();
let my_string = pool.get("hello");
let other_copy = pool.get(String::from("hello"));
// Both `my_string` and `other_copy` are pointing to the same underlying string.
assert!(SharedString::ptr_eq(&my_string, &other_copy));
全局内部路径
use std::path::{Path, PathBuf};
use interner::global::{GlobalPath, GlobalPool};
static PATHS: GlobalPool<PathBuf> = GlobalPool::new();
let my_path = PATHS.get(Path::new("hello"));
let other_copy = PATHS.get(PathBuf::from("hello"));
// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(GlobalPath::ptr_eq(&my_path, &other_copy));
来自 PathPool 的内部路径
use std::path::{Path, PathBuf};
use interner::shared::{PathPool, SharedPath};
let pool = PathPool::default();
let my_string = pool.get(Path::new("hello"));
let other_copy = pool.get(PathBuf::from("hello"));
// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(SharedPath::ptr_eq(&my_string, &other_copy));
全局内部字节数组
use interner::global::{GlobalBuffer, GlobalPool};
static BUFFERS: GlobalPool<Vec<u8>> = GlobalPool::new();
let my_buffer = BUFFERS.get(&b"hello"[..]);
let other_copy = BUFFERS.get(b"hello".to_vec());
// Both `my_buffer` and `other_copy` are pointing to the same underlying path.
assert!(GlobalBuffer::ptr_eq(&my_buffer, &other_copy));
来自 BufferPool 的内部字节数组
use interner::shared::{BufferPool, SharedBuffer};
let pool = BufferPool::default();
let my_buffer = pool.get(&b"hello"[..]);
let other_copy = pool.get(b"hello".to_vec());
// Both `my_path` and `other_copy` are pointing to the same underlying path.
assert!(SharedBuffer::ptr_eq(&my_buffer, &other_copy));
开源许可
该项目,如同 Khonsu Labs 的所有项目一样,是开源的。此存储库可在 MIT 许可证 或 Apache 许可证 2.0 下使用。
要了解更多关于贡献的信息,请参阅 CONTRIBUTING.md。