use std::io;
use ByteOrder;
pub trait ReadBytesExt: io::Read + Sized {
fn read_u8(&mut self) -> io::Result<u8> {
let mut buf = [0; 1];
try!(read_full(self, &mut buf));
Ok(buf[0])
}
fn read_i8(&mut self) -> io::Result<i8> {
let mut buf = [0; 1];
try!(read_full(self, &mut buf));
Ok(buf[0] as i8)
}
fn read_u16<T: ByteOrder>(&mut self) -> io::Result<u16> {
let mut buf = [0; 2];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_u16(&buf))
}
fn read_i16<T: ByteOrder>(&mut self) -> io::Result<i16> {
let mut buf = [0; 2];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_i16(&buf))
}
fn read_u32<T: ByteOrder>(&mut self) -> io::Result<u32> {
let mut buf = [0; 4];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_u32(&buf))
}
fn read_i32<T: ByteOrder>(&mut self) -> io::Result<i32> {
let mut buf = [0; 4];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_i32(&buf))
}
fn read_u64<T: ByteOrder>(&mut self) -> io::Result<u64> {
let mut buf = [0; 8];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_u64(&buf))
}
fn read_i64<T: ByteOrder>(&mut self) -> io::Result<i64> {
let mut buf = [0; 8];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_i64(&buf))
}
fn read_uint<T: ByteOrder>(&mut self, nbytes: usize) -> io::Result<u64> {
let mut buf = [0; 8];
try!(read_full(self, &mut buf[0..nbytes]));
Ok(<T as ByteOrder>::read_uint(&buf, nbytes))
}
fn read_int<T: ByteOrder>(&mut self, nbytes: usize) -> io::Result<i64> {
let mut buf = [0; 8];
try!(read_full(self, &mut buf[0..nbytes]));
Ok(<T as ByteOrder>::read_int(&buf, nbytes))
}
fn read_f32<T: ByteOrder>(&mut self) -> io::Result<f32> {
let mut buf = [0; 4];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_f32(&buf))
}
fn read_f64<T: ByteOrder>(&mut self) -> io::Result<f64> {
let mut buf = [0; 8];
try!(read_full(self, &mut buf));
Ok(<T as ByteOrder>::read_f64(&buf))
}
}
impl<R: io::Read> ReadBytesExt for R {}
fn read_full<R: io::Read>(rdr: &mut R, buf: &mut [u8]) -> io::Result<()> {
let mut n = 0usize;
while n < buf.len() {
n += try!(rdr.read(&mut buf[n..]));
}
Ok(())
}
pub trait WriteBytesExt: io::Write + Sized {
fn write_u8(&mut self, n: u8) -> io::Result<()> {
self.write_all(&[n])
}
fn write_i8(&mut self, n: i8) -> io::Result<()> {
self.write_all(&[n as u8])
}
fn write_u16<T: ByteOrder>(&mut self, n: u16) -> io::Result<()> {
let mut buf = [0; 2];
<T as ByteOrder>::write_u16(&mut buf, n);
self.write_all(&buf)
}
fn write_i16<T: ByteOrder>(&mut self, n: i16) -> io::Result<()> {
let mut buf = [0; 2];
<T as ByteOrder>::write_i16(&mut buf, n);
self.write_all(&buf)
}
fn write_u32<T: ByteOrder>(&mut self, n: u32) -> io::Result<()> {
let mut buf = [0; 4];
<T as ByteOrder>::write_u32(&mut buf, n);
self.write_all(&buf)
}
fn write_i32<T: ByteOrder>(&mut self, n: i32) -> io::Result<()> {
let mut buf = [0; 4];
<T as ByteOrder>::write_i32(&mut buf, n);
self.write_all(&buf)
}
fn write_u64<T: ByteOrder>(&mut self, n: u64) -> io::Result<()> {
let mut buf = [0; 8];
<T as ByteOrder>::write_u64(&mut buf, n);
self.write_all(&buf)
}
fn write_i64<T: ByteOrder>(&mut self, n: i64) -> io::Result<()> {
let mut buf = [0; 8];
<T as ByteOrder>::write_i64(&mut buf, n);
self.write_all(&buf)
}
fn write_f32<T: ByteOrder>(&mut self, n: f32) -> io::Result<()> {
let mut buf = [0; 4];
<T as ByteOrder>::write_f32(&mut buf, n);
self.write_all(&buf)
}
fn write_f64<T: ByteOrder>(&mut self, n: f64) -> io::Result<()> {
let mut buf = [0; 8];
<T as ByteOrder>::write_f64(&mut buf, n);
self.write_all(&buf)
}
}
impl<W: io::Write> WriteBytesExt for W {}