use std::io;
use std::mem;
pub trait WriteBuffer: io::Write {
fn write_u8(&mut self, x: u8) -> io::Result<()>;
fn write_le_i16(&mut self, x: i16) -> io::Result<()>;
fn write_le_u16(&mut self, x: u16) -> io::Result<()>;
fn write_le_i24(&mut self, x: i32) -> io::Result<()>;
fn write_le_u24(&mut self, x: u32) -> io::Result<()>;
fn write_le_i32(&mut self, x: i32) -> io::Result<()>;
fn write_le_u32(&mut self, x: u32) -> io::Result<()>;
fn write_le_f32(&mut self, x: f32) -> io::Result<()>;
}
impl<W> WriteBuffer for W
where W: io::Write
{
#[inline(always)]
fn write_u8(&mut self, x: u8) -> io::Result<()> {
let buf = [x];
self.write_all(&buf)
}
#[inline(always)]
fn write_le_i16(&mut self, x: i16) -> io::Result<()> {
self.write_le_u16(x as u16)
}
#[inline(always)]
fn write_le_u16(&mut self, x: u16) -> io::Result<()> {
let mut buf = [0u8; 2];
buf[0] = (x & 0xff) as u8;
buf[1] = (x >> 8) as u8;
self.write_all(&buf)
}
#[inline(always)]
fn write_le_i24(&mut self, x: i32) -> io::Result<()> {
self.write_le_u24(x as u32)
}
#[inline(always)]
fn write_le_u24(&mut self, x: u32) -> io::Result<()> {
let mut buf = [0u8; 3];
buf[0] = ((x >> 00) & 0xff) as u8;
buf[1] = ((x >> 08) & 0xff) as u8;
buf[2] = ((x >> 16) & 0xff) as u8;
self.write_all(&buf)
}
#[inline(always)]
fn write_le_i32(&mut self, x: i32) -> io::Result<()> {
self.write_le_u32(x as u32)
}
#[inline(always)]
fn write_le_u32(&mut self, x: u32) -> io::Result<()> {
let mut buf = [0u8; 4];
buf[0] = ((x >> 00) & 0xff) as u8;
buf[1] = ((x >> 08) & 0xff) as u8;
buf[2] = ((x >> 16) & 0xff) as u8;
buf[3] = ((x >> 24) & 0xff) as u8;
self.write_all(&buf)
}
#[inline(always)]
fn write_le_f32(&mut self, x: f32) -> io::Result<()> {
let u = unsafe { mem::transmute(x) };
self.write_le_u32(u)
}
}