macro_rules! masknz {
($value:tt : $uint:ident) => {{
let mut value: $uint = $value;
value |= value.wrapping_neg();
core::hint::black_box(
value >> ($uint::BITS - 1), )
.wrapping_neg() }};
}
#[cfg(test)]
mod tests {
const TEST_LIMIT: u8 = 128;
macro_rules! masknz_test {
( $($name:ident : $uint:ident),+ ) => {
$(
#[test]
fn $name() {
assert_eq!(masknz!(0: $uint), 0);
for i in 1..=$uint::from(TEST_LIMIT) {
assert_eq!(masknz!(i: $uint), $uint::MAX);
}
for i in ($uint::MAX - $uint::from(TEST_LIMIT))..=$uint::MAX {
assert_eq!(masknz!(i: $uint), $uint::MAX);
}
}
)+
}
}
masknz_test!(
masknz_u8: u8,
masknz_u16: u16,
masknz_u32: u32,
masknz_u64: u64,
masknz_u128: u128,
masknz_usize: usize
);
}