6个版本
0.2.1 | 2021年5月20日 |
---|---|
0.2.0 | 2021年5月20日 |
0.1.3 | 2021年5月20日 |
0.1.2 | 2021年2月26日 |
#70 在 #位字段
在 3 个crate中使用 (通过 himpi-sys)
15KB
224 代码行
bitfield-derive
此crate提供用于生成具有位字段访问功能的结构的派生工具。
示例
use bitfield_derive::BitFields;
#[derive(Default, BitFields)]
struct Foo {
#[bitfield(bar @ "3:0" as u8 "The bar flags")]
#[bitfield(baz @ "7:4" as u8 "The baz flags")]
#[bitfield(ro, _ @ "8" as bool)] // Read only
#[bitfield(_ , set_wr @ "9" as bool)] // Write only
#[bitfield(stuff @ "31:16" as u16)]
#[bitfield(all_bits @ "31:0")]
_bi1: u32,
other: usize,
}
// Instance a struct with bitfields.
let mut foo = Foo::default();
// Initial states.
assert_eq!(foo.bar(), 0);
assert_eq!(foo.baz(), 0);
foo.set_bar(7);
foo.set_baz(3);
assert_eq!(foo.bar(), 7);
assert_eq!(foo.baz(), 3);
// Overflowing tests.
foo.set_bar(0x13);
foo.set_baz(0x17);
assert_eq!(foo.bar(), 3);
assert_eq!(foo.baz(), 7);
foo.set_bar(0x0f);
foo.set_baz(0x0f);
assert_eq!(foo.bar(), 0x0f);
assert_eq!(foo.baz(), 0x0f);
assert_eq!(foo.ro(), false);
// Compile fail if uncomment the follow line.
// foo.set_ro(false);
// Compile fail if uncomment the follow line.
// assert_eq!(foo.wr(), 0);
foo.set_wr(true);
assert_eq!(foo.stuff(), 0);
foo.set_stuff(0xffff);
assert_eq!(foo.stuff(), 0xffff);
// All bits in the container field.
assert_eq!(foo.all_bits(), 0xffff_02ff);
foo.set_all_bits(0);
assert_eq!(foo.all_bits(), 0);
可见性
位字段的可见性遵循容器字段。
示例
use bitfield_derive::BitFields;
#[derive(Default, BitFields)]
pub struct Foo {
#[bitfield(bar @ "3:0" as u8 "The bar flags")]
pub _bi1: u32;
#[bitfield(baz @ "3:0" as u8 "The baz flags")]
_bi2: u32;
}
容器字段 Foo::_bi1
是 pub
,因此 Foo::bar() 和 Foo::set_bar()
实现如下
impl Foo {
pub fn bar(&self) -> u8 { ... }
pub fn set_bar(&mut self, value: u8) { ... }
}
容器字段 Foo::_bi2
是 private
,因此 Foo::baz() 和 Foo::set_baz()
实现如下
impl Foo {
fn baz(&self) -> u8 { ... }
fn set_baz(&mut self, value: u8) { ... }
}
文档
位字段的最后一个参数是 getter
和 setter
的描述。
上述示例生成的文档如下
[-] pub(crate) fn bar(&self) -> u8
The bar flags
[-] pub(crate) fn set_bar(&mut self, value: u8)
See also: bar
[-] pub(crate) fn baz(&self) -> u8
The baz flags
[-] pub(crate) fn set_baz(&mut self, value: u8)
See also: baz
...
依赖关系
~1.5MB
~35K SLoC