use std::io::{
BufRead,
Read,
Result,
Seek,
SeekFrom,
};
use crate::ZigZagReadExt;
pub struct ZigZagReader<R> {
inner: R,
strict: bool,
}
impl<R> ZigZagReader<R> {
#[inline]
pub fn new(inner: R) -> Self {
Self::with_strict(inner, false)
}
#[inline]
pub fn with_strict(inner: R, strict: bool) -> Self {
Self { inner, strict }
}
#[inline]
pub fn is_strict(&self) -> bool {
self.strict
}
#[inline]
pub fn set_strict(&mut self, strict: bool) {
self.strict = strict;
}
#[inline]
pub fn get_ref(&self) -> &R {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut R {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> R {
self.inner
}
}
macro_rules! delegate_read {
($name:ident, $read:ident, $read_strict:ident, $value:ty) => {
#[doc = concat!("Reads a ZigZag encoded `", stringify!($value), "`.")]
#[inline]
pub fn $name(&mut self) -> Result<$value> {
if self.strict {
self.inner.$read_strict()
} else {
self.inner.$read()
}
}
};
}
impl<R> ZigZagReader<R>
where
R: Read,
{
delegate_read!(read_i8, read_zigzag_i8, read_zigzag_i8_strict, i8);
delegate_read!(read_i16, read_zigzag_i16, read_zigzag_i16_strict, i16);
delegate_read!(read_i32, read_zigzag_i32, read_zigzag_i32_strict, i32);
delegate_read!(read_i64, read_zigzag_i64, read_zigzag_i64_strict, i64);
delegate_read!(read_i128, read_zigzag_i128, read_zigzag_i128_strict, i128);
delegate_read!(
read_isize,
read_zigzag_isize,
read_zigzag_isize_strict,
isize
);
}
impl<R> Read for ZigZagReader<R>
where
R: Read,
{
#[inline]
fn read(&mut self, buffer: &mut [u8]) -> Result<usize> {
self.inner.read(buffer)
}
}
impl<R> BufRead for ZigZagReader<R>
where
R: BufRead,
{
#[inline]
fn fill_buf(&mut self) -> Result<&[u8]> {
self.inner.fill_buf()
}
#[inline]
fn consume(&mut self, amount: usize) {
self.inner.consume(amount);
}
}
impl<R> Seek for ZigZagReader<R>
where
R: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}