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