Path: blob/main/crates/polars-parquet/src/parquet/encoding/zigzag_leb128.rs
6940 views
use super::uleb128;12pub fn decode(values: &[u8]) -> (i64, usize) {3let (u, consumed) = uleb128::decode(values);4((u >> 1) as i64 ^ -((u & 1) as i64), consumed)5}67pub fn encode(value: i64) -> ([u8; 10], usize) {8let value = ((value << 1) ^ (value >> (64 - 1))) as u64;9let mut a = [0u8; 10];10let produced = uleb128::encode(value, &mut a);11(a, produced)12}1314#[cfg(test)]15mod tests {16use super::*;1718#[test]19fn test_decode() {20// see e.g. https://stackoverflow.com/a/2211086/93130321let cases = vec![22(0u8, 0i64),23(1, -1),24(2, 1),25(3, -2),26(4, 2),27(5, -3),28(6, 3),29(7, -4),30(8, 4),31(9, -5),32];33for (data, expected) in cases {34let (result, _) = decode(&[data]);35assert_eq!(result, expected)36}37}3839#[test]40fn test_encode() {41let cases = vec![42(0u8, 0i64),43(1, -1),44(2, 1),45(3, -2),46(4, 2),47(5, -3),48(6, 3),49(7, -4),50(8, 4),51(9, -5),52];53for (expected, data) in cases {54let (result, size) = encode(data);55assert_eq!(size, 1);56assert_eq!(result[0], expected)57}58}5960#[test]61fn test_roundtrip() {62let value = -1001212312;63let (data, size) = encode(value);64let (result, _) = decode(&data[..size]);65assert_eq!(value, result);66}67}686970