macro_rules! bitfield {
($(#[$attributes:meta])* $visibility:vis struct $name:ident($type:ty); $($fields:tt)*) => { ... };
(@impl_range struct $name:ident($type:ty)) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, from $from:ty, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, into $into:ty, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, from into $from_into:ty, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, from $from:ty, into $into:ty, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, $from:tt, $into:tt, $getter:tt, $setter:tt: $($exprs:expr),*; $($rest:tt)*) => { ... };
(@fields @$variant:tt) => { ... };
(@field @$variant:tt $(#[$attributes:meta])* $visibility:vis $type:ty, $from:tt, $into:tt, $getter:ident, $setter:ident: $($exprs:expr),*) => { ... };
(@field @getter $(#[$attributes:meta])* $visibility:vis $type:ty, _, _, $getter:ident, _: $msb:expr, $lsb:expr) => { ... };
(@field @getter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:ty, $into:ty, $getter:ident, _: $msb:expr, $lsb:expr) => { ... };
(@field @getter $(#[$attributes:meta])* $visibility:vis $type:ty, _, _, $getter:ident, _: $bit:expr) => { ... };
(@field @getter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:ty, $into:ty, $getter:ident, _: $bit:expr) => { ... };
(@field @getter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:tt, $into:tt, _, $setter:ident: $($exprs:expr),*) => { ... };
(@field @setter $(#[$attributes:meta])* $visibility:vis $type:ty, _, _, _, $setter:ident: $msb:expr, $lsb:expr) => { ... };
(@field @setter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:ty, $into:ty, _, $setter:ident: $msb:expr, $lsb:expr) => { ... };
(@field @setter $(#[$attributes:meta])* $visibility:vis $type:ty, _, _, _, $setter:ident: $bit:expr) => { ... };
(@field @setter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:ty, $into:ty, _, $setter:ident: $bit:expr) => { ... };
(@field @setter $(#[$attributes:meta])* $visibility:vis $type:ty, $from:tt, $into:tt, $getter:ident, _: $($exprs:expr),*) => { ... };
}Expand description
This macro defines a new bitfield-like struct backed by a single uint-like type.
A variable amount of getters and or setters can be specified on a bitwise level.
Every operation automatically ensures that no bounds are being violated.
ยงExample
#![feature(const_mut_refs)]
#![feature(const_trait_impl)]
use const_bitfield::bitfield;
bitfield! {
pub struct BitField(u16);
u8, field1, set_field1: 7, 0; // u8 getter/setter for bits 0..=7
bool, field2, set_field2: 8; // bool getter/setter for bit 8
bool, field3, _: 9; // bool getter for bit 9
bool, _, set_field4: 10; // bool setter for bit 10
u8, field5, _: 12, 11; // u8 getter for bits 11..=12
u8, _, set_field6: 15, 13; // u8 setter for bits 13..=15
}