10个版本

0.2.0-beta.02023年7月8日
0.1.8 2022年12月30日
0.1.7 2022年11月14日

#11 in #tagged-pointers

Download history 2/week @ 2024-06-30 24/week @ 2024-07-07 52/week @ 2024-07-28

每月52次下载
用于 EnumPtr

MIT/Apache

14KB
276

Enum Ptr

crates.io docs.rs

此crate提供了一个自定义 derive 宏 EnumPtr,用于自动生成在 TCompact<T> 之间的桥梁,成本最低。Compact<T>T 的紧凑表示形式,它仅占用一个指针宽度。

例如,以下代码

use enum_ptr::EnumPtr;

#[derive(EnumPtr)]
#[repr(C, usize)]
enum Foo<'a> {
    A(&'a i32),
    B(Box<i32>),
}

将生成

impl<'a> From<Foo<'a>> for Compact<Foo<'a>> {
    // ...
}

impl<'a> From<Compact<Foo<'a>>> for Foo<'a> {
    // ...
}

由于 &i32Box<i32> 都按4字节对齐,它们的最低2位始终为零。Compact<Foo<'a>> 利用这些位来存储标记(区分值)。

功能

  • 无需编写不安全指针操作
  • 支持各种类型并可扩展
  • 支持 no_std
  • 类型转换成本最低
  • 启用严格来源后,通过 cargo +nightly miri test

测试

$ cargo test
$ cargo +nightly miri test

致谢

  • 感谢 @oxalica 审查此crate并提供大量有用的建议。

许可协议

此项目受以下协议之一许可

任选其一。

依赖项

~0.6–1MB
~24K SLoC