hexane/
leb128.rs

1/// The number of bytes required to encode `val` as a LEB128 integer
2pub fn lebsize(mut val: i64) -> u64 {
3    if val < 0 {
4        val = !val
5    }
6    // 1 extra for the sign bit
7    leb_bytes(1 + 64 - val.leading_zeros() as u64)
8}
9
10/// The number of bytes required to encode `val` as a uLEB128 integer
11pub fn ulebsize(val: u64) -> u64 {
12    if val == 0 {
13        return 1;
14    }
15    leb_bytes(64 - val.leading_zeros() as u64)
16}
17
18fn leb_bytes(bits: u64) -> u64 {
19    bits.div_ceil(7)
20}
21
22#[cfg(test)]
23mod tests {
24    use super::*;
25    use proptest::prelude::*;
26
27    proptest! {
28        #[test]
29        fn test_ulebsize(val in 0..u64::MAX) {
30            let mut out = Vec::new();
31            leb128::write::unsigned(&mut out, val).unwrap();
32            let expected = out.len() as u64;
33            assert_eq!(expected, ulebsize(val))
34        }
35
36        #[test]
37        fn test_lebsize(val in i64::MIN..i64::MAX) {
38            let mut out = Vec::new();
39            leb128::write::signed(&mut out, val).unwrap();
40            let expected = out.len() as u64;
41            assert_eq!(expected, lebsize(val))
42        }
43    }
44
45    #[test]
46    fn ulebsize_examples() {
47        let scenarios = vec![0, 1, 127, 128, 129, 169, u64::MAX];
48        for val in scenarios {
49            let mut out = Vec::new();
50            leb128::write::unsigned(&mut out, val).unwrap();
51            let expected = out.len() as u64;
52            assert_eq!(ulebsize(val), expected, "value: {}", val)
53        }
54    }
55
56    #[test]
57    fn lebsize_examples() {
58        let scenarios = vec![
59            0,
60            1,
61            -1,
62            63,
63            64,
64            -64,
65            -65,
66            127,
67            128,
68            -127,
69            -128,
70            -2097152,
71            169,
72            i64::MIN,
73            i64::MAX,
74        ];
75        for val in scenarios {
76            let mut out = Vec::new();
77            leb128::write::signed(&mut out, val).unwrap();
78            let expected = out.len() as u64;
79            assert_eq!(lebsize(val), expected, "value: {}", val)
80        }
81    }
82}