mirror of https://git.sr.ht/~stygianentity/bincode
Added decode_unsigned
This commit is contained in:
parent
ccca6ee49e
commit
ca353b9882
|
|
@ -0,0 +1,288 @@
|
||||||
|
use super::{U128_BYTE, U16_BYTE, U32_BYTE, U64_BYTE};
|
||||||
|
use crate::{
|
||||||
|
config::Endian,
|
||||||
|
de::read::Reader,
|
||||||
|
error::{DecodeError, IntegerType},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn varint_decode_u16<'a, R: Reader<'a>>(
|
||||||
|
read: &mut R,
|
||||||
|
endian: Endian,
|
||||||
|
) -> Result<u16, DecodeError> {
|
||||||
|
let mut byte = [0u8; 1];
|
||||||
|
read.read(&mut byte)?;
|
||||||
|
match byte[0] {
|
||||||
|
U16_BYTE => {
|
||||||
|
let mut bytes = [0u8; 2];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u16::from_be_bytes(bytes),
|
||||||
|
Endian::Little => u16::from_le_bytes(bytes),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U32_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U16,
|
||||||
|
found: IntegerType::U32,
|
||||||
|
}),
|
||||||
|
U64_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U16,
|
||||||
|
found: IntegerType::U64,
|
||||||
|
}),
|
||||||
|
U128_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U16,
|
||||||
|
found: IntegerType::U128,
|
||||||
|
}),
|
||||||
|
x => Ok(x as u16),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn varint_decode_u32<'a, R: Reader<'a>>(
|
||||||
|
read: &mut R,
|
||||||
|
endian: Endian,
|
||||||
|
) -> Result<u32, DecodeError> {
|
||||||
|
let mut byte = [0u8; 1];
|
||||||
|
read.read(&mut byte)?;
|
||||||
|
match byte[0] {
|
||||||
|
U16_BYTE => {
|
||||||
|
let mut bytes = [0u8; 2];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u16::from_be_bytes(bytes) as u32,
|
||||||
|
Endian::Little => u16::from_le_bytes(bytes) as u32,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U32_BYTE => {
|
||||||
|
let mut bytes = [0u8; 4];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u32::from_be_bytes(bytes),
|
||||||
|
Endian::Little => u32::from_le_bytes(bytes),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U64_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U32,
|
||||||
|
found: IntegerType::U64,
|
||||||
|
}),
|
||||||
|
U128_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U32,
|
||||||
|
found: IntegerType::U128,
|
||||||
|
}),
|
||||||
|
x => Ok(x as u32),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn varint_decode_u64<'a, R: Reader<'a>>(
|
||||||
|
read: &mut R,
|
||||||
|
endian: Endian,
|
||||||
|
) -> Result<u64, DecodeError> {
|
||||||
|
let mut byte = [0u8; 1];
|
||||||
|
read.read(&mut byte)?;
|
||||||
|
match byte[0] {
|
||||||
|
U16_BYTE => {
|
||||||
|
let mut bytes = [0u8; 2];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u16::from_be_bytes(bytes) as u64,
|
||||||
|
Endian::Little => u16::from_le_bytes(bytes) as u64,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U32_BYTE => {
|
||||||
|
let mut bytes = [0u8; 4];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u32::from_be_bytes(bytes) as u64,
|
||||||
|
Endian::Little => u32::from_le_bytes(bytes) as u64,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U64_BYTE => {
|
||||||
|
let mut bytes = [0u8; 8];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u64::from_be_bytes(bytes),
|
||||||
|
Endian::Little => u64::from_le_bytes(bytes),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U128_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::U64,
|
||||||
|
found: IntegerType::U128,
|
||||||
|
}),
|
||||||
|
x => Ok(x as u64),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn varint_decode_usize<'a, R: Reader<'a>>(
|
||||||
|
read: &mut R,
|
||||||
|
endian: Endian,
|
||||||
|
) -> Result<usize, DecodeError> {
|
||||||
|
let mut byte = [0u8; 1];
|
||||||
|
read.read(&mut byte)?;
|
||||||
|
match byte[0] {
|
||||||
|
U16_BYTE => {
|
||||||
|
let mut bytes = [0u8; 2];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u16::from_be_bytes(bytes) as usize,
|
||||||
|
Endian::Little => u16::from_le_bytes(bytes) as usize,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U32_BYTE => {
|
||||||
|
let mut bytes = [0u8; 4];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u32::from_be_bytes(bytes) as usize,
|
||||||
|
Endian::Little => u32::from_le_bytes(bytes) as usize,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U64_BYTE => {
|
||||||
|
let mut bytes = [0u8; 8];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u64::from_be_bytes(bytes) as usize,
|
||||||
|
Endian::Little => u64::from_le_bytes(bytes) as usize,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U128_BYTE => Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::USize,
|
||||||
|
found: IntegerType::U128,
|
||||||
|
}),
|
||||||
|
x => Ok(x as usize),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub fn varint_decode_u128<'a, R: Reader<'a>>(
|
||||||
|
read: &mut R,
|
||||||
|
endian: Endian,
|
||||||
|
) -> Result<u128, DecodeError> {
|
||||||
|
let mut byte = [0u8; 1];
|
||||||
|
read.read(&mut byte)?;
|
||||||
|
match byte[0] {
|
||||||
|
U16_BYTE => {
|
||||||
|
let mut bytes = [0u8; 2];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u16::from_be_bytes(bytes) as u128,
|
||||||
|
Endian::Little => u16::from_le_bytes(bytes) as u128,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U32_BYTE => {
|
||||||
|
let mut bytes = [0u8; 4];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u32::from_be_bytes(bytes) as u128,
|
||||||
|
Endian::Little => u32::from_le_bytes(bytes) as u128,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U64_BYTE => {
|
||||||
|
let mut bytes = [0u8; 8];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u64::from_be_bytes(bytes) as u128,
|
||||||
|
Endian::Little => u64::from_le_bytes(bytes) as u128,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
U128_BYTE => {
|
||||||
|
let mut bytes = [0u8; 16];
|
||||||
|
read.read(&mut bytes)?;
|
||||||
|
Ok(match endian {
|
||||||
|
Endian::Big => u128::from_be_bytes(bytes),
|
||||||
|
Endian::Little => u128::from_le_bytes(bytes),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
x => Ok(x as u128),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decode_u16() {
|
||||||
|
let cases: &[(&[u8], u16, u16)] = &[
|
||||||
|
(&[0], 0, 0),
|
||||||
|
(&[10], 10, 10),
|
||||||
|
(&[U16_BYTE, 0, 10], 2560, 10),
|
||||||
|
];
|
||||||
|
for &(slice, expected_le, expected_be) in cases {
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u16(&mut reader, Endian::Little).unwrap();
|
||||||
|
assert_eq!(expected_le, found);
|
||||||
|
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u16(&mut reader, Endian::Big).unwrap();
|
||||||
|
assert_eq!(expected_be, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decode_u32() {
|
||||||
|
let cases: &[(&[u8], u32, u32)] = &[
|
||||||
|
(&[0], 0, 0),
|
||||||
|
(&[10], 10, 10),
|
||||||
|
(&[U16_BYTE, 0, 10], 2560, 10),
|
||||||
|
(&[U32_BYTE, 0, 0, 0, 10], 167_772_160, 10),
|
||||||
|
];
|
||||||
|
for &(slice, expected_le, expected_be) in cases {
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u32(&mut reader, Endian::Little).unwrap();
|
||||||
|
assert_eq!(expected_le, found);
|
||||||
|
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u32(&mut reader, Endian::Big).unwrap();
|
||||||
|
assert_eq!(expected_be, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decode_u64() {
|
||||||
|
let cases: &[(&[u8], u64, u64)] = &[
|
||||||
|
(&[0], 0, 0),
|
||||||
|
(&[10], 10, 10),
|
||||||
|
(&[U16_BYTE, 0, 10], 2560, 10),
|
||||||
|
(&[U32_BYTE, 0, 0, 0, 10], 167_772_160, 10),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0, 10],
|
||||||
|
72_057_594_037_9279_360,
|
||||||
|
10,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
for &(slice, expected_le, expected_be) in cases {
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u64(&mut reader, Endian::Little).unwrap();
|
||||||
|
assert_eq!(expected_le, found);
|
||||||
|
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u64(&mut reader, Endian::Big).unwrap();
|
||||||
|
assert_eq!(expected_be, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_decode_u128() {
|
||||||
|
let cases: &[(&[u8], u128, u128)] = &[
|
||||||
|
(&[0], 0, 0),
|
||||||
|
(&[10], 10, 10),
|
||||||
|
(&[U16_BYTE, 0, 10], 2560, 10),
|
||||||
|
(&[U32_BYTE, 0, 0, 0, 10], 167_772_160, 10),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0, 10],
|
||||||
|
72_057_594_037_9279_360,
|
||||||
|
10,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10],
|
||||||
|
13_292_279_957_849_158_729_038_070_602_803_445_760,
|
||||||
|
10,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
for &(slice, expected_le, expected_be) in cases {
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u128(&mut reader, Endian::Little).unwrap();
|
||||||
|
assert_eq!(expected_le, found);
|
||||||
|
|
||||||
|
let mut reader = crate::de::read::SliceReader::new(slice);
|
||||||
|
let found = varint_decode_u128(&mut reader, Endian::Big).unwrap();
|
||||||
|
assert_eq!(expected_be, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,11 @@
|
||||||
|
mod decode_unsigned;
|
||||||
mod encode_signed;
|
mod encode_signed;
|
||||||
mod encode_unsigned;
|
mod encode_unsigned;
|
||||||
|
|
||||||
|
pub use self::decode_unsigned::{
|
||||||
|
varint_decode_u128, varint_decode_u16, varint_decode_u32, varint_decode_u64,
|
||||||
|
varint_decode_usize,
|
||||||
|
};
|
||||||
pub use self::encode_signed::{
|
pub use self::encode_signed::{
|
||||||
varint_encode_i128, varint_encode_i16, varint_encode_i32, varint_encode_i64,
|
varint_encode_i128, varint_encode_i16, varint_encode_i32, varint_encode_i64,
|
||||||
varint_encode_isize,
|
varint_encode_isize,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue