16 个稳定版本
1.9.1 | 2023 年 7 月 28 日 |
---|---|
1.8.0 | 2023 年 1 月 1 日 |
1.7.0 | 2022 年 8 月 8 日 |
1.6.1 | 2022 年 4 月 23 日 |
1.1.0 | 2020 年 7 月 4 日 |
#15 in 缓存
5,095 每月下载量
用于 5 个 Crates (4 直接)
215KB
3K SLoC
intaglio
UTF-8 字符串和字节字符串互操作和符号表。用于实现 Artichoke Ruby 中的 Ruby Symbol
表和常量名称表。
符号对象代表 Ruby 解释器内部的名字和一些字符串。它们使用
:name
和:"string"
文字语法以及各种to_sym
方法生成。在程序执行期间,对于给定的名字或字符串,将创建相同的Symbol
对象,无论该名字的上下文或含义如何。
Intaglio 是一个 UTF-8 和字节字符串互操作,这意味着它存储一个不可变的 &str
或 &[u8]
的单份副本,可以通过稳定的 u32
标记进行引用。
由于互操作字符串和字节字符串被表示为一个 u32
整数,因此它们便宜且易于比较和复制。
Intaglio 是 雕刻宝石 的别名,是一种雕刻有图像的宝石。Intaglio Crates 用于在 Artichoke Ruby 中实现不可变的符号存储。
用法
将此添加到您的 Cargo.toml
[dependencies]
intaglio = "1.9.1"
然后互操作 UTF-8 字符串,例如
fn intern_and_get() -> Result<(), Box<dyn std::error::Error>> {
let mut table = intaglio::SymbolTable::new();
let name: &'static str = "abc";
let sym = table.intern(name)?;
let retrieved = table.get(sym);
assert_eq!(Some(name), retrieved);
assert_eq!(sym, table.intern("abc".to_string())?);
Ok(())
}
或互操作字节字符串,例如
fn intern_and_get() -> Result<(), Box<dyn std::error::Error>> {
let mut table = intaglio::bytes::SymbolTable::new();
let name: &'static [u8] = b"abc";
let sym = table.intern(name)?;
let retrieved = table.get(sym);
assert_eq!(Some(name), retrieved);
assert_eq!(sym, table.intern(b"abc".to_vec())?);
Ok(())
}
或互操作 C 字符串,例如
use std::ffi::{CStr, CString};
fn intern_and_get() -> Result<(), Box<dyn std::error::Error>> {
let mut table = intaglio::cstr::SymbolTable::new();
let name: &'static CStr = CStr::from_bytes_with_nul(b"abc\0")?;
let sym = table.intern(name)?;
let retrieved = table.get(sym);
assert_eq!(Some(name), retrieved);
assert_eq!(sym, table.intern(CString::new(*b"abc")?)?);
Ok(())
}
或互操作平台字符串,例如
use std::ffi::{OsStr, OsString};
fn intern_and_get() -> Result<(), Box<dyn std::error::Error>> {
let mut table = intaglio::osstr::SymbolTable::new();
let name: &'static OsStr = OsStr::new("abc");
let sym = table.intern(name)?;
let retrieved = table.get(sym);
assert_eq!(Some(name), retrieved);
assert_eq!(sym, table.intern(OsString::from("abc"))?);
Ok(())
}
或互操作路径字符串,例如
use std::path::{Path, PathBuf};
fn intern_and_get() -> Result<(), Box<dyn std::error::Error>> {
let mut table = intaglio::path::SymbolTable::new();
let name: &'static Path = Path::new("abc");
let sym = table.intern(name)?;
let retrieved = table.get(sym);
assert_eq!(Some(name), retrieved);
assert_eq!(sym, table.intern(PathBuf::from("abc"))?);
Ok(())
}
实现
Intaglio 通过利用 Cow
和一些不安全的代码,无需额外复制即可互操作拥有和借用字符串。CI 在 Miri 和 LeakSanitizer 下运行 drop
测试。
Crates 功能
默认启用所有功能。
- bytes - 启用额外的符号表实现,用于内部化字节字符串(
Vec<u8>
和&'static [u8]
)。 - cstr - 启用额外的符号表实现,用于内部化C字符串(
CString
和&'static CStr
)。 - osstr - 启用额外的符号表实现,用于内部化平台字符串(
OsString
和&'static OsStr
)。 - path - 启用额外的符号表实现,用于内部化路径字符串(
PathBuf
和&'static Path
)。
最低支持的Rust版本
本crate需要至少Rust 1.58.0。此版本可以在小版本更新中提升。
许可证
intaglio
在MIT许可证(c)下授权(版权所有:Ryan Lopopolo)。