10个版本
0.2.0-beta.0 | 2023年7月8日 |
---|---|
0.1.8 | 2022年12月30日 |
0.1.7 | 2022年11月14日 |
#11 in #tagged-pointers
每月52次下载
用于 EnumPtr
14KB
276 行
Enum Ptr
此crate提供了一个自定义 derive 宏 EnumPtr
,用于自动生成在 T
和 Compact<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> {
// ...
}
由于 &i32
和 Box<i32>
都按4字节对齐,它们的最低2位始终为零。Compact<Foo<'a>>
利用这些位来存储标记(区分值)。
功能
- 无需编写不安全指针操作
- 支持各种类型并可扩展
- 支持
no_std
- 类型转换成本最低
- 启用严格来源后,通过
cargo +nightly miri test
测试
$ cargo test
$ cargo +nightly miri test
致谢
- 感谢 @oxalica 审查此crate并提供大量有用的建议。
许可协议
此项目受以下协议之一许可
- Apache License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
依赖项
~0.6–1MB
~24K SLoC