1pub fn lebsize(mut val: i64) -> u64 {
3 if val < 0 {
4 val = !val
5 }
6 leb_bytes(1 + 64 - val.leading_zeros() as u64)
8}
9
10pub 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}