#![no_std]
#![deny(missing_docs)]
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "byteorder")]
extern crate byteorder;
extern crate void;
#[cfg(feature = "std")]
pub mod std_impls;
pub mod error;
pub mod ext;
pub mod util;
pub mod bufio;
use void::Void;
use error::{ReadExactError, ExtendError};
use util::Chain;
#[cfg(feature = "byteorder")]
use byteorder::ByteOrder;
pub trait Read {
type ReadError;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError>;
fn read_exact(&mut self, mut buf: &mut [u8]) -> Result<(), ReadExactError<Self::ReadError>> {
if self.available_bytes(buf.len()) {
while !buf.is_empty() {
let read_bytes = self.read(buf)?;
if read_bytes == 0 {
return Err(ReadExactError::UnexpectedEnd);
}
let tmp = buf;
buf = &mut tmp[read_bytes..];
}
return Ok(());
} else {
Err(ReadExactError::UnexpectedEnd)
}
}
fn available_bytes(&self, _at_least: usize) -> bool {
true
}
fn chain<R: Read>(self, other: R) -> Chain<Self, R> where Self: Sized {
Chain::new(self, other)
}
fn read_to_end<T: ExtendFromReader>(&mut self, container: &mut T) -> Result<usize, ExtendError<Self::ReadError, T::ExtendError>> where Self: ReadOverwrite {
let mut total_bytes = 0;
loop {
let bytes = container.extend_from_reader(self)?;
if bytes == 0 {
return Ok(total_bytes)
}
total_bytes += bytes;
}
}
fn by_ref(&mut self) -> &mut Self where Self: Sized {
self
}
#[cfg(feature = "byteorder")]
fn read_u16<BO: ByteOrder>(&mut self) -> Result<u16, Self::WriteError> {
let mut buf = [0; 2];
self.read_exact(&mut buf)?;
Ok(BO::read_u16(&buf))
}
#[cfg(feature = "byteorder")]
fn read_u32<BO: ByteOrder>(&mut self) -> Result<u32, Self::WriteError> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(BO::read_u32(&buf))
}
#[cfg(feature = "byteorder")]
fn read_u64<BO: ByteOrder>(&mut self) -> Result<u64, Self::WriteError> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(BO::read_u64(&buf))
}
#[cfg(feature = "byteorder")]
fn read_i16<BO: ByteOrder>(&mut self) -> Result<i16, Self::WriteError> {
let mut buf = [0; 2];
self.read_exact(&mut buf)?;
Ok(BO::read_i16(&buf))
}
#[cfg(feature = "byteorder")]
fn read_i32<BO: ByteOrder>(&mut self) -> Result<i32, Self::WriteError> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(BO::read_i32(&buf))
}
#[cfg(feature = "byteorder")]
fn read_i64<BO: ByteOrder>(&mut self) -> Result<i64, Self::WriteError> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(BO::read_i64(&buf))
}
#[cfg(feature = "byteorder")]
fn read_f32<BO: ByteOrder>(&mut self) -> Result<f32, Self::WriteError> {
let mut buf = [0; 4];
self.read_exact(&mut buf)?;
Ok(BO::read_f32(&buf))
}
#[cfg(feature = "byteorder")]
fn read_f64<BO: ByteOrder>(&mut self) -> Result<f64, Self::WriteError> {
let mut buf = [0; 8];
self.read_exact(&mut buf)?;
Ok(BO::read_f64(&buf))
}
}
pub trait ExtendFromReaderSlow {
type ExtendError;
fn extend_from_reader_slow<R: Read + ?Sized>(&mut self, reader: &mut R) -> Result<usize, ExtendError<R::ReadError, Self::ExtendError>>;
}
pub trait ExtendFromReader: ExtendFromReaderSlow {
fn extend_from_reader<R: Read + ReadOverwrite + ?Sized>(&mut self, reader: &mut R) -> Result<usize, ExtendError<R::ReadError, Self::ExtendError>>;
}
pub unsafe trait ReadOverwrite: Read {}
pub trait Write {
type WriteError;
type FlushError;
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError>;
fn flush(&mut self) -> Result<(), Self::FlushError>;
fn write_all(&mut self, mut buf: &[u8]) -> Result<(), Self::WriteError> {
while !buf.is_empty() {
let len = self.write(buf)?;
buf = &buf[len..];
}
Ok(())
}
fn size_hint(&mut self, bytes: usize);
fn uses_size_hint(&self) -> bool {
false
}
#[cfg(feature = "byteorder")]
fn write_u16<BO: ByteOrder>(&mut self, val: u16) -> Result<(), Self::WriteError> {
let mut buf = [0; 2];
BO::write_u16(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_u32<BO: ByteOrder>(&mut self, val: u32) -> Result<(), Self::WriteError> {
let mut buf = [0; 4];
BO::write_u32(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_u64<BO: ByteOrder>(&mut self, val: u64) -> Result<(), Self::WriteError> {
let mut buf = [0; 8];
BO::write_u64(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_uint<BO: ByteOrder>(&mut self, val: u64, bytes: usize) -> Result<(), Self::WriteError> {
let mut buf = [0; 8];
BO::write_uint(&mut buf, val, bytes);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_i16<BO: ByteOrder>(&mut self, val: i16) -> Result<(), Self::WriteError> {
let mut buf = [0; 2];
BO::write_i16(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_i32<BO: ByteOrder>(&mut self, val: i32) -> Result<(), Self::WriteError> {
let mut buf = [0; 4];
BO::write_i32(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_i64<BO: ByteOrder>(&mut self, val: i64) -> Result<(), Self::WriteError> {
let mut buf = [0; 8];
BO::write_i64(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_int<BO: ByteOrder>(&mut self, val: i64, bytes: usize) -> Result<(), Self::WriteError> {
let mut buf = [0; 8];
BO::write_int(&mut buf, val, bytes);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_f32<BO: ByteOrder>(&mut self, val: f32) -> Result<(), Self::WriteError> {
let mut buf = [0; 4];
BO::write_f32(&mut buf, val);
self.write_all(&buf)
}
#[cfg(feature = "byteorder")]
fn write_f64<BO: ByteOrder>(&mut self, val: f64) -> Result<(), Self::WriteError> {
let mut buf = [0; 4];
BO::write_f64(&mut buf, val);
self.write_all(&buf)
}
}
impl<'a, R: Read + ?Sized> Read for &'a mut R {
type ReadError = R::ReadError;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
(*self).read(buf)
}
}
impl<'a, W: Write + ?Sized> Write for &'a mut W {
type WriteError = W::WriteError;
type FlushError = W::FlushError;
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError> {
(*self).write(buf)
}
fn flush(&mut self) -> Result<(), Self::FlushError> {
(*self).flush()
}
fn size_hint(&mut self, bytes: usize) {
(*self).size_hint(bytes)
}
fn uses_size_hint(&self) -> bool {
(**self).uses_size_hint()
}
}
impl<'a> Read for &'a [u8] {
type ReadError = Void;
fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::ReadError> {
use ::core::cmp::min;
let amt = min(buf.len(), self.len());
let (a, b) = self.split_at(amt);
if amt == 1 {
buf[0] = a[0];
} else {
buf[..amt].copy_from_slice(a);
}
*self = b;
Ok(amt)
}
fn available_bytes(&self, at_least: usize) -> bool {
self.len() >= at_least
}
}
impl<'a> Write for &'a mut [u8] {
type WriteError = error::BufferOverflow;
type FlushError = Void;
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::WriteError> {
if buf.len() <= self.len() {
let (first, second) = ::core::mem::replace(self, &mut []).split_at_mut(buf.len());
first.copy_from_slice(&buf[0..buf.len()]);
*self = second;
Ok(buf.len())
} else {
Err(error::BufferOverflow)
}
}
fn flush(&mut self) -> Result<(), Self::FlushError> {
Ok(())
}
fn size_hint(&mut self, _bytes: usize) {}
}