#[macro_export]
macro_rules! byteval {
($(#[$meta:meta])* $vis:vis struct $name:ident ($count:tt, $unit:tt);) => {
$crate::bytestruct! {
$(#[$meta])* $vis struct $name ([$unit; $count]) {
pub value: (<$crate::Bits<{ $crate::bits_mul!($unit, $count) }> as $crate::BitenumType>::Prim) = @unroll($count)
}
}
};
($(#[$meta:meta])* $vis:vis struct $name:ident (1);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (1, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (2);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (2, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (3);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (3, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (4);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (4, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (5);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (5, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (6);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (6, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (7);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (7, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (8);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (8, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i $count:tt, $unit:tt);) => {
$crate::bytestruct! {
$(#[$meta])* $vis struct $name ([$unit; $count]) {
pub value: (<$crate::Bits<{ $crate::bits_mul!($unit, $count) }> as $crate::SignedBitenumType>::Prim) = @unroll_signed($count)
}
}
};
($(#[$meta:meta])* $vis:vis struct $name:ident (i 1);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 1, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 2);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 2, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 3);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 3, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 4);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 4, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 5);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 5, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 6);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 6, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 7);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 7, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i 8);) => { $crate::byteval! { $(#[$meta])* $vis struct $name (i 8, u8); } };
($(#[$meta:meta])* $vis:vis struct $name:ident (i $count:expr);) => {
$crate::byteval! { $(#[$meta])* $vis struct $name (i $count, u8); }
};
($(#[$meta:meta])* $vis:vis struct $name:ident ($count:expr);) => {
$crate::byteval! { $(#[$meta])* $vis struct $name ($count, u8); }
};
}
#[doc(hidden)]
pub trait BitenumType {
type Prim: Copy + Clone + PartialEq + Eq + core::fmt::Debug + Default;
}
#[doc(hidden)]
pub struct Bits<const N: usize>;