use super::{varint_decode_u128, varint_decode_u16, varint_decode_u32, varint_decode_u64};
use crate::{config::Endianness, decode::Reader, error::Result};
#[inline(always)]
pub fn varint_decode_i16<R: Reader>(reader: &mut R, endian: Endianness) -> Result<i16> {
let value = varint_decode_u16(reader, endian)?;
Ok(((value >> 1) as i16) ^ (-((value & 1) as i16)))
}
#[inline(always)]
pub fn varint_decode_i32<R: Reader>(reader: &mut R, endian: Endianness) -> Result<i32> {
let value = varint_decode_u32(reader, endian)?;
Ok(((value >> 1) as i32) ^ (-((value & 1) as i32)))
}
#[inline(always)]
pub fn varint_decode_i64<R: Reader>(reader: &mut R, endian: Endianness) -> Result<i64> {
let value = varint_decode_u64(reader, endian)?;
Ok(((value >> 1) as i64) ^ (-((value & 1) as i64)))
}
#[inline(always)]
pub fn varint_decode_i128<R: Reader>(reader: &mut R, endian: Endianness) -> Result<i128> {
let value = varint_decode_u128(reader, endian)?;
Ok(((value >> 1) as i128) ^ (-((value & 1) as i128)))
}
#[inline(always)]
pub fn varint_decode_isize<R: Reader>(reader: &mut R, endian: Endianness) -> Result<isize> {
let value = varint_decode_i64(reader, endian)?;
#[cfg(target_pointer_width = "64")]
{
Ok(value as isize)
}
#[cfg(not(target_pointer_width = "64"))]
{
if value < isize::MIN as i64 || value > isize::MAX as i64 {
return Err(crate::error::Error::InvalidData {
message: "isize value out of range for this platform",
});
}
Ok(value as isize)
}
}