1个不稳定版本
使用旧Rust 2015
0.3.0 | 2016年8月11日 |
---|
24 在 #tagged
11KB
169 行
同大小标签数据结构转换
此crate提供了一些样板宏,以实现具有内置判别字段的联合类型之间的转换。例如,一个由多个数据包类型组成的网络协议,其中每个数据包类型由结构体中的字段指示。
#[repr(C)]
pub struct Packet {
packet_type: u8,
// an unknown (depends on packet type) payload
data: [u8; 7],
}
#[repr(C)]
pub struct StatusPacket {
/// must be 0x02 for a status packet
packet_type: u8,
status_0: u8,
status_1: u8,
status_2: u8,
ts: [u8; 4],
}
#[macro_use]
extern crate pcast;
pub enum ConversionError {
WrongPacketType
}
subtype_of!(Packet => StatusPacket | ConversionError {
Ok(())
});
StatusPacket有三个字段用于各种标志和一个四字节的时戳;其存在由packet_type中的0x02值指示。
现在可以使用subtype_of宏来声明这一点。因此,可以将Packet尝试转换为StatusPacket,并传递引用,因为&Span>&StatusPacket将Deref到&Span>&Packet。
不包括从&Span>&mut StatusPacket到&Span>&mut Packet的转换,因为修改Packet结构可能会违反StatusPacket所需的不变量。
依赖关系
~15KB