use std::io::{
Read,
Result,
};
use crate::Leb128ReadExt;
pub trait ZigZagReadExt: Read {
fn read_zigzag_i8(&mut self) -> Result<i8>;
fn read_zigzag_i8_strict(&mut self) -> Result<i8>;
fn read_zigzag_i16(&mut self) -> Result<i16>;
fn read_zigzag_i16_strict(&mut self) -> Result<i16>;
fn read_zigzag_i32(&mut self) -> Result<i32>;
fn read_zigzag_i32_strict(&mut self) -> Result<i32>;
fn read_zigzag_i64(&mut self) -> Result<i64>;
fn read_zigzag_i64_strict(&mut self) -> Result<i64>;
fn read_zigzag_i128(&mut self) -> Result<i128>;
fn read_zigzag_i128_strict(&mut self) -> Result<i128>;
fn read_zigzag_isize(&mut self) -> Result<isize>;
fn read_zigzag_isize_strict(&mut self) -> Result<isize>;
}
impl<T> ZigZagReadExt for T
where
T: Read + ?Sized,
{
#[inline]
fn read_zigzag_i8(&mut self) -> Result<i8> {
self.read_uleb_u8().map(decode_zigzag_u8)
}
#[inline]
fn read_zigzag_i8_strict(&mut self) -> Result<i8> {
self.read_uleb_u8_strict().map(decode_zigzag_u8)
}
#[inline]
fn read_zigzag_i16(&mut self) -> Result<i16> {
self.read_uleb_u16().map(decode_zigzag_u16)
}
#[inline]
fn read_zigzag_i16_strict(&mut self) -> Result<i16> {
self.read_uleb_u16_strict().map(decode_zigzag_u16)
}
#[inline]
fn read_zigzag_i32(&mut self) -> Result<i32> {
self.read_uleb_u32().map(decode_zigzag_u32)
}
#[inline]
fn read_zigzag_i32_strict(&mut self) -> Result<i32> {
self.read_uleb_u32_strict().map(decode_zigzag_u32)
}
#[inline]
fn read_zigzag_i64(&mut self) -> Result<i64> {
self.read_uleb_u64().map(decode_zigzag_u64)
}
#[inline]
fn read_zigzag_i64_strict(&mut self) -> Result<i64> {
self.read_uleb_u64_strict().map(decode_zigzag_u64)
}
#[inline]
fn read_zigzag_i128(&mut self) -> Result<i128> {
self.read_uleb_u128().map(decode_zigzag_u128)
}
#[inline]
fn read_zigzag_i128_strict(&mut self) -> Result<i128> {
self.read_uleb_u128_strict().map(decode_zigzag_u128)
}
#[inline]
fn read_zigzag_isize(&mut self) -> Result<isize> {
self.read_uleb_usize().map(decode_zigzag_usize)
}
#[inline]
fn read_zigzag_isize_strict(&mut self) -> Result<isize> {
self.read_uleb_usize_strict().map(decode_zigzag_usize)
}
}
fn decode_zigzag_u8(value: u8) -> i8 {
((value >> 1) as i8) ^ (-((value & 1) as i8))
}
fn decode_zigzag_u16(value: u16) -> i16 {
((value >> 1) as i16) ^ (-((value & 1) as i16))
}
fn decode_zigzag_u32(value: u32) -> i32 {
((value >> 1) as i32) ^ (-((value & 1) as i32))
}
fn decode_zigzag_u64(value: u64) -> i64 {
((value >> 1) as i64) ^ (-((value & 1) as i64))
}
fn decode_zigzag_u128(value: u128) -> i128 {
((value >> 1) as i128) ^ (-((value & 1) as i128))
}
fn decode_zigzag_usize(value: usize) -> isize {
((value >> 1) as isize) ^ (-((value & 1) as isize))
}