#[must_use]
pub const fn ceil_log2(n: usize) -> usize {
match n {
0 | 1 => 0,
_ => (usize::BITS - (n - 1).leading_zeros()) as usize,
}
}
#[must_use]
pub const fn csa_out_width(m: usize, w: usize) -> usize {
w + ceil_log2(m.saturating_mul(2))
}
#[cfg(test)]
mod tests {
use super::{ceil_log2, csa_out_width};
#[test]
fn ceil_log2_table() {
let table: [(usize, usize); 10] = [
(0, 0),
(1, 0),
(2, 1),
(3, 2),
(4, 2),
(5, 3),
(7, 3),
(8, 3),
(9, 4),
(16, 4),
];
table
.iter()
.for_each(|(n, want)| assert_eq!(ceil_log2(*n), *want, "ceil_log2({n})"));
}
#[test]
fn out_width_supranational_bound() {
assert_eq!(csa_out_width(9, 16), 21);
assert_eq!(csa_out_width(5, 8), 12);
}
}