1 个稳定版本
1.0.0 | 2021年1月1日 |
---|
1439 在 Rust 模式
6KB
75 代码行
repr-trait
用于表示 Rust repr
的特质
如果泛型参数需要特定的 repr
,可以使用此crate中的特质来确保它具有所需的 repr
。
例如,如果你有一个需要特定 repr
的 unsafe
函数,你可以使用这些特质来创建一个围绕它的安全包装。
use repr_trait::Packed;
// Safety: Only safe to call when T has #[repr(packed)]
unsafe fn safe_when_packed<T>(_param: T) {
unimplemented!()
}
fn safe_wrapper<T: Packed>(param: T) {
// Safety: Safe because T is guaranteed to be #[repr(packed)]
unsafe {
safe_when_packed(param)
}
}
使用 derive 宏实现此crate中的特质很简单。为每个包含的特质都有一个 derive 宏。
#[derive(Packed, Default)]
#[repr(packed)]
struct PackedData(u32, u8);
safe_wrapper(PackedData(123, 45));
如果没有指定适当的 repr
,derive 宏将拒绝编译。
#[derive(Packed)]
struct NotPacked(u32, u8);
结构
此仓库包含两个crate:repr-trait 包含特质并导出 derive 宏。它是应该普遍使用的唯一特质。repr-trait-derive 包含 derive 宏的实现。它是实现细节,通常不应直接依赖。
依赖项
~1.5MB
~34K SLoC