use nsw_types::u1;
pub trait BitRead: std::io::Read {
fn read_bits(&mut self, buf: &mut [u1]) -> std::io::Result<usize>;
fn read_bits_exact(&mut self, buf: &mut [u1]) -> std::io::Result<()> {
read_bits_exact_helper(self, buf)
}
}
fn read_bits_exact_helper<R: BitRead + ?Sized>(
this: &mut R,
mut buf: &mut [u1],
) -> std::io::Result<()> {
while !buf.is_empty() {
match this.read_bits(buf) {
Ok(0) => break,
Ok(n) => buf = &mut buf[n..],
Err(e) => return Err(e),
}
}
if !buf.is_empty() {
Err(std::io::Error::new(
std::io::ErrorKind::UnexpectedEof,
"failed to fill whole buffer",
))
} else {
Ok(())
}
}