#bit #bit-fields #structs #field #u8 #proc-macro

bit-by-bit

用于定义具有位字段的结构的便捷过程宏

1 个不稳定版本

0.1.0 2021年10月30日

过程宏中排名#1952

MIT/Apache

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