gl_client/
util.rs

1pub fn is_feature_bit_enabled(bitmap: &[u8], index: usize) -> bool {
2    let n_bytes = bitmap.len();
3    let (byte_index, bit_index) = (index / 8, index % 8);
4
5    // The index doesn't fit in the byte-array
6    if byte_index >= n_bytes {
7        return false;
8    }
9
10    let selected_byte = bitmap[n_bytes - 1 - byte_index];
11    let bit_mask = 1u8 << (bit_index);
12
13    return (selected_byte & bit_mask) != 0;
14}
15
16#[cfg(test)]
17mod test {
18    use super::*;
19
20    fn to_bitmap(feature_hex_string: &str) -> Result<Vec<u8>, String> {
21        hex::decode(&feature_hex_string).map_err(|x| x.to_string())
22    }
23
24    #[test]
25    fn test_parse_bitmap() {
26        // Check the lowest bits in the bitmap
27        let feature_bitmap_00 = to_bitmap(&"01").unwrap();
28        let feature_bitmap_01 = to_bitmap(&"02").unwrap();
29        let feature_bitmap_02 = to_bitmap(&"04").unwrap();
30        let feature_bitmap_03 = to_bitmap(&"08").unwrap();
31        let feature_bitmap_04 = to_bitmap(&"10").unwrap();
32        let feature_bitmap_05 = to_bitmap(&"20").unwrap();
33        let feature_bitmap_06 = to_bitmap(&"40").unwrap();
34        let feature_bitmap_07 = to_bitmap(&"80").unwrap();
35
36        // Check that the expected bit is enabled
37        assert!(is_feature_bit_enabled(&feature_bitmap_00, 0));
38        assert!(is_feature_bit_enabled(&feature_bitmap_01, 1));
39        assert!(is_feature_bit_enabled(&feature_bitmap_02, 2));
40        assert!(is_feature_bit_enabled(&feature_bitmap_03, 3));
41        assert!(is_feature_bit_enabled(&feature_bitmap_04, 4));
42        assert!(is_feature_bit_enabled(&feature_bitmap_05, 5));
43        assert!(is_feature_bit_enabled(&feature_bitmap_06, 6));
44        assert!(is_feature_bit_enabled(&feature_bitmap_07, 7));
45
46        // Check that other bits are disabled
47        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 0));
48        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 2));
49        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 3));
50        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 4));
51        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 5));
52        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 6));
53        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 7));
54        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 8));
55        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 9));
56
57        assert!(!is_feature_bit_enabled(&feature_bitmap_01, 1000));
58    }
59
60    #[test]
61    fn test_lsps_option_enabled_bitmap() {
62        // Copied from LSPS0
63        // This set bit number 729
64        let data = "0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
65        let bitmap = to_bitmap(&data).unwrap();
66
67        // Check that the expected bit is enabled
68        assert!(is_feature_bit_enabled(&bitmap, 729));
69
70        // Check that the expected bit is disabled
71        assert!(!is_feature_bit_enabled(&bitmap, 728));
72        assert!(!is_feature_bit_enabled(&bitmap, 730));
73    }
74}