use std::io::{
Result,
Write,
};
use crate::ByteOrder;
pub trait BinaryWriteExt: Write {
fn write_u8(&mut self, value: u8) -> Result<()>;
fn write_i8(&mut self, value: i8) -> Result<()>;
#[inline]
fn write_u16(&mut self, value: u16, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_u16_be(value),
ByteOrder::LittleEndian => self.write_u16_le(value),
}
}
fn write_u16_be(&mut self, value: u16) -> Result<()>;
fn write_u16_le(&mut self, value: u16) -> Result<()>;
#[inline]
fn write_i16(&mut self, value: i16, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_i16_be(value),
ByteOrder::LittleEndian => self.write_i16_le(value),
}
}
fn write_i16_be(&mut self, value: i16) -> Result<()>;
fn write_i16_le(&mut self, value: i16) -> Result<()>;
#[inline]
fn write_u32(&mut self, value: u32, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_u32_be(value),
ByteOrder::LittleEndian => self.write_u32_le(value),
}
}
fn write_u32_be(&mut self, value: u32) -> Result<()>;
fn write_u32_le(&mut self, value: u32) -> Result<()>;
#[inline]
fn write_i32(&mut self, value: i32, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_i32_be(value),
ByteOrder::LittleEndian => self.write_i32_le(value),
}
}
fn write_i32_be(&mut self, value: i32) -> Result<()>;
fn write_i32_le(&mut self, value: i32) -> Result<()>;
#[inline]
fn write_u64(&mut self, value: u64, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_u64_be(value),
ByteOrder::LittleEndian => self.write_u64_le(value),
}
}
fn write_u64_be(&mut self, value: u64) -> Result<()>;
fn write_u64_le(&mut self, value: u64) -> Result<()>;
#[inline]
fn write_i64(&mut self, value: i64, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_i64_be(value),
ByteOrder::LittleEndian => self.write_i64_le(value),
}
}
fn write_i64_be(&mut self, value: i64) -> Result<()>;
fn write_i64_le(&mut self, value: i64) -> Result<()>;
#[inline]
fn write_u128(&mut self, value: u128, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_u128_be(value),
ByteOrder::LittleEndian => self.write_u128_le(value),
}
}
fn write_u128_be(&mut self, value: u128) -> Result<()>;
fn write_u128_le(&mut self, value: u128) -> Result<()>;
#[inline]
fn write_i128(&mut self, value: i128, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_i128_be(value),
ByteOrder::LittleEndian => self.write_i128_le(value),
}
}
fn write_i128_be(&mut self, value: i128) -> Result<()>;
fn write_i128_le(&mut self, value: i128) -> Result<()>;
#[inline]
fn write_f32(&mut self, value: f32, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_f32_be(value),
ByteOrder::LittleEndian => self.write_f32_le(value),
}
}
fn write_f32_be(&mut self, value: f32) -> Result<()>;
fn write_f32_le(&mut self, value: f32) -> Result<()>;
#[inline]
fn write_f64(&mut self, value: f64, order: ByteOrder) -> Result<()> {
match order {
ByteOrder::BigEndian => self.write_f64_be(value),
ByteOrder::LittleEndian => self.write_f64_le(value),
}
}
fn write_f64_be(&mut self, value: f64) -> Result<()>;
fn write_f64_le(&mut self, value: f64) -> Result<()>;
}
impl<T> BinaryWriteExt for T
where
T: Write + ?Sized,
{
#[inline]
fn write_u8(&mut self, value: u8) -> Result<()> {
self.write_all(&[value])
}
#[inline]
fn write_i8(&mut self, value: i8) -> Result<()> {
self.write_all(&[value as u8])
}
#[inline]
fn write_u16_be(&mut self, value: u16) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_u16_le(&mut self, value: u16) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_i16_be(&mut self, value: i16) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_i16_le(&mut self, value: i16) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_u32_be(&mut self, value: u32) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_u32_le(&mut self, value: u32) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_i32_be(&mut self, value: i32) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_i32_le(&mut self, value: i32) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_u64_be(&mut self, value: u64) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_u64_le(&mut self, value: u64) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_i64_be(&mut self, value: i64) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_i64_le(&mut self, value: i64) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_u128_be(&mut self, value: u128) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_u128_le(&mut self, value: u128) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_i128_be(&mut self, value: i128) -> Result<()> {
self.write_all(&value.to_be_bytes())
}
#[inline]
fn write_i128_le(&mut self, value: i128) -> Result<()> {
self.write_all(&value.to_le_bytes())
}
#[inline]
fn write_f32_be(&mut self, value: f32) -> Result<()> {
self.write_u32_be(value.to_bits())
}
#[inline]
fn write_f32_le(&mut self, value: f32) -> Result<()> {
self.write_u32_le(value.to_bits())
}
#[inline]
fn write_f64_be(&mut self, value: f64) -> Result<()> {
self.write_u64_be(value.to_bits())
}
#[inline]
fn write_f64_le(&mut self, value: f64) -> Result<()> {
self.write_u64_le(value.to_bits())
}
}