orphos_core/bitmap/
mod.rs

1#[inline]
2const fn calculate_bit_position(bit_index: usize) -> (usize, u8) {
3    (bit_index >> 3, 1 << (bit_index & 0x07))
4}
5
6/// Test if a bit is set at the given index
7pub 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
12/// Set a bit to 1 at the given index
13pub 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
18/// Clear a bit (set it to 0) at the given index
19pub 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
24/// Flip a bit's value 0->1 or 1->0 at the given index
25pub 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        // Test bits in first byte
49        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        // Test bits in second byte
59        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 from 0 to 1
104        toggle_bit(&mut bitmap, 0);
105        assert_eq!(bitmap[0], 0b10101011);
106
107        // Toggle bit from 1 to 0
108        toggle_bit(&mut bitmap, 1);
109        assert_eq!(bitmap[0], 0b10101001);
110
111        // Toggle in second byte
112        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 and verify
127            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        // Test all 8 bits in a single byte
146        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}