swf_emitter/
bit_count.rs

1use std::cmp::max;
2
3pub fn get_u32_bit_count(value: u32) -> u32 {
4  32 - value.leading_zeros()
5}
6
7pub fn get_i32_bit_count(value: i32) -> u32 {
8  match value {
9    0 => 0,
10    v if v < 0 => 33 - (!v).leading_zeros(),
11    v => 33 - v.leading_zeros()
12  }
13}
14
15pub fn get_u32_min_bit_count<I: Iterator<Item = u32>>(values: I) -> u32 {
16  values.map(get_u32_bit_count).fold(0, max)
17}
18
19pub fn get_i32_min_bit_count<I: Iterator<Item = i32>>(values: I) -> u32 {
20  values.map(get_i32_bit_count).fold(0, max)
21}
22
23#[cfg(test)]
24mod tests {
25  use super::*;
26
27  #[test]
28  fn test_get_u32_bit_count() {
29    assert_eq!(get_u32_bit_count(0), 0);
30    assert_eq!(get_u32_bit_count(1), 1);
31    assert_eq!(get_u32_bit_count(2), 2);
32    assert_eq!(get_u32_bit_count(3), 2);
33    assert_eq!(get_u32_bit_count(4), 3);
34    assert_eq!(get_u32_bit_count(5), 3);
35    assert_eq!(get_u32_bit_count(7), 3);
36    assert_eq!(get_u32_bit_count(8), 4);
37    assert_eq!(get_u32_bit_count(15), 4);
38    assert_eq!(get_u32_bit_count(16), 5);
39    assert_eq!(get_u32_bit_count(2147483647), 31);
40  }
41
42  #[test]
43  fn test_get_i32_bit_count() {
44    assert_eq!(get_i32_bit_count(0), 0);
45    assert_eq!(get_i32_bit_count(1), 2);
46    assert_eq!(get_i32_bit_count(2), 3);
47    assert_eq!(get_i32_bit_count(3), 3);
48    assert_eq!(get_i32_bit_count(4), 4);
49    assert_eq!(get_i32_bit_count(5), 4);
50    assert_eq!(get_i32_bit_count(7), 4);
51    assert_eq!(get_i32_bit_count(8), 5);
52    assert_eq!(get_i32_bit_count(15), 5);
53    assert_eq!(get_i32_bit_count(16), 6);
54    assert_eq!(get_i32_bit_count(2147483647), 32);
55    assert_eq!(get_i32_bit_count(-1), 1);
56    assert_eq!(get_i32_bit_count(-2), 2);
57    assert_eq!(get_i32_bit_count(-3), 3);
58    assert_eq!(get_i32_bit_count(-4), 3);
59    assert_eq!(get_i32_bit_count(-5), 4);
60    assert_eq!(get_i32_bit_count(-2147483648), 32);
61  }
62
63  #[test]
64  fn test_get_u32_min_bit_count() {
65    assert_eq!(get_u32_min_bit_count(vec![].into_iter()), 0);
66    assert_eq!(get_u32_min_bit_count(vec![0].into_iter()), 0);
67    assert_eq!(get_u32_min_bit_count(vec![0, 0].into_iter()), 0);
68    assert_eq!(get_u32_min_bit_count(vec![1].into_iter()), 1);
69    assert_eq!(get_u32_min_bit_count(vec![1, 1].into_iter()), 1);
70    assert_eq!(get_u32_min_bit_count(vec![0, 1].into_iter()), 1);
71    assert_eq!(get_u32_min_bit_count(vec![1, 0].into_iter()), 1);
72    assert_eq!(get_u32_min_bit_count(vec![0, 0, 2, 3].into_iter()), 2);
73    assert_eq!(get_u32_min_bit_count(vec![4, 0, 2, 3].into_iter()), 3);
74    assert_eq!(get_u32_min_bit_count(vec![2, 1, 2].into_iter()), 2);
75    assert_eq!(get_u32_min_bit_count(vec![2147483647, 3, 0, 1000].into_iter()), 31);
76  }
77
78  #[test]
79  fn test_get_i32_min_bit_count() {
80    assert_eq!(get_i32_min_bit_count(vec![].into_iter()), 0);
81    assert_eq!(get_i32_min_bit_count(vec![0].into_iter()), 0);
82    assert_eq!(get_i32_min_bit_count(vec![-1].into_iter()), 1);
83    assert_eq!(get_i32_min_bit_count(vec![0, -1].into_iter()), 1);
84    assert_eq!(get_i32_min_bit_count(vec![-1, 0].into_iter()), 1);
85    assert_eq!(get_i32_min_bit_count(vec![16, 0, -5].into_iter()), 6);
86    assert_eq!(get_i32_min_bit_count(vec![2147483647, -2147483648].into_iter()), 32);
87  }
88}