use std::num::NonZeroUsize;
use anyhow::Result;
use bitcode::encoding::Encoding;
use bitcode::word::Word;
use bitcode::Decode;
use serde::de::DeserializeOwned;
pub trait ReadBuffer: BitRead {
fn capacity(&self) -> usize;
fn deserialize<T: DeserializeOwned>(&mut self) -> Result<T>;
fn decode<T: Decode>(&mut self, encoding: impl Encoding) -> Result<T>;
fn start_read(bytes: &[u8]) -> Self;
fn finish_read(&mut self) -> Result<()>;
}
pub trait BitRead {
fn advance(&mut self, bits: usize);
fn peek_bits(&mut self) -> Result<Word>;
fn read_bit(&mut self) -> Result<bool>;
fn read_bits(&mut self, bits: usize) -> Result<Word>;
fn read_bytes(&mut self, len: NonZeroUsize) -> Result<&[u8]>;
fn reserve_bits(&self, bits: usize) -> Result<()>;
}