use std::io::{
Read,
Result,
};
use crate::ByteOrder;
pub trait BinaryReadExt: Read {
fn read_u8(&mut self) -> Result<u8>;
fn read_i8(&mut self) -> Result<i8>;
#[inline]
fn read_u16(&mut self, order: ByteOrder) -> Result<u16> {
match order {
ByteOrder::BigEndian => self.read_u16_be(),
ByteOrder::LittleEndian => self.read_u16_le(),
}
}
fn read_u16_be(&mut self) -> Result<u16>;
fn read_u16_le(&mut self) -> Result<u16>;
#[inline]
fn read_i16(&mut self, order: ByteOrder) -> Result<i16> {
match order {
ByteOrder::BigEndian => self.read_i16_be(),
ByteOrder::LittleEndian => self.read_i16_le(),
}
}
fn read_i16_be(&mut self) -> Result<i16>;
fn read_i16_le(&mut self) -> Result<i16>;
#[inline]
fn read_u32(&mut self, order: ByteOrder) -> Result<u32> {
match order {
ByteOrder::BigEndian => self.read_u32_be(),
ByteOrder::LittleEndian => self.read_u32_le(),
}
}
fn read_u32_be(&mut self) -> Result<u32>;
fn read_u32_le(&mut self) -> Result<u32>;
#[inline]
fn read_i32(&mut self, order: ByteOrder) -> Result<i32> {
match order {
ByteOrder::BigEndian => self.read_i32_be(),
ByteOrder::LittleEndian => self.read_i32_le(),
}
}
fn read_i32_be(&mut self) -> Result<i32>;
fn read_i32_le(&mut self) -> Result<i32>;
#[inline]
fn read_u64(&mut self, order: ByteOrder) -> Result<u64> {
match order {
ByteOrder::BigEndian => self.read_u64_be(),
ByteOrder::LittleEndian => self.read_u64_le(),
}
}
fn read_u64_be(&mut self) -> Result<u64>;
fn read_u64_le(&mut self) -> Result<u64>;
#[inline]
fn read_i64(&mut self, order: ByteOrder) -> Result<i64> {
match order {
ByteOrder::BigEndian => self.read_i64_be(),
ByteOrder::LittleEndian => self.read_i64_le(),
}
}
fn read_i64_be(&mut self) -> Result<i64>;
fn read_i64_le(&mut self) -> Result<i64>;
#[inline]
fn read_u128(&mut self, order: ByteOrder) -> Result<u128> {
match order {
ByteOrder::BigEndian => self.read_u128_be(),
ByteOrder::LittleEndian => self.read_u128_le(),
}
}
fn read_u128_be(&mut self) -> Result<u128>;
fn read_u128_le(&mut self) -> Result<u128>;
#[inline]
fn read_i128(&mut self, order: ByteOrder) -> Result<i128> {
match order {
ByteOrder::BigEndian => self.read_i128_be(),
ByteOrder::LittleEndian => self.read_i128_le(),
}
}
fn read_i128_be(&mut self) -> Result<i128>;
fn read_i128_le(&mut self) -> Result<i128>;
#[inline]
fn read_f32(&mut self, order: ByteOrder) -> Result<f32> {
match order {
ByteOrder::BigEndian => self.read_f32_be(),
ByteOrder::LittleEndian => self.read_f32_le(),
}
}
fn read_f32_be(&mut self) -> Result<f32>;
fn read_f32_le(&mut self) -> Result<f32>;
#[inline]
fn read_f64(&mut self, order: ByteOrder) -> Result<f64> {
match order {
ByteOrder::BigEndian => self.read_f64_be(),
ByteOrder::LittleEndian => self.read_f64_le(),
}
}
fn read_f64_be(&mut self) -> Result<f64>;
fn read_f64_le(&mut self) -> Result<f64>;
}
impl<T> BinaryReadExt for T
where
T: Read + ?Sized,
{
#[inline]
fn read_u8(&mut self) -> Result<u8> {
read_bytes::<_, 1>(self).map(|buffer| buffer[0])
}
#[inline]
fn read_i8(&mut self) -> Result<i8> {
read_bytes::<_, 1>(self).map(|buffer| buffer[0] as i8)
}
#[inline]
fn read_u16_be(&mut self) -> Result<u16> {
read_bytes::<_, 2>(self).map(u16::from_be_bytes)
}
#[inline]
fn read_u16_le(&mut self) -> Result<u16> {
read_bytes::<_, 2>(self).map(u16::from_le_bytes)
}
#[inline]
fn read_i16_be(&mut self) -> Result<i16> {
read_bytes::<_, 2>(self).map(i16::from_be_bytes)
}
#[inline]
fn read_i16_le(&mut self) -> Result<i16> {
read_bytes::<_, 2>(self).map(i16::from_le_bytes)
}
#[inline]
fn read_u32_be(&mut self) -> Result<u32> {
read_bytes::<_, 4>(self).map(u32::from_be_bytes)
}
#[inline]
fn read_u32_le(&mut self) -> Result<u32> {
read_bytes::<_, 4>(self).map(u32::from_le_bytes)
}
#[inline]
fn read_i32_be(&mut self) -> Result<i32> {
read_bytes::<_, 4>(self).map(i32::from_be_bytes)
}
#[inline]
fn read_i32_le(&mut self) -> Result<i32> {
read_bytes::<_, 4>(self).map(i32::from_le_bytes)
}
#[inline]
fn read_u64_be(&mut self) -> Result<u64> {
read_bytes::<_, 8>(self).map(u64::from_be_bytes)
}
#[inline]
fn read_u64_le(&mut self) -> Result<u64> {
read_bytes::<_, 8>(self).map(u64::from_le_bytes)
}
#[inline]
fn read_i64_be(&mut self) -> Result<i64> {
read_bytes::<_, 8>(self).map(i64::from_be_bytes)
}
#[inline]
fn read_i64_le(&mut self) -> Result<i64> {
read_bytes::<_, 8>(self).map(i64::from_le_bytes)
}
#[inline]
fn read_u128_be(&mut self) -> Result<u128> {
read_bytes::<_, 16>(self).map(u128::from_be_bytes)
}
#[inline]
fn read_u128_le(&mut self) -> Result<u128> {
read_bytes::<_, 16>(self).map(u128::from_le_bytes)
}
#[inline]
fn read_i128_be(&mut self) -> Result<i128> {
read_bytes::<_, 16>(self).map(i128::from_be_bytes)
}
#[inline]
fn read_i128_le(&mut self) -> Result<i128> {
read_bytes::<_, 16>(self).map(i128::from_le_bytes)
}
#[inline]
fn read_f32_be(&mut self) -> Result<f32> {
read_bytes::<_, 4>(self).map(|buffer| f32::from_bits(u32::from_be_bytes(buffer)))
}
#[inline]
fn read_f32_le(&mut self) -> Result<f32> {
read_bytes::<_, 4>(self).map(|buffer| f32::from_bits(u32::from_le_bytes(buffer)))
}
#[inline]
fn read_f64_be(&mut self) -> Result<f64> {
read_bytes::<_, 8>(self).map(|buffer| f64::from_bits(u64::from_be_bytes(buffer)))
}
#[inline]
fn read_f64_le(&mut self) -> Result<f64> {
read_bytes::<_, 8>(self).map(|buffer| f64::from_bits(u64::from_le_bytes(buffer)))
}
}
fn read_bytes<R, const N: usize>(reader: &mut R) -> Result<[u8; N]>
where
R: Read + ?Sized,
{
let mut buffer = [0; N];
reader.read_exact(&mut buffer)?;
Ok(buffer)
}