#位字段 #const #编译时 #结构 #u32 #u16 #生成

nightly 无std const-bitfield

用于生成具有const支持的类似位字段的宏

4个版本

0.2.2 2022年11月29日
0.2.1 2021年12月28日
0.2.0 2021年12月27日
0.1.0 2021年12月27日

无标准库中排名146

Download history 1/week @ 2024-03-08 14/week @ 2024-03-29 4/week @ 2024-04-05

每月下载121

MIT/Apache

20KB
204 代码行

const-bitfield

GitHub Crates.io docs.rs GitHub Actions Status

该crate提供了一个bitfield!宏,用于在Rust中生成类似位字段的类型,并支持使用const进行编译时评估。目前支持以下功能:

  • 支持作为后端存储类型的u8u16u32u64u128
  • bool形式获取和设置单个位值
  • 以无符号/有符号整数类型获取和设置值
  • 可选地将单个获取器映射到任何自定义类型,使用From trait
  • 可选地将单个设置器从任何自定义类型映射,使用From trait
  • 可选支持重叠字段以实现类似联合的行为
  • 实现类似联合的重叠字段
  • no_std兼容
  • 在结构体和字段上使用任意属性
  • 在结构体和字段上使用任意可见性修饰符

遗憾的是,Rust稳定版目前不包含实现此crate所需的所有功能。要使用此库,您必须使用最近的Rust Nightly版本,并在crate根目录中添加以下功能标志

#![feature(const_convert)]      // optional, when using from/into conversion
#![feature(const_mut_refs)]     // always required
#![feature(const_trait_impl)]   // always required

以下是一个如何使用此库的简单示例

#![feature(const_convert)] // optional, when using from/into conversion
#![feature(const_mut_refs)] // always required
#![feature(const_trait_impl)] // always required

use const_bitfield::bitfield;

bitfield! {
    #[derive(Copy, Clone)]
    pub struct MyBitField(u32);
    u8, hello, set_hello: 6, 0;         // hello is stored in bits 0..=6
    bool, world, set_world: 7;          // world is stored in bit 7
    // bits 8..=15 are unused
    u16, goodbye, set_goodbye: 31, 16;   // goodbye is stored in bits 16..=31
}

fn example() {
    let mut bf = MyBitField(0);

    bf.set_hello(0b0110110);
    bf.set_world(true);
    bf.set_goodbye(0xF00F);

    println!("{}", bf.hello());
    println!("{}", bf.world());
    println!("{}", bf.goodbye());
}

更详细的示例可以在tests/bitfield_gdt.rs中找到,该示例使用bitfield!宏实现解析和构建x86全局描述符表的条目。

您可能希望将此crate与const-enum结合使用,以便直接将位域的字段映射到具有repr类型的枚举中。为此,只需使用#[derive(ConstEnum)],例如,与repr(u8)一起。这个特定用例在上面的GDT示例中也有所展示。

额外致谢

此crate深受dzamlo/rust-bitfield的启发。

这两个crate之间的API类似,但无法保证兼容性。与其它库不同,此库专注于const支持,以便在编译时作为复杂数据结构的辅助工具使用,而不会影响运行时性能。

许可证

根据您的选择,许可协议为

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均将根据上述协议双许可,不附加任何额外条款或条件。

无运行时依赖