1use crate::{bit_mask, bit_util, BooleanBuffer, Buffer, MutableBuffer};
19use std::ops::Range;
20
21#[derive(Debug)]
29pub struct BooleanBufferBuilder {
30 buffer: MutableBuffer,
31 len: usize,
32}
33
34impl BooleanBufferBuilder {
35 #[inline]
41 pub fn new(capacity: usize) -> Self {
42 let byte_capacity = bit_util::ceil(capacity, 8);
43 let buffer = MutableBuffer::new(byte_capacity);
44 Self { buffer, len: 0 }
45 }
46
47 pub fn new_from_buffer(buffer: MutableBuffer, len: usize) -> Self {
49 assert!(len <= buffer.len() * 8);
50 let mut s = Self {
51 len: buffer.len() * 8,
52 buffer,
53 };
54 s.truncate(len);
55 s
56 }
57
58 #[inline]
60 pub fn len(&self) -> usize {
61 self.len
62 }
63
64 #[inline]
66 pub fn set_bit(&mut self, index: usize, v: bool) {
67 if v {
68 bit_util::set_bit(self.buffer.as_mut(), index);
69 } else {
70 bit_util::unset_bit(self.buffer.as_mut(), index);
71 }
72 }
73
74 #[inline]
76 pub fn get_bit(&self, index: usize) -> bool {
77 bit_util::get_bit(self.buffer.as_slice(), index)
78 }
79
80 #[inline]
82 pub fn is_empty(&self) -> bool {
83 self.len == 0
84 }
85
86 #[inline]
105 pub fn capacity(&self) -> usize {
106 self.buffer.capacity() * 8
107 }
108
109 #[inline]
111 pub fn advance(&mut self, additional: usize) {
112 let new_len = self.len + additional;
113 let new_len_bytes = bit_util::ceil(new_len, 8);
114 if new_len_bytes > self.buffer.len() {
115 self.buffer.resize(new_len_bytes, 0);
116 }
117 self.len = new_len;
118 }
119
120 #[inline]
124 pub fn truncate(&mut self, len: usize) {
125 if len > self.len {
126 return;
127 }
128
129 let new_len_bytes = bit_util::ceil(len, 8);
130 self.buffer.truncate(new_len_bytes);
131 self.len = len;
132
133 let remainder = self.len % 8;
134 if remainder != 0 {
135 let mask = (1_u8 << remainder).wrapping_sub(1);
136 *self.buffer.as_mut().last_mut().unwrap() &= mask;
137 }
138 }
139
140 #[inline]
144 pub fn reserve(&mut self, additional: usize) {
145 let capacity = self.len + additional;
146 if capacity > self.capacity() {
147 let additional = bit_util::ceil(capacity, 8) - self.buffer.len();
149 self.buffer.reserve(additional);
150 }
151 }
152
153 #[inline]
156 pub fn resize(&mut self, len: usize) {
157 match len.checked_sub(self.len) {
158 Some(delta) => self.advance(delta),
159 None => self.truncate(len),
160 }
161 }
162
163 #[inline]
165 pub fn append(&mut self, v: bool) {
166 self.advance(1);
167 if v {
168 unsafe { bit_util::set_bit_raw(self.buffer.as_mut_ptr(), self.len - 1) };
169 }
170 }
171
172 #[inline]
174 pub fn append_n(&mut self, additional: usize, v: bool) {
175 match v {
176 true => {
177 let new_len = self.len + additional;
178 let new_len_bytes = bit_util::ceil(new_len, 8);
179 let cur_remainder = self.len % 8;
180 let new_remainder = new_len % 8;
181
182 if cur_remainder != 0 {
183 *self.buffer.as_slice_mut().last_mut().unwrap() |= !((1 << cur_remainder) - 1)
185 }
186 self.buffer.resize(new_len_bytes, 0xFF);
187 if new_remainder != 0 {
188 *self.buffer.as_slice_mut().last_mut().unwrap() &= (1 << new_remainder) - 1
190 }
191 self.len = new_len;
192 }
193 false => self.advance(additional),
194 }
195 }
196
197 #[inline]
199 pub fn append_slice(&mut self, slice: &[bool]) {
200 let additional = slice.len();
201 self.advance(additional);
202
203 let offset = self.len() - additional;
204 for (i, v) in slice.iter().enumerate() {
205 if *v {
206 unsafe { bit_util::set_bit_raw(self.buffer.as_mut_ptr(), offset + i) }
207 }
208 }
209 }
210
211 pub fn append_packed_range(&mut self, range: Range<usize>, to_set: &[u8]) {
219 let offset_write = self.len;
220 let len = range.end - range.start;
221 self.advance(len);
222 bit_mask::set_bits(
223 self.buffer.as_slice_mut(),
224 to_set,
225 offset_write,
226 range.start,
227 len,
228 );
229 }
230
231 pub fn append_buffer(&mut self, buffer: &BooleanBuffer) {
233 let range = buffer.offset()..buffer.offset() + buffer.len();
234 self.append_packed_range(range, buffer.values())
235 }
236
237 pub fn as_slice(&self) -> &[u8] {
239 self.buffer.as_slice()
240 }
241
242 pub fn as_slice_mut(&mut self) -> &mut [u8] {
244 self.buffer.as_slice_mut()
245 }
246
247 #[inline]
249 pub fn finish(&mut self) -> BooleanBuffer {
250 let buf = std::mem::replace(&mut self.buffer, MutableBuffer::new(0));
251 let len = std::mem::replace(&mut self.len, 0);
252 BooleanBuffer::new(buf.into(), 0, len)
253 }
254
255 pub fn finish_cloned(&self) -> BooleanBuffer {
257 BooleanBuffer::new(Buffer::from_slice_ref(self.as_slice()), 0, self.len)
258 }
259}
260
261impl From<BooleanBufferBuilder> for Buffer {
262 #[inline]
263 fn from(builder: BooleanBufferBuilder) -> Self {
264 builder.buffer.into()
265 }
266}
267
268impl From<BooleanBufferBuilder> for BooleanBuffer {
269 #[inline]
270 fn from(builder: BooleanBufferBuilder) -> Self {
271 BooleanBuffer::new(builder.buffer.into(), 0, builder.len)
272 }
273}
274
275#[cfg(test)]
276mod tests {
277 use super::*;
278
279 #[test]
280 fn test_boolean_buffer_builder_write_bytes() {
281 let mut b = BooleanBufferBuilder::new(4);
282 b.append(false);
283 b.append(true);
284 b.append(false);
285 b.append(true);
286 assert_eq!(4, b.len());
287 assert_eq!(512, b.capacity());
288 let buffer = b.finish();
289 assert_eq!(4, buffer.len());
290
291 let mut b = BooleanBufferBuilder::new(8);
293 b.append_slice(&[false, true, false, true]);
294 assert_eq!(4, b.len());
295 assert_eq!(512, b.capacity());
296 let buffer = b.finish();
297 assert_eq!(4, buffer.len());
298 }
299
300 #[test]
301 fn test_boolean_buffer_builder_unset_first_bit() {
302 let mut buffer = BooleanBufferBuilder::new(4);
303 buffer.append(true);
304 buffer.append(true);
305 buffer.append(false);
306 buffer.append(true);
307 buffer.set_bit(0, false);
308 assert_eq!(buffer.len(), 4);
309 assert_eq!(buffer.finish().values(), &[0b1010_u8]);
310 }
311
312 #[test]
313 fn test_boolean_buffer_builder_unset_last_bit() {
314 let mut buffer = BooleanBufferBuilder::new(4);
315 buffer.append(true);
316 buffer.append(true);
317 buffer.append(false);
318 buffer.append(true);
319 buffer.set_bit(3, false);
320 assert_eq!(buffer.len(), 4);
321 assert_eq!(buffer.finish().values(), &[0b0011_u8]);
322 }
323
324 #[test]
325 fn test_boolean_buffer_builder_unset_an_inner_bit() {
326 let mut buffer = BooleanBufferBuilder::new(5);
327 buffer.append(true);
328 buffer.append(true);
329 buffer.append(false);
330 buffer.append(true);
331 buffer.set_bit(1, false);
332 assert_eq!(buffer.len(), 4);
333 assert_eq!(buffer.finish().values(), &[0b1001_u8]);
334 }
335
336 #[test]
337 fn test_boolean_buffer_builder_unset_several_bits() {
338 let mut buffer = BooleanBufferBuilder::new(5);
339 buffer.append(true);
340 buffer.append(true);
341 buffer.append(true);
342 buffer.append(false);
343 buffer.append(true);
344 buffer.set_bit(1, false);
345 buffer.set_bit(2, false);
346 assert_eq!(buffer.len(), 5);
347 assert_eq!(buffer.finish().values(), &[0b10001_u8]);
348 }
349
350 #[test]
351 fn test_boolean_buffer_builder_unset_several_bits_bigger_than_one_byte() {
352 let mut buffer = BooleanBufferBuilder::new(16);
353 buffer.append_n(10, true);
354 buffer.set_bit(0, false);
355 buffer.set_bit(3, false);
356 buffer.set_bit(9, false);
357 assert_eq!(buffer.len(), 10);
358 assert_eq!(buffer.finish().values(), &[0b11110110_u8, 0b01_u8]);
359 }
360
361 #[test]
362 fn test_boolean_buffer_builder_flip_several_bits_bigger_than_one_byte() {
363 let mut buffer = BooleanBufferBuilder::new(16);
364 buffer.append_n(5, true);
365 buffer.append_n(5, false);
366 buffer.append_n(5, true);
367 buffer.set_bit(0, false);
368 buffer.set_bit(3, false);
369 buffer.set_bit(9, false);
370 buffer.set_bit(6, true);
371 buffer.set_bit(14, true);
372 buffer.set_bit(13, false);
373 assert_eq!(buffer.len(), 15);
374 assert_eq!(buffer.finish().values(), &[0b01010110_u8, 0b1011100_u8]);
375 }
376
377 #[test]
378 fn test_bool_buffer_builder_get_first_bit() {
379 let mut buffer = BooleanBufferBuilder::new(16);
380 buffer.append_n(8, true);
381 buffer.append_n(8, false);
382 assert!(buffer.get_bit(0));
383 }
384
385 #[test]
386 fn test_bool_buffer_builder_get_first_bit_not_requires_mutability() {
387 let buffer = {
388 let mut buffer = BooleanBufferBuilder::new(16);
389 buffer.append_n(8, true);
390 buffer
391 };
392
393 assert!(buffer.get_bit(0));
394 }
395
396 #[test]
397 fn test_bool_buffer_builder_get_last_bit() {
398 let mut buffer = BooleanBufferBuilder::new(16);
399 buffer.append_n(8, true);
400 buffer.append_n(8, false);
401 assert!(!buffer.get_bit(15));
402 }
403
404 #[test]
405 fn test_bool_buffer_builder_get_an_inner_bit() {
406 let mut buffer = BooleanBufferBuilder::new(16);
407 buffer.append_n(4, false);
408 buffer.append_n(8, true);
409 buffer.append_n(4, false);
410 assert!(buffer.get_bit(11));
411 }
412
413 #[test]
414 fn test_bool_buffer_fuzz() {
415 use rand::prelude::*;
416
417 let mut buffer = BooleanBufferBuilder::new(12);
418 let mut all_bools = vec![];
419 let mut rng = rand::thread_rng();
420
421 let src_len = 32;
422 let (src, compacted_src) = {
423 let src: Vec<_> = std::iter::from_fn(|| Some(rng.next_u32() & 1 == 0))
424 .take(src_len)
425 .collect();
426
427 let mut compacted_src = BooleanBufferBuilder::new(src_len);
428 compacted_src.append_slice(&src);
429 (src, compacted_src.finish())
430 };
431
432 for _ in 0..100 {
433 let a = rng.next_u32() as usize % src_len;
434 let b = rng.next_u32() as usize % src_len;
435
436 let start = a.min(b);
437 let end = a.max(b);
438
439 buffer.append_packed_range(start..end, compacted_src.values());
440 all_bools.extend_from_slice(&src[start..end]);
441 }
442
443 let mut compacted = BooleanBufferBuilder::new(all_bools.len());
444 compacted.append_slice(&all_bools);
445
446 assert_eq!(buffer.finish(), compacted.finish())
447 }
448
449 #[test]
450 fn test_boolean_array_builder_resize() {
451 let mut builder = BooleanBufferBuilder::new(20);
452 builder.append_n(4, true);
453 builder.append_n(7, false);
454 builder.append_n(2, true);
455 builder.resize(20);
456
457 assert_eq!(builder.len(), 20);
458 assert_eq!(builder.as_slice(), &[0b00001111, 0b00011000, 0b00000000]);
459
460 builder.resize(5);
461 assert_eq!(builder.len(), 5);
462 assert_eq!(builder.as_slice(), &[0b00001111]);
463
464 builder.append_n(4, true);
465 assert_eq!(builder.len(), 9);
466 assert_eq!(builder.as_slice(), &[0b11101111, 0b00000001]);
467 }
468
469 #[test]
470 fn test_truncate() {
471 let b = MutableBuffer::from_iter([true, true, true, true]);
472 let mut builder = BooleanBufferBuilder::new_from_buffer(b, 2);
473 builder.advance(2);
474 let finished = builder.finish();
475 assert_eq!(finished.values(), &[0b00000011]);
476
477 let mut builder = BooleanBufferBuilder::new(10);
478 builder.append_n(5, true);
479 builder.resize(3);
480 builder.advance(2);
481 let finished = builder.finish();
482 assert_eq!(finished.values(), &[0b00000111]);
483
484 let mut builder = BooleanBufferBuilder::new(10);
485 builder.append_n(16, true);
486 assert_eq!(builder.as_slice(), &[0xFF, 0xFF]);
487 builder.truncate(20);
488 assert_eq!(builder.as_slice(), &[0xFF, 0xFF]);
489 builder.truncate(14);
490 assert_eq!(builder.as_slice(), &[0xFF, 0b00111111]);
491 builder.append(false);
492 builder.append(true);
493 assert_eq!(builder.as_slice(), &[0xFF, 0b10111111]);
494 builder.append_packed_range(0..3, &[0xFF]);
495 assert_eq!(builder.as_slice(), &[0xFF, 0b10111111, 0b00000111]);
496 builder.truncate(17);
497 assert_eq!(builder.as_slice(), &[0xFF, 0b10111111, 0b00000001]);
498 builder.append_packed_range(0..2, &[2]);
499 assert_eq!(builder.as_slice(), &[0xFF, 0b10111111, 0b0000101]);
500 builder.truncate(8);
501 assert_eq!(builder.as_slice(), &[0xFF]);
502 builder.resize(14);
503 assert_eq!(builder.as_slice(), &[0xFF, 0x00]);
504 builder.truncate(0);
505 assert_eq!(builder.as_slice(), &[]);
506 }
507
508 #[test]
509 fn test_boolean_builder_increases_buffer_len() {
510 let buf = Buffer::from([72_u8, 2_u8]);
512 let mut builder = BooleanBufferBuilder::new(8);
513
514 for i in 0..16 {
515 if i == 3 || i == 6 || i == 9 {
516 builder.append(true);
517 } else {
518 builder.append(false);
519 }
520 }
521 let buf2 = builder.finish();
522
523 assert_eq!(buf.len(), buf2.inner().len());
524 assert_eq!(buf.as_slice(), buf2.values());
525 }
526}