use std::io::{Error, Read};
#[allow(dead_code, reason = "big endian functions will be used later")]
pub trait ReadInt {
type Error;
fn read_u8(&mut self) -> Result<u8, Self::Error>;
fn read_i32le(&mut self) -> Result<i32, Self::Error>;
fn read_u32le(&mut self) -> Result<u32, Self::Error>;
fn read_u64le(&mut self) -> Result<u64, Self::Error>;
fn read_u16be(&mut self) -> Result<u16, Self::Error>;
fn read_u32be(&mut self) -> Result<u32, Self::Error>;
fn read_u40be(&mut self) -> Result<u64, Self::Error>;
}
impl<T: Read> ReadInt for T {
type Error = Error;
fn read_u8(&mut self) -> Result<u8, Self::Error> {
let mut b = [0; 1];
self.read_exact(&mut b)?;
Ok(b[0])
}
fn read_i32le(&mut self) -> Result<i32, Self::Error> {
let mut b = [0; size_of::<i32>()];
self.read_exact(&mut b)?;
Ok(i32::from_le_bytes(b))
}
fn read_u32le(&mut self) -> Result<u32, Self::Error> {
let mut b = [0; size_of::<u32>()];
self.read_exact(&mut b)?;
Ok(u32::from_le_bytes(b))
}
fn read_u64le(&mut self) -> Result<u64, Self::Error> {
let mut b = [0; size_of::<u64>()];
self.read_exact(&mut b)?;
Ok(u64::from_le_bytes(b))
}
fn read_u16be(&mut self) -> Result<u16, Self::Error> {
let mut b = [0; size_of::<u16>()];
self.read_exact(&mut b)?;
Ok(u16::from_be_bytes(b))
}
fn read_u32be(&mut self) -> Result<u32, Self::Error> {
let mut b = [0; size_of::<u32>()];
self.read_exact(&mut b)?;
Ok(u32::from_be_bytes(b))
}
fn read_u40be(&mut self) -> Result<u64, Self::Error> {
let mut b = [0; size_of::<u64>()];
self.read_exact(&mut b[3..])?;
Ok(u64::from_be_bytes(b))
}
}