#[macro_export]
macro_rules! bit_variants {
($pub:vis $mod:ident;$ty:ty;$($name:ident),+$(,)?) => {
$pub mod $mod {
bit_variants!(0;$ty;$($name)+);
}
};
($count:expr;$ty:ty;$name:ident $($rest:ident)* ) => {
#[allow(bad_style,unused)]
pub const $name:u64 = 1 << $count;
bit_variants!($count+1;$ty;$($rest)*);
};
($count:expr;$ty:ty;)=>{};
}
#[cfg(test)]
mod tests {
#[test]
fn test_bit_variants_macro() {
bit_variants!(test_mod; u64; FLAG_A, FLAG_B, FLAG_C);
assert_eq!(test_mod::FLAG_A, 1 << 0);
assert_eq!(test_mod::FLAG_B, 1 << 1);
assert_eq!(test_mod::FLAG_C, 1 << 2);
}
#[test]
fn test_large_bit_variants() {
bit_variants!(pub large_mod; u128; LARGE_FLAG_1, LARGE_FLAG_2, LARGE_FLAG_3);
assert_eq!(large_mod::LARGE_FLAG_1, 1 << 0);
assert_eq!(large_mod::LARGE_FLAG_2, 1 << 1);
assert_eq!(large_mod::LARGE_FLAG_3, 1 << 2);
}
}