use std::io::{
Read,
Result,
};
use crate::codec::{
NonStrict,
Strict,
ZigZagCodec,
};
use crate::util::read_leb128_payload;
macro_rules! read_zig_zag_value {
($reader:expr, $ty:ty, $policy:ty) => {
read_leb128_payload::<{ ZigZagCodec::<$ty, $policy>::REQUIRED_MIN_BUFFER_LEN }, _, _, _>($reader, |bytes| {
// SAFETY: The local buffer is exactly the codec's minimum buffer length,
// or it contains an earlier terminating byte before decoding.
unsafe { ZigZagCodec::<$ty, $policy>::read_unchecked(bytes, 0) }
})
};
}
pub trait ZigZagReadExt: Read {
#[inline]
fn read_zig_zag_i8(&mut self) -> Result<i8> {
read_zig_zag_value!(self, i8, NonStrict)
}
#[inline]
fn read_zig_zag_i8_strict(&mut self) -> Result<i8> {
read_zig_zag_value!(self, i8, Strict)
}
#[inline]
fn read_zig_zag_i16(&mut self) -> Result<i16> {
read_zig_zag_value!(self, i16, NonStrict)
}
#[inline]
fn read_zig_zag_i16_strict(&mut self) -> Result<i16> {
read_zig_zag_value!(self, i16, Strict)
}
#[inline]
fn read_zig_zag_i32(&mut self) -> Result<i32> {
read_zig_zag_value!(self, i32, NonStrict)
}
#[inline]
fn read_zig_zag_i32_strict(&mut self) -> Result<i32> {
read_zig_zag_value!(self, i32, Strict)
}
#[inline]
fn read_zig_zag_i64(&mut self) -> Result<i64> {
read_zig_zag_value!(self, i64, NonStrict)
}
#[inline]
fn read_zig_zag_i64_strict(&mut self) -> Result<i64> {
read_zig_zag_value!(self, i64, Strict)
}
#[inline]
fn read_zig_zag_i128(&mut self) -> Result<i128> {
read_zig_zag_value!(self, i128, NonStrict)
}
#[inline]
fn read_zig_zag_i128_strict(&mut self) -> Result<i128> {
read_zig_zag_value!(self, i128, Strict)
}
#[inline]
fn read_zig_zag_isize(&mut self) -> Result<isize> {
read_zig_zag_value!(self, isize, NonStrict)
}
#[inline]
fn read_zig_zag_isize_strict(&mut self) -> Result<isize> {
read_zig_zag_value!(self, isize, Strict)
}
}
impl<R> ZigZagReadExt for R where R: Read + ?Sized {}