use crate::error::Result;
pub trait BitRead {
fn fill_buffer(&mut self, n: u8) -> Result<()>;
fn read_bits(&mut self, n: u8) -> Result<u32>;
fn peek_bits(&mut self, n: u8) -> Result<u32>;
fn consume_bits(&mut self, n: u8);
#[inline]
fn read_bit(&mut self) -> Result<bool> {
Ok(self.read_bits(1)? != 0)
}
fn align_to_byte(&mut self);
#[inline]
fn read_byte(&mut self) -> Result<u8> {
self.align_to_byte();
self.read_bits(8).map(|v| v as u8)
}
#[inline]
fn read_u16_le(&mut self) -> Result<u16> {
self.align_to_byte();
let lo = self.read_bits(8)? as u16;
let hi = self.read_bits(8)? as u16;
Ok(lo | (hi << 8))
}
#[inline]
fn read_u32_le(&mut self) -> Result<u32> {
self.align_to_byte();
let b0 = self.read_bits(8)?;
let b1 = self.read_bits(8)?;
let b2 = self.read_bits(8)?;
let b3 = self.read_bits(8)?;
Ok(b0 | (b1 << 8) | (b2 << 16) | (b3 << 24))
}
#[inline]
fn read_bytes(&mut self, buf: &mut [u8]) -> Result<()> {
self.align_to_byte();
for b in buf.iter_mut() {
*b = self.read_bits(8)? as u8;
}
Ok(())
}
fn bytes_read(&self) -> u64;
}