use super::*; #[cfg(test)] pub fn encode(n: u128) -> Vec { let mut v = Vec::new(); encode_to_vec(n, &mut v); v } pub fn encode_to_vec(mut n: u128, v: &mut Vec) { let mut out = [0; 19]; let mut i = 18; out[i] = n.to_le_bytes()[0] & 0b0111_1111; while n > 0b0111_1111 { n = n / 128 - 1; i -= 1; out[i] = n.to_le_bytes()[0] | 0b1000_0000; } v.extend_from_slice(&out[i..]); } pub fn decode(buffer: &[u8]) -> Result<(u128, usize)> { let mut n = 0; let mut i = 0; loop { let b = u128::from(buffer.get(i).cloned().ok_or(Error::Varint)?); if b < 128 { return Ok((n + b, i + 1)); } n += b - 127; n = n.checked_mul(128).ok_or(Error::Varint)?; i += 1; } } #[cfg(test)] mod tests { use super::*; #[test] fn u128_max_round_trips_successfully() { let n = u128::max_value(); let encoded = encode(n); let (decoded, length) = decode(&encoded).unwrap(); assert_eq!(decoded, n); assert_eq!(length, encoded.len()); } #[test]