#byte-string #interning #utf-8 #symbol #intern

intaglio

UTF-8 字符串和字节字符串互操作和符号表

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 缓存

Download history 765/week @ 2024-04-21 1725/week @ 2024-04-28 857/week @ 2024-05-05 1484/week @ 2024-05-12 1116/week @ 2024-05-19 1193/week @ 2024-05-26 780/week @ 2024-06-02 931/week @ 2024-06-09 1150/week @ 2024-06-16 1071/week @ 2024-06-23 1491/week @ 2024-06-30 1076/week @ 2024-07-07 1348/week @ 2024-07-14 981/week @ 2024-07-21 1258/week @ 2024-07-28 1392/week @ 2024-08-04

5,095 每月下载量
用于 5 个 Crates (4 直接)

MIT 许可证

215KB
3K SLoC

intaglio

GitHub Actions Code Coverage Discord Twitter
Crate API API trunk

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)。

无运行时依赖