use std::io::{
Result,
Seek,
SeekFrom,
Write,
};
use crate::{
Leb128WriteExt,
StringWriteExt,
};
pub struct Leb128Writer<W> {
inner: W,
}
impl<W> Leb128Writer<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 LEB128 `", stringify!($value), "`.")]
#[inline]
pub fn $name(&mut self, value: $value) -> Result<()> {
self.inner.$inner(value)
}
};
}
impl<W> Leb128Writer<W>
where
W: Write,
{
delegate_write!(write_u8, write_uleb_u8, u8);
delegate_write!(write_u16, write_uleb_u16, u16);
delegate_write!(write_u32, write_uleb_u32, u32);
delegate_write!(write_u64, write_uleb_u64, u64);
delegate_write!(write_u128, write_uleb_u128, u128);
delegate_write!(write_usize, write_uleb_usize, usize);
delegate_write!(write_i8, write_sleb_i8, i8);
delegate_write!(write_i16, write_sleb_i16, i16);
delegate_write!(write_i32, write_sleb_i32, i32);
delegate_write!(write_i64, write_sleb_i64, i64);
delegate_write!(write_i128, write_sleb_i128, i128);
delegate_write!(write_isize, write_sleb_isize, isize);
#[inline]
pub fn write_utf8_string(&mut self, value: &str) -> Result<()> {
self.inner.write_utf8_string_uleb(value)
}
}
impl<W> Write for Leb128Writer<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 Leb128Writer<W>
where
W: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}