1 个不稳定版本
0.1.0 | 2021年10月30日 |
---|
在过程宏中排名#1952
12KB
252 行
bit-by-bit
这个crates允许你定义具有位字段的struct,并安全地使用它们。
当前限制
- 仅支持具有命名字段的struct;
- 仅支持原始整数类型,即{i,u}{8,16,32,64,128};
- 不支持类型别名;
- 不支持位字段的引用。
示例
use bit_by_bit::bit_by_bit;
#[bit_by_bit]
#[derive(Default)]
struct EthernetHeader {
#[bit(7)]
preamble: u8,
#[bit(1)]
sd: u8,
#[bit(6)]
dest: u8,
#[bit(6)]
src: u8,
#[bit(2)]
length: u8,
}
// Will expand to something like that:
#[derive(Default)]
struct EthernetHeader {
__base_field_0: u8,
__base_field_1: u8,
__base_field_2: u8,
__base_field_3: u8,
}
impl EthernetHeader {
fn preamble(&self) -> u8 {
self.__base_field_0 & (1 << 7) - 1
}
fn set_preamble(&mut self, val: u8) {
self.__base_field_0 ^= self.__base_field_0 & (1 << 7) - 1;
self.__base_field_0 |= val & (1 << 7) - 1;
}
fn sd(&self) -> u8 { /*impl*/ }
fn set_sd(&mut self, val: u8) { /*impl*/ }
fn dest(&self) -> u8 { /*impl*/ }
fn set_dest(&mut self, val: u8) { /*impl*/ }
fn src(&self) -> u8 { /*impl*/ }
fn set_src(&mut self, val: u8) { /*impl*/ }
fn length(&self) -> u8 { /*impl*/ }
fn set_length(&mut self, val: u8) { /*impl*/ }
}
依赖项
~1.5MB
~35K SLoC