use std::io::{self, Read};
use std::mem;
use crate::order::ByteOrder;
pub struct NumberReader<R: Read> {
inner: R,
order: ByteOrder,
}
impl<R: Read> NumberReader<R> {
#[inline]
pub fn new(src: R) -> NumberReader<R> {
NumberReader::with_order(ByteOrder::NE, src)
}
#[inline]
pub fn with_order(order: ByteOrder, src: R) -> NumberReader<R> {
NumberReader { inner: src, order }
}
pub fn into_inner(self) -> R {
self.inner
}
pub fn get_ref(&self) -> &R {
&self.inner
}
pub fn get_mut(&mut self) -> &mut R {
&mut self.inner
}
#[inline]
pub fn read_u8(&mut self) -> io::Result<u8> {
let mut buf = [0; mem::size_of::<u8>()];
self.inner.read_exact(&mut buf)?;
Ok(buf[0])
}
#[inline]
pub fn read_i8(&mut self) -> io::Result<i8> {
Ok(self.read_u8()? as i8)
}
#[inline]
pub fn read_u16(&mut self) -> io::Result<u16> {
let mut buf = [0; mem::size_of::<u16>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
u16::from_le_bytes(buf)
} else {
u16::from_be_bytes(buf)
})
}
#[inline]
pub fn read_i16(&mut self) -> io::Result<i16> {
Ok(self.read_u16()? as i16)
}
#[inline]
pub fn read_u32(&mut self) -> io::Result<u32> {
let mut buf = [0; mem::size_of::<u32>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
u32::from_le_bytes(buf)
} else {
u32::from_be_bytes(buf)
})
}
#[inline]
pub fn read_i32(&mut self) -> io::Result<i32> {
Ok(self.read_u32()? as i32)
}
#[inline]
pub fn read_u64(&mut self) -> io::Result<u64> {
let mut buf = [0; mem::size_of::<u64>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
u64::from_le_bytes(buf)
} else {
u64::from_be_bytes(buf)
})
}
#[inline]
pub fn read_i64(&mut self) -> io::Result<i64> {
Ok(self.read_u64()? as i64)
}
#[inline]
pub fn read_u128(&mut self) -> io::Result<u128> {
let mut buf = [0; mem::size_of::<u128>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
u128::from_le_bytes(buf)
} else {
u128::from_be_bytes(buf)
})
}
#[inline]
pub fn read_i128(&mut self) -> io::Result<i128> {
Ok(self.read_u128()? as i128)
}
#[inline]
pub fn read_f32(&mut self) -> io::Result<f32> {
let mut buf = [0; mem::size_of::<f32>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
f32::from_le_bytes(buf)
} else {
f32::from_be_bytes(buf)
})
}
#[inline]
pub fn read_f64(&mut self) -> io::Result<f64> {
let mut buf = [0; mem::size_of::<f64>()];
self.inner.read_exact(&mut buf)?;
Ok(if let ByteOrder::LE = self.order {
f64::from_le_bytes(buf)
} else {
f64::from_be_bytes(buf)
})
}
}
impl<R: Read> Read for NumberReader<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.inner.read(buf)
}
}