mvbitfield

A bitfield library for Rust.
mvbitfield generates types to work with bit-aligned fields.
Bitfield structs serve roughly the same use cases as C/C++ structs with
bit-field members and are:
- Endian-insensitive, packing fields within an integer rather than across
bytes or array elements.
- Flexible and type-safe with optional user-defined field accessor types.
- Suitable for FFI and memory-mapped I/O with care, as always.
Bitfield enums are unit-only Rust enums with a declared bit width that provide
safe zero-cost conversions to and from an integer type and can be used as
accessors in a bitfield struct.
Demo
use mvbitfield::prelude::*;
bitfield! {
#[lsb_first] #[derive(PartialOrd, Ord)] pub struct MyBitfieldStruct: 32 {
pub some_number: 3,
pub another_number: 8,
_padding: 2,
internal_number: 11,
..,
pub an_enum: 2 as MyBitfieldEnum,
high_bit_flag: 1 as bool,
}
pub enum MyBitfieldEnum: 2 {
Three = 3,
Zero = 0,
One,
..
}
}
#[bitint_literals]
fn main() {
let x = MyBitfieldStruct::zero()
.with_some_number(6_U3)
.with_another_number(0xa5_U8)
.with_internal_number(1025_U11)
.with_an_enum(MyBitfieldEnum::One)
.with_high_bit_flag(true);
assert_eq!(x.some_number(), 6_U3);
assert_eq!(x.some_number().to_primitive(), 6);
assert_eq!(x.another_number(), 0xa5_U8);
assert_eq!(x.another_number().to_primitive(), 0xa5);
assert_eq!(x.internal_number(), 1025_U11);
assert_eq!(x.internal_number().to_primitive(), 1025);
assert_eq!(x.an_enum(), MyBitfieldEnum::One);
assert_eq!(x.high_bit_flag(), true);
assert_eq!(
x.to_bitint(),
0b1_01_00000_10000000001_00_10100101_110_U32,
);
assert_eq!(
x.to_primitive(),
0b1_01_00000_10000000001_00_10100101_110,
);
assert_eq!(x, MyBitfieldStruct::from_bitint(0xa080252e_U32));
assert_eq!(MyBitfieldEnum::One.to_bitint(), 1_U2);
assert_eq!(MyBitfieldEnum::One.to_primitive(), 1);
assert_eq!(
MyBitfieldEnum::One,
MyBitfieldEnum::from_bitint(1_U2),
);
assert_eq!(x, MyBitfieldStruct::from_primitive(0xa080252e));
bitfield! { enum MyU8Enum: 8 { X = 192, .. } }
assert_eq!(MyU8Enum::X, MyU8Enum::from_primitive(192));
assert_eq!(MyBitfieldEnum::Unused2.to_bitint(), 2_U2);
assert_eq!(
MyBitfieldEnum::Unused2,
MyBitfieldEnum::from_bitint(2_U2),
);
}