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
每月下载121次
20KB
204 代码行
const-bitfield
该crate提供了一个bitfield!
宏,用于在Rust中生成类似位字段的类型,并支持使用const
进行编译时评估。目前支持以下功能:
- 支持作为后端存储类型的
u8
、u16
、u32
、u64
、u128
- 以
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 License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均将根据上述协议双许可,不附加任何额外条款或条件。