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 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 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 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 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 let data = "0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
65 let bitmap = to_bitmap(&data).unwrap();
66
67 assert!(is_feature_bit_enabled(&bitmap, 729));
69
70 assert!(!is_feature_bit_enabled(&bitmap, 728));
72 assert!(!is_feature_bit_enabled(&bitmap, 730));
73 }
74}