orphos_core/bitmap/
mod.rs1#[inline]
2const fn calculate_bit_position(bit_index: usize) -> (usize, u8) {
3 (bit_index >> 3, 1 << (bit_index & 0x07))
4}
5
6pub fn test_bit(bitmap: &[u8], bit_index: usize) -> bool {
8 let (byte_index, bit_mask) = calculate_bit_position(bit_index);
9 (bitmap[byte_index] & bit_mask) != 0
10}
11
12pub fn set_bit(bitmap: &mut [u8], bit_index: usize) {
14 let (byte_index, bit_mask) = calculate_bit_position(bit_index);
15 bitmap[byte_index] |= bit_mask;
16}
17
18pub fn clear_bit(bitmap: &mut [u8], bit_index: usize) {
20 let (byte_index, bit_mask) = calculate_bit_position(bit_index);
21 bitmap[byte_index] &= !bit_mask;
22}
23
24pub fn toggle_bit(bitmap: &mut [u8], bit_index: usize) {
26 let (byte_index, bit_mask) = calculate_bit_position(bit_index);
27 bitmap[byte_index] ^= bit_mask;
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 #[test]
35 fn test_calculate_bit_position() {
36 assert_eq!(calculate_bit_position(0), (0, 1));
37 assert_eq!(calculate_bit_position(1), (0, 2));
38 assert_eq!(calculate_bit_position(7), (0, 128));
39 assert_eq!(calculate_bit_position(8), (1, 1));
40 assert_eq!(calculate_bit_position(15), (1, 128));
41 assert_eq!(calculate_bit_position(16), (2, 1));
42 }
43
44 #[test]
45 fn test_test_bit() {
46 let bitmap = [0b10101010, 0b01010101];
47
48 assert!(!test_bit(&bitmap, 0));
50 assert!(test_bit(&bitmap, 1));
51 assert!(!test_bit(&bitmap, 2));
52 assert!(test_bit(&bitmap, 3));
53 assert!(!test_bit(&bitmap, 4));
54 assert!(test_bit(&bitmap, 5));
55 assert!(!test_bit(&bitmap, 6));
56 assert!(test_bit(&bitmap, 7));
57
58 assert!(test_bit(&bitmap, 8));
60 assert!(!test_bit(&bitmap, 9));
61 assert!(test_bit(&bitmap, 10));
62 assert!(!test_bit(&bitmap, 11));
63 }
64
65 #[test]
66 fn test_set_bit() {
67 let mut bitmap = [0u8; 2];
68
69 set_bit(&mut bitmap, 0);
70 assert_eq!(bitmap[0], 0b00000001);
71
72 set_bit(&mut bitmap, 3);
73 assert_eq!(bitmap[0], 0b00001001);
74
75 set_bit(&mut bitmap, 8);
76 assert_eq!(bitmap[1], 0b00000001);
77
78 set_bit(&mut bitmap, 0);
79 assert_eq!(bitmap[0], 0b00001001);
80 }
81
82 #[test]
83 fn test_clear_bit() {
84 let mut bitmap = [0b11111111, 0b11111111];
85
86 clear_bit(&mut bitmap, 0);
87 assert_eq!(bitmap[0], 0b11111110);
88
89 clear_bit(&mut bitmap, 3);
90 assert_eq!(bitmap[0], 0b11110110);
91
92 clear_bit(&mut bitmap, 8);
93 assert_eq!(bitmap[1], 0b11111110);
94
95 clear_bit(&mut bitmap, 0);
96 assert_eq!(bitmap[0], 0b11110110);
97 }
98
99 #[test]
100 fn test_toggle_bit() {
101 let mut bitmap = [0b10101010, 0b01010101];
102
103 toggle_bit(&mut bitmap, 0);
105 assert_eq!(bitmap[0], 0b10101011);
106
107 toggle_bit(&mut bitmap, 1);
109 assert_eq!(bitmap[0], 0b10101001);
110
111 toggle_bit(&mut bitmap, 8);
113 assert_eq!(bitmap[1], 0b01010100);
114
115 toggle_bit(&mut bitmap, 8);
116 assert_eq!(bitmap[1], 0b01010101);
117 }
118
119 #[test]
120 fn test_bit_operations_consistency() {
121 let mut bitmap = [0u8; 4];
122
123 for i in 0..32 {
124 assert!(!test_bit(&bitmap, i));
125
126 set_bit(&mut bitmap, i);
128 assert!(test_bit(&bitmap, i));
129
130 toggle_bit(&mut bitmap, i);
131 assert!(!test_bit(&bitmap, i));
132
133 toggle_bit(&mut bitmap, i);
134 assert!(test_bit(&bitmap, i));
135
136 clear_bit(&mut bitmap, i);
137 assert!(!test_bit(&bitmap, i));
138 }
139 }
140
141 #[test]
142 fn test_edge_cases() {
143 let mut bitmap = [0u8; 1];
144
145 for i in 0..8 {
147 set_bit(&mut bitmap, i);
148 }
149 assert_eq!(bitmap[0], 0b11111111);
150
151 for i in 0..8 {
152 clear_bit(&mut bitmap, i);
153 }
154 assert_eq!(bitmap[0], 0b00000000);
155 }
156}