#![cfg(target_pointer_width = "64")]
use crate::broadword;
pub fn needed_bits(x: usize) -> usize {
broadword::msb(x).map_or(1, |n| n + 1)
}
pub const fn ceiled_divide(x: usize, y: usize) -> usize {
(x + y - 1) / y
}
pub(crate) struct MatrixView<'a, T> {
data: &'a [T],
cols: usize,
}
impl<'a, T> MatrixView<'a, T> {
pub fn new(data: &'a [T], cols: usize) -> Self {
assert!(cols > 0, "Number of columns must be greater than zero.");
Self { data, cols }
}
}
impl<'a, T: std::fmt::Debug> std::fmt::Debug for MatrixView<'a, T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if f.alternate() {
writeln!(f, "[")?;
for row in self.data.chunks(self.cols) {
write!(f, " ")?;
for (i, item) in row.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{item:?}")?;
}
writeln!(f, ",")?;
}
write!(f, "]")
} else {
write!(f, "[{} items]", self.data.len())
}
}
}