use std::io::{
Result,
Seek,
SeekFrom,
Write,
};
use crate::ZigZagWriteExt;
pub struct ZigZagWriter<W> {
inner: W,
}
impl<W> ZigZagWriter<W> {
#[inline]
pub fn new(inner: W) -> Self {
Self { inner }
}
#[inline]
pub fn get_ref(&self) -> &W {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut W {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> W {
self.inner
}
}
macro_rules! delegate_write {
($name:ident, $inner:ident, $value:ty) => {
#[doc = concat!("Writes a ZigZag encoded `", stringify!($value), "`.")]
#[inline]
pub fn $name(&mut self, value: $value) -> Result<()> {
self.inner.$inner(value)
}
};
}
impl<W> ZigZagWriter<W>
where
W: Write,
{
delegate_write!(write_i8, write_zigzag_i8, i8);
delegate_write!(write_i16, write_zigzag_i16, i16);
delegate_write!(write_i32, write_zigzag_i32, i32);
delegate_write!(write_i64, write_zigzag_i64, i64);
delegate_write!(write_i128, write_zigzag_i128, i128);
delegate_write!(write_isize, write_zigzag_isize, isize);
}
impl<W> Write for ZigZagWriter<W>
where
W: Write,
{
#[inline]
fn write(&mut self, buffer: &[u8]) -> Result<usize> {
self.inner.write(buffer)
}
#[inline]
fn flush(&mut self) -> Result<()> {
self.inner.flush()
}
}
impl<W> Seek for ZigZagWriter<W>
where
W: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}