use std::io::{
BufRead,
Read,
Result,
Seek,
SeekFrom,
};
use crate::{
BinaryReadExt,
ByteOrder,
StringReadExt,
};
pub struct BinaryReader<R> {
inner: R,
byte_order: ByteOrder,
}
impl<R> BinaryReader<R> {
#[inline]
pub fn new(inner: R, byte_order: ByteOrder) -> Self {
Self { inner, byte_order }
}
#[inline]
pub fn get_ref(&self) -> &R {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut R {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> R {
self.inner
}
#[inline]
pub fn byte_order(&self) -> ByteOrder {
self.byte_order
}
#[inline]
pub fn set_byte_order(&mut self, byte_order: ByteOrder) {
self.byte_order = byte_order;
}
}
impl<R> BinaryReader<R>
where
R: Read,
{
#[inline]
pub fn read_u8(&mut self) -> Result<u8> {
self.inner.read_u8()
}
#[inline]
pub fn read_i8(&mut self) -> Result<i8> {
self.inner.read_i8()
}
#[inline]
pub fn read_u16(&mut self) -> Result<u16> {
self.inner.read_u16(self.byte_order)
}
#[inline]
pub fn read_i16(&mut self) -> Result<i16> {
self.inner.read_i16(self.byte_order)
}
#[inline]
pub fn read_u32(&mut self) -> Result<u32> {
self.inner.read_u32(self.byte_order)
}
#[inline]
pub fn read_i32(&mut self) -> Result<i32> {
self.inner.read_i32(self.byte_order)
}
#[inline]
pub fn read_u64(&mut self) -> Result<u64> {
self.inner.read_u64(self.byte_order)
}
#[inline]
pub fn read_i64(&mut self) -> Result<i64> {
self.inner.read_i64(self.byte_order)
}
#[inline]
pub fn read_u128(&mut self) -> Result<u128> {
self.inner.read_u128(self.byte_order)
}
#[inline]
pub fn read_i128(&mut self) -> Result<i128> {
self.inner.read_i128(self.byte_order)
}
#[inline]
pub fn read_f32(&mut self) -> Result<f32> {
self.inner.read_f32(self.byte_order)
}
#[inline]
pub fn read_f64(&mut self) -> Result<f64> {
self.inner.read_f64(self.byte_order)
}
#[inline]
pub fn read_utf8_string_u16(&mut self, max_len: usize) -> Result<String> {
match self.byte_order {
ByteOrder::BigEndian => self.inner.read_utf8_string_u16_be(max_len),
ByteOrder::LittleEndian => self.inner.read_utf8_string_u16_le(max_len),
}
}
#[inline]
pub fn read_utf8_string_u32(&mut self, max_len: usize) -> Result<String> {
match self.byte_order {
ByteOrder::BigEndian => self.inner.read_utf8_string_u32_be(max_len),
ByteOrder::LittleEndian => self.inner.read_utf8_string_u32_le(max_len),
}
}
}
impl<R> Read for BinaryReader<R>
where
R: Read,
{
#[inline]
fn read(&mut self, buffer: &mut [u8]) -> Result<usize> {
self.inner.read(buffer)
}
}
impl<R> BufRead for BinaryReader<R>
where
R: BufRead,
{
#[inline]
fn fill_buf(&mut self) -> Result<&[u8]> {
self.inner.fill_buf()
}
#[inline]
fn consume(&mut self, amount: usize) {
self.inner.consume(amount);
}
}
impl<R> Seek for BinaryReader<R>
where
R: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}