#枚举 #原始 #结构体 #新类型 #派生 #转换 #prim

nightly proper

将原始类型转换为简单枚举和新类型结构体,反之亦然的派生

6个版本

0.1.5 2019年8月30日
0.1.4 2019年6月12日
0.1.3 2019年5月8日

#71#新类型


2 个crate中使用 (通过 wasi-types)

MIT 许可证

18KB
351

proper

将原始类型转换为简单枚举和新类型结构体。此crate用于在Rust和C表示之间进行转换。

用法

简单枚举

简单 枚举是指没有包含数据的变体的枚举。换句话说,它是一个类似于C/POD枚举(与标记联合不同)。简单枚举可以从不超过 min_ty 的无符号整数类型转换,并转换到不超过 min_ty 的无符号整数类型。默认的 min_ty 是可以容纳枚举变体数量最小的类型。例如,具有255个变体的枚举将具有 min_ty = u8,但具有256个变体的枚举将具有 min_ty = u16。可以使用 #[prim(ty = "<min_ty>")] 属性配置 min_ty

示例

#[macro_use]
extern crate proper;

use std::convert::TryFrom;

#[derive(Prim)]
enum EnumU8 {
    Variant0,
    Variant1,
}

#[derive(Prim)]
#[prim(ty = "u16")]
enum EnumU16 {
    Variant0,
    Variant1,
}

let e_u8 = EnumU8::try_from(42u8)?;
let e_u8 = EnumU8::try_from(42u16)?;   // won't compile!
let e_u16 = EnumU16::try_from(42u16)?; // compiles!

let prim = e_u8 as u32;
let prim = e_u16 as u8;

新类型结构体

可以从与包含类型具有相同符号和位宽且不超过包含类型的整数类型创建新类型结构体。相反,新类型结构体可以转换为与包含类型具有相同符号和位宽的任何整数类型。例如,可以从 u8u16 创建 MyType(u16),但不能从 u32 创建;并且可以转换为 u16u32,但不能转换为 u8

示例

#[macro_use]
extern crate proper;

#[derive(Prim)]
struct FileDescriptor(u32);

let fd = FileDescriptor::from(42u8);
let prim: u16 = fd.into(); // won't compile!
let prim: u32 = fd.into();
let prim: u64 = fd.into();

依赖关系

~1.5MB
~36K SLoC