use std::io::{
Result,
Write,
};
use crate::Leb128WriteExt;
pub trait ZigZagWriteExt: Write {
fn write_zigzag_i8(&mut self, value: i8) -> Result<()>;
fn write_zigzag_i16(&mut self, value: i16) -> Result<()>;
fn write_zigzag_i32(&mut self, value: i32) -> Result<()>;
fn write_zigzag_i64(&mut self, value: i64) -> Result<()>;
fn write_zigzag_i128(&mut self, value: i128) -> Result<()>;
fn write_zigzag_isize(&mut self, value: isize) -> Result<()>;
}
impl<T> ZigZagWriteExt for T
where
T: Write + ?Sized,
{
#[inline]
fn write_zigzag_i8(&mut self, value: i8) -> Result<()> {
self.write_uleb_u8(encode_zigzag_i8(value))
}
#[inline]
fn write_zigzag_i16(&mut self, value: i16) -> Result<()> {
self.write_uleb_u16(encode_zigzag_i16(value))
}
#[inline]
fn write_zigzag_i32(&mut self, value: i32) -> Result<()> {
self.write_uleb_u32(encode_zigzag_i32(value))
}
#[inline]
fn write_zigzag_i64(&mut self, value: i64) -> Result<()> {
self.write_uleb_u64(encode_zigzag_i64(value))
}
#[inline]
fn write_zigzag_i128(&mut self, value: i128) -> Result<()> {
self.write_uleb_u128(encode_zigzag_i128(value))
}
#[inline]
fn write_zigzag_isize(&mut self, value: isize) -> Result<()> {
self.write_uleb_usize(encode_zigzag_isize(value))
}
}
fn encode_zigzag_i8(value: i8) -> u8 {
((value as u8) << 1) ^ ((value >> 7) as u8)
}
fn encode_zigzag_i16(value: i16) -> u16 {
((value as u16) << 1) ^ ((value >> 15) as u16)
}
fn encode_zigzag_i32(value: i32) -> u32 {
((value as u32) << 1) ^ ((value >> 31) as u32)
}
fn encode_zigzag_i64(value: i64) -> u64 {
((value as u64) << 1) ^ ((value >> 63) as u64)
}
fn encode_zigzag_i128(value: i128) -> u128 {
((value as u128) << 1) ^ ((value >> 127) as u128)
}
fn encode_zigzag_isize(value: isize) -> usize {
((value as usize) << 1) ^ ((value >> (isize::BITS - 1)) as usize)
}