lay_simulator_gk/
bitarray.rs

1#![allow(dead_code)]
2
3use std::fmt::{self, Debug, Formatter};
4use lay::Measured;
5
6type Block = u32;
7const BLOCK_SIZE: usize = 32;
8const BLOCK_MASK: usize = (!(0 as Block)) as usize;
9
10pub struct BitArray {
11    inner: Vec<Block>,
12    len: usize,
13}
14
15impl BitArray {
16    fn _cap_from_len(len: usize) -> usize {
17        if len > 0 {
18            (len - 1) / BLOCK_SIZE + 1
19        } else {
20            0
21        }
22    }
23
24    #[inline]
25    fn _access(index: usize) -> (usize, Block) {
26        (index / BLOCK_SIZE, 1 << ((index % BLOCK_SIZE) as Block))
27    }
28
29    pub fn zeros(len: usize) -> Self {
30        Self { inner: vec![0; Self::_cap_from_len(len)], len }
31    }
32
33    pub fn ones(len: usize) -> Self {
34        let mut ones = Self { inner: vec![!0; Self::_cap_from_len(len)], len };
35        let rem = len % BLOCK_SIZE;
36        if rem > 0 {
37            *ones.inner.last_mut().unwrap() = (1 << rem) - 1;
38        }
39        ones
40    }
41
42    pub fn copy_from(&mut self, other: &Self) {
43        let cap = other.inner.len();
44        if self.inner.len() < cap {
45            self.inner.resize(cap, 0);
46        }
47        for i in 0..other.inner.len() {
48            self.inner[i] = other.inner[i];
49        }
50        self.len = other.len;
51    }
52
53    pub fn reset(&mut self) {
54        self.inner.iter_mut().for_each(|x| *x = 0);
55    }
56
57    #[inline]
58    pub fn negate(&mut self, index: usize) {
59        let (block, mask) = Self::_access(index);
60        self.inner[block] ^= mask;
61    }
62
63    #[inline]
64    pub fn set_bool(&mut self, index: usize, val: bool) {
65        let (block, mask) = Self::_access(index);
66        if val {
67            self.inner[block] |= mask;
68        } else {
69            self.inner[block] &= !mask;
70        }
71    }
72
73    #[inline]
74    pub fn get_masked(&self, index: usize) -> Block {
75        let (block, mask) = Self::_access(index);
76        self.inner[block] & mask
77    }
78
79    #[inline]
80    pub fn get_bool(&self, index: usize) -> bool {
81        self.get_masked(index) != 0
82    }
83
84    #[inline]
85    pub fn xor_all(&mut self, other: &Self) {
86        assert_eq!(self.len, other.len);
87        for (dest, src) in self.inner.iter_mut().zip(other.inner.iter()) {
88            *dest ^= *src;
89        }
90    }
91
92    pub fn len(&self) -> usize {
93        self.len
94    }
95
96    pub fn true_indices(&self) -> TIndices {
97        TIndices::new(&self)
98    }
99}
100
101impl Debug for BitArray {
102    fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
103        fmt.write_str("Bitarray { inner: [")?;
104        if !self.inner.is_empty() {
105            fmt.write_fmt(format_args!("{:b}", self.inner[0]))?;
106        }
107        for bin in self.inner[1..].iter() {
108            fmt.write_fmt(format_args!(" {:b}", *bin))?;
109        }
110        fmt.write_fmt(format_args!("], len: {} }}", self.len))
111    }
112}
113
114impl Measured for BitArray {
115    type Slot = u32;
116
117    fn get(&self, n: u32) -> bool {
118        self.get_bool(n as usize)
119    }
120}
121
122pub struct TIndices<'a> {
123    barray: &'a BitArray,
124    current_blk: usize,
125    current_bit: usize,
126    buf: Block,
127}
128
129impl<'a> TIndices<'a> {
130    fn new(barray: &'a BitArray) -> Self {
131        if barray.inner.len() > 0 {
132            TIndices { barray, current_blk: 0, current_bit: 0, buf: barray.inner[0] }
133        } else {
134            TIndices { barray, current_blk: 0, current_bit: 0, buf: 0 }
135        }
136    }
137}
138
139impl Iterator for TIndices<'_> {
140    type Item = usize;
141    fn next(&mut self) -> Option<Self::Item> {
142        if self.buf == 0 {
143            if self.current_blk < self.barray.inner.len() - 1 {
144                self.current_blk += 1;
145                self.current_bit = 0;
146                self.buf = self.barray.inner[self.current_blk];
147                return self.next();
148            }
149            return None;
150        }
151        while (self.buf & 1) == 0 {
152            self.current_bit += 1;
153            self.buf >>= 1;
154        }
155        self.buf ^= 1;
156        Some(self.current_blk * BLOCK_SIZE + self.current_bit)
157    }
158}
159
160#[cfg(test)]
161mod tests {
162    use crate::BitArray;
163    #[test]
164    fn it_works() {
165        assert_eq!(2 + 2, 4);
166    }
167
168    #[test]
169    fn set_get1() {
170        let mut ba = BitArray::zeros(6);
171
172        ba.set_bool(1, true);
173        ba.set_bool(2, false);
174        ba.negate(3);
175
176        let ans = [false, true, false, true, false, false];
177        for i in 0..6 {
178            assert_eq!(ans[i], ba.get_bool(i));
179        }
180    }
181
182    #[test]
183    fn set_get2() {
184        let mut ba = BitArray::ones(6);
185
186        ba.negate(3);
187        ba.set_bool(1, true);
188        ba.set_bool(2, false);
189
190        let ans = [true, true, false, false, true, true];
191        for i in 0..6 {
192            assert_eq!(ans[i], ba.get_bool(i));
193        }
194    }
195
196    #[test]
197    fn set_get3() {
198        let mut ba = BitArray::zeros(34);
199        ba.negate(31);
200        for i in 0..34 {
201            assert_eq!(i == 31, ba.get_bool(i));
202        }
203    }
204
205    #[test]
206    fn set_get4() {
207        let mut ba = BitArray::zeros(34);
208        ba.negate(32);
209        for i in 0..34 {
210            assert_eq!(i == 32, ba.get_bool(i));
211        }
212    }
213
214    #[test]
215    fn set_get5() {
216        let mut ba = BitArray::zeros(34);
217        ba.negate(33);
218        for i in 0..34 {
219            assert_eq!(i == 33, ba.get_bool(i));
220        }
221    }
222
223    #[test]
224    fn set_get6() {
225        let mut ba = BitArray::zeros(6);
226
227        ba.set_bool(1, true);
228        ba.set_bool(1, false);
229        for i in 0..6 {
230            assert_eq!(false, ba.get_bool(i));
231        }
232    }
233
234    #[test]
235    fn set_get7() {
236        let mut ba = BitArray::zeros(7);
237
238        ba.set_bool(2, false);
239        ba.set_bool(2, true);
240        for i in 0..7 {
241            assert_eq!(i == 2, ba.get_bool(i));
242        }
243    }
244
245    #[test]
246    fn indices1() {
247        let mut ba = BitArray::zeros(41);
248        ba.negate(0);
249        ba.negate(3);
250        ba.negate(21);
251        ba.negate(31);
252        ba.negate(32);
253        ba.negate(33);
254        let v: Vec<_> = ba.true_indices().collect();
255        assert_eq!(v, vec![0, 3, 21, 31, 32, 33]);
256    }
257
258    #[test]
259    fn indices2() {
260        let ba = BitArray::ones(3);
261        let v: Vec<_> = ba.true_indices().collect();
262        assert_eq!(v, vec![0, 1, 2]);
263    }
264}