lay_simulator_gk/
bitarray.rs1#![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}