macro_rules! bytestruct {
(
$(#[$meta:meta])*
$vis:vis struct $name:ident ($N:tt) {
$(
$field_vis:vis $field_name:ident: $field_type:tt = $bits:tt
),* $(,)?
}
) => { ... };
(@impl_conversions $name:ident, 1) => { ... };
(@impl_conversions $name:ident, 2) => { ... };
(@impl_conversions $name:ident, 3) => { ... };
(@impl_conversions $name:ident, 4) => { ... };
(@impl_conversions $name:ident, 5) => { ... };
(@impl_conversions $name:ident, 6) => { ... };
(@impl_conversions $name:ident, 7) => { ... };
(@impl_conversions $name:ident, 8) => { ... };
(@impl_conversions $name:ident, 9) => { ... };
(@impl_conversions $name:ident, 10) => { ... };
(@impl_conversions $name:ident, 11) => { ... };
(@impl_conversions $name:ident, 12) => { ... };
(@impl_conversions $name:ident, 13) => { ... };
(@impl_conversions $name:ident, 14) => { ... };
(@impl_conversions $name:ident, 15) => { ... };
(@impl_conversions $name:ident, 16) => { ... };
(@impl_wide_conv $name:ident, $N:tt, $prim:ty, $to_name:ident, $from_name:ident, $($idx:literal)*) => { ... };
(@route_fields $name:ident, 1, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 2, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 3, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 4, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 5, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 6, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 7, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 8, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 9, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 10, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 11, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 12, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 13, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 14, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 15, $($rest:tt)*) => { ... };
(@route_fields $name:ident, 16, $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, ) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident bool $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u8 $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u16 $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u32 $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u64 $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident u128 $bits:tt $($rest:tt)*) => { ... };
(@impl_int $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident $field_type:tt $bits:tt $($rest:tt)*) => { ... };
(@impl_fields $name:ident, $prim:ty, $shift:expr, $field_vis:vis $field_name:ident $field_type:tt $bits:tt $($rest:tt)*) => { ... };
(@read_localized_prim $arr:expr, $shift:expr, $bits:tt) => { ... };
(@write_localized_prim $arr:expr, $shift:expr, $bits:tt, $val:expr) => { ... };
}Expand description
A unique declarative macro for generating bitfields backed by fixed-size byte arrays.
Unlike standard bitfield libraries that restrict storage to primitives (u8-u128),
bytestruct allows array-backed storage ([u8; 1-16]) while maintaining
register-wide optimization through “Acting Primitives”.
This macro generates a struct wrapping [u8; N]. It uses an internal “acting primitive”
(u32, u64, or u128) based on $N$ to perform efficient bitwise operations.
§Example
use bitcraft::bytestruct;
bytestruct! {
pub struct Example(2) {
pub a: u8 = 4, // 4 bits
pub b: bool = 1, // 1 bit
pub c: u16 = 11, // 11 bits
}
}