1#[cfg(feature = "serde")]
4use serde_crate::{Deserialize, Serialize};
5use std::cmp;
6use std::iter;
7use std::mem;
8use std::ops::Range;
9
10#[derive(Debug, PartialEq)]
33#[cfg_attr(
34 feature = "serde",
35 derive(Deserialize, Serialize),
36 serde(crate = "serde_crate")
37)]
38pub struct BitArrayVec {
39 blocks: Vec<u8>,
40 bit_count: usize,
41 occupied_len: usize,
42 len: usize,
43}
44
45const BLOCK_BIT_COUNT: usize = mem::size_of::<u8>() * 8;
46
47impl BitArrayVec {
48 fn get_block_count(bit_count: usize, len: usize) -> usize {
49 (bit_count * len + BLOCK_BIT_COUNT - 1) / BLOCK_BIT_COUNT
50 }
51
52 fn get_elem_count(bit_count: usize, block_count: usize) -> usize {
53 (block_count * BLOCK_BIT_COUNT) / bit_count
54 }
55
56 pub fn new(bit_count: usize, len: usize) -> Self {
71 BitArrayVec {
72 blocks: vec![0; Self::get_block_count(bit_count, len)],
73 bit_count,
74 occupied_len: 0,
75 len,
76 }
77 }
78
79 pub fn from_elem(bit_count: usize, len: usize, bytes: &[u8]) -> Self {
94 let mut ret = BitArrayVec {
95 blocks: vec![0; Self::get_block_count(bit_count, len)],
96 bit_count,
97 occupied_len: 0,
98 len,
99 };
100 for index in 0..len {
101 ret.set(index, bytes);
102 }
103 ret
104 }
105
106 pub fn with_capacity(bit_count: usize, len: usize) -> Self {
116 BitArrayVec {
117 blocks: Vec::with_capacity(Self::get_block_count(bit_count, len)),
118 bit_count,
119 occupied_len: 0,
120 len: 0,
121 }
122 }
123
124 pub fn set(&mut self, index: usize, bytes: &[u8]) {
142 assert!(index < self.len);
143 let prev_is_zero = self.get(index).iter().all(|byte| *byte == 0);
144 let mut bits_left = self.bit_count;
145 let mut bits_offset = index * self.bit_count;
146 let mut byte_offset = 0;
147
148 while bits_left > 0 {
149 let curr_bits = cmp::min(bits_left, 8 - bits_offset % 8);
150 bits_left -= curr_bits;
151
152 let mut new_bits = {
153 if byte_offset % 8 == 0 {
154 bytes[byte_offset / 8]
155 } else if (8 - byte_offset % 8) >= bits_left + curr_bits {
156 (bytes[byte_offset / 8]) >> (byte_offset % 8)
157 } else {
158 let curr = bytes[byte_offset / 8] >> (byte_offset % 8);
159 let next = bytes[byte_offset / 8 + 1] << (8 - byte_offset % 8);
160 curr | next
161 }
162 };
163
164 new_bits = new_bits << (8 - curr_bits) >> (8 - curr_bits);
165
166 self.blocks[bits_offset / 8] &= !(!0 >> (8 - curr_bits) << (bits_offset % 8));
167 self.blocks[bits_offset / 8] |= new_bits << (bits_offset % 8);
168
169 byte_offset += curr_bits;
170 bits_offset += curr_bits;
171 }
172 let curr_is_zero = self.get(index).iter().all(|byte| *byte == 0);
173 if prev_is_zero != curr_is_zero {
174 if curr_is_zero {
175 self.occupied_len -= 1;
176 } else {
177 self.occupied_len += 1;
178 }
179 }
180 }
181
182 pub fn get(&self, index: usize) -> Vec<u8> {
200 assert!(index < self.len);
201 let mut ret = vec![0; (self.bit_count + 7) / 8];
202 let mut bits_left = self.bit_count;
203 let mut bits_offset = index * self.bit_count;
204 let mut ret_offset = 0;
205
206 while bits_left > 0 {
207 let curr_bits = cmp::min(bits_left, 8);
208 bits_left -= curr_bits;
209
210 let old_bits = {
211 if bits_offset % 8 == 0 {
212 self.blocks[bits_offset / 8]
213 } else if 8 - bits_offset % 8 >= curr_bits {
214 self.blocks[bits_offset / 8] >> (bits_offset % 8)
215 } else {
216 let curr = self.blocks[bits_offset / 8] >> (bits_offset % 8);
217 let next = self.blocks[bits_offset / 8 + 1] << (8 - bits_offset % 8);
218 curr | next
219 }
220 };
221
222 ret[ret_offset / 8] = old_bits & (!0u8 >> (8 - curr_bits));
223
224 bits_offset += curr_bits;
225 ret_offset += curr_bits;
226 }
227 ret
228 }
229
230 pub fn truncate(&mut self, len: usize) {
243 while len < self.len {
244 self.pop();
245 }
246 }
247
248 pub fn reserve(&mut self, additional: usize) {
262 let desired_cap = self.len + additional;
263 if desired_cap <= Self::get_elem_count(self.bit_count, self.blocks.capacity()) {
264 return;
265 }
266
267 let target_cap = Self::get_block_count(self.bit_count, desired_cap);
268 let additional_blocks = target_cap - self.blocks.len();
269 self.blocks.reserve(additional_blocks);
270 }
271
272 pub fn reserve_exact(&mut self, additional: usize) {
286 let desired_cap = self.len + additional;
287 if desired_cap <= Self::get_elem_count(self.bit_count, self.blocks.capacity()) {
288 return;
289 }
290
291 let target_cap = Self::get_block_count(self.bit_count, desired_cap);
292 let additional_blocks = target_cap - self.blocks.len();
293 self.blocks.reserve_exact(additional_blocks);
294 }
295
296 pub fn pop(&mut self) -> Vec<u8> {
315 assert!(!self.is_empty());
316 let ret = self.get(self.len - 1);
317 let len = self.len;
318 let new_blocks_len = Self::get_block_count(self.bit_count, len - 1);
319 self.blocks.truncate(new_blocks_len);
320 self.len -= 1;
321 if !ret.iter().all(|byte| *byte == 0) {
322 self.occupied_len -= 1;
323 }
324 ret
325 }
326
327 pub fn push(&mut self, bytes: &[u8]) {
342 let new_block_len = Self::get_block_count(self.bit_count, self.len + 1);
343 let block_len = self.blocks.len();
344 self.blocks
345 .extend(iter::repeat(0).take(new_block_len - block_len));
346 let len = self.len;
347 let occupied_len = self.occupied_len;
348 self.len += 1;
349 self.set(len, bytes);
350 self.occupied_len = occupied_len;
351 if !bytes.iter().all(|byte| *byte == 0) {
352 self.occupied_len = occupied_len + 1;
353 }
354 }
355
356 pub fn clear(&mut self) {
373 self.occupied_len = 0;
374 for byte in &mut self.blocks {
375 *byte = 0;
376 }
377 }
378
379 pub fn iter(&self) -> BitArrayVecIter<'_> {
393 BitArrayVecIter {
394 bit_array_vec: self,
395 range: 0..self.len,
396 }
397 }
398
399 pub fn capacity(&self) -> usize {
412 Self::get_elem_count(self.bit_count, self.blocks.capacity())
413 }
414
415 pub fn len(&self) -> usize {
428 self.len
429 }
430
431 pub fn is_empty(&self) -> bool {
445 self.len == 0
446 }
447
448 pub fn occupied_len(&self) -> usize {
461 self.occupied_len
462 }
463
464 pub fn bit_count(&self) -> usize {
476 self.bit_count
477 }
478}
479
480pub struct BitArrayVecIter<'a> {
484 bit_array_vec: &'a BitArrayVec,
485 range: Range<usize>,
486}
487
488impl<'a> Iterator for BitArrayVecIter<'a> {
489 type Item = Vec<u8>;
490
491 fn next(&mut self) -> Option<Vec<u8>> {
492 self.range.next().map(|index| self.bit_array_vec.get(index))
493 }
494}
495
496impl<'a> IntoIterator for &'a BitArrayVec {
497 type IntoIter = BitArrayVecIter<'a>;
498 type Item = Vec<u8>;
499
500 fn into_iter(self) -> Self::IntoIter {
501 self.iter()
502 }
503}
504
505pub struct BitArrayVecIntoIter {
509 bit_array_vec: BitArrayVec,
510 range: Range<usize>,
511}
512
513impl Iterator for BitArrayVecIntoIter {
514 type Item = Vec<u8>;
515
516 fn next(&mut self) -> Option<Vec<u8>> {
517 self.range.next().map(|index| self.bit_array_vec.get(index))
518 }
519}
520
521impl IntoIterator for BitArrayVec {
522 type IntoIter = BitArrayVecIntoIter;
523 type Item = Vec<u8>;
524
525 fn into_iter(self) -> Self::IntoIter {
526 let len = self.len;
527 Self::IntoIter {
528 bit_array_vec: self,
529 range: 0..len,
530 }
531 }
532}
533
534#[cfg(test)]
535mod tests {
536 use super::BitArrayVec;
537
538 #[test]
539 fn test_bit_count_5() {
540 let mut bav = BitArrayVec::new(5, 8);
541 assert_eq!(bav.len(), 8);
542
543 bav.set(0, &[0]);
544 assert_eq!(bav.occupied_len(), 0);
545
546 for i in 0..8 {
547 bav.set(i, &[((i + 1) as u8)]);
548 assert_eq!(bav.occupied_len(), i + 1);
549 }
550
551 bav.set(0, &[1]);
552 assert_eq!(bav.occupied_len(), 8);
553
554 for i in 0..8 {
555 assert_eq!(bav.get(i), vec![((i + 1) as u8)]);
556 bav.set(i, &[0]);
557 assert_eq!(bav.occupied_len(), 8 - i - 1);
558 }
559
560 for i in 0..7 {
561 bav.set(i, &[((i + 1) as u8)]);
562 }
563
564 bav.truncate(4);
565 assert_eq!(bav.occupied_len(), 4);
566 assert_eq!(bav.len(), 4);
567
568 assert_eq!(
569 bav.iter().collect::<Vec<Vec<u8>>>(),
570 vec![vec![1], vec![2], vec![3], vec![4]],
571 );
572
573 bav.push(&[5]);
574 assert_eq!(bav.occupied_len(), 5);
575 assert_eq!(bav.len(), 5);
576
577 bav.push(&[0]);
578 assert_eq!(bav.occupied_len(), 5);
579 assert_eq!(bav.len(), 6);
580
581 assert_eq!(bav.pop(), vec![0]);
582 assert_eq!(bav.occupied_len(), 5);
583 assert_eq!(bav.len(), 5);
584
585 assert_eq!(bav.pop(), vec![5]);
586 assert_eq!(bav.occupied_len(), 4);
587 assert_eq!(bav.len(), 4);
588
589 bav.truncate(0);
590 assert!(bav.is_empty());
591 assert_eq!(bav.occupied_len(), 0);
592 assert_eq!(bav.len(), 0);
593
594 let mut bav = BitArrayVec::new(21, 8);
595 bav.reserve(10);
596 assert!(bav.capacity() >= 18);
597
598 let mut bav = BitArrayVec::new(21, 8);
599 bav.reserve_exact(10);
600 assert_eq!(bav.capacity(), 18);
601 }
602
603 #[test]
604 fn test_bit_count_13() {
605 let mut bav = BitArrayVec::new(13, 8);
606 assert_eq!(bav.len(), 8);
607
608 bav.set(0, &[0, 0]);
609 assert_eq!(bav.occupied_len(), 0);
610
611 for i in 0..8 {
612 bav.set(i, &[((i + 1) as u8), !0]);
613 assert_eq!(bav.occupied_len(), i + 1);
614 }
615
616 bav.set(0, &[1, !0]);
617 assert_eq!(bav.occupied_len(), 8);
618
619 for i in 0..8 {
620 assert_eq!(bav.get(i), vec![((i + 1) as u8), 0b11111]);
621 bav.set(i, &[0, 0]);
622 assert_eq!(bav.occupied_len(), 8 - i - 1);
623 }
624
625 for i in 0..7 {
626 bav.set(i, &[((i + 1) as u8), !0]);
627 }
628
629 bav.truncate(4);
630 assert_eq!(bav.occupied_len(), 4);
631 assert_eq!(bav.len(), 4);
632
633 assert_eq!(
634 bav.iter().collect::<Vec<Vec<u8>>>(),
635 vec![
636 vec![1, 0b11111],
637 vec![2, 0b11111],
638 vec![3, 0b11111],
639 vec![4, 0b11111],
640 ],
641 );
642
643 bav.push(&[5, !0]);
644 assert_eq!(bav.occupied_len(), 5);
645 assert_eq!(bav.len(), 5);
646
647 bav.push(&[0, 0]);
648 assert_eq!(bav.occupied_len(), 5);
649 assert_eq!(bav.len(), 6);
650
651 assert_eq!(bav.pop(), vec![0, 0]);
652 assert_eq!(bav.occupied_len(), 5);
653 assert_eq!(bav.len(), 5);
654
655 assert_eq!(bav.pop(), vec![5, 0b11111]);
656 assert_eq!(bav.occupied_len(), 4);
657 assert_eq!(bav.len(), 4);
658
659 bav.truncate(0);
660 assert!(bav.is_empty());
661 assert_eq!(bav.occupied_len(), 0);
662 assert_eq!(bav.len(), 0);
663
664 let mut bav = BitArrayVec::new(21, 8);
665 bav.reserve(10);
666 assert!(bav.capacity() >= 18);
667
668 let mut bav = BitArrayVec::new(21, 8);
669 bav.reserve_exact(10);
670 assert_eq!(bav.capacity(), 18);
671 }
672
673 #[test]
674 fn test_bit_count_21() {
675 let mut bav = BitArrayVec::new(21, 8);
676 assert_eq!(bav.len(), 8);
677
678 bav.set(0, &[0, 0, 0]);
679 assert_eq!(bav.occupied_len(), 0);
680
681 for i in 0..8 {
682 bav.set(i, &[((i + 1) as u8), !0, !0]);
683 assert_eq!(bav.occupied_len(), i + 1);
684 }
685
686 bav.set(0, &[1, !0, !0]);
687 assert_eq!(bav.occupied_len(), 8);
688
689 for i in 0..8 {
690 assert_eq!(bav.get(i), vec![((i + 1) as u8), !0, 0b11111]);
691 bav.set(i, &[0, 0, 0]);
692 assert_eq!(bav.occupied_len(), 8 - i - 1);
693 }
694
695 for i in 0..7 {
696 bav.set(i, &[((i + 1) as u8), !0, !0]);
697 }
698
699 bav.truncate(4);
700 assert_eq!(bav.occupied_len(), 4);
701 assert_eq!(bav.len(), 4);
702
703 assert_eq!(
704 bav.iter().collect::<Vec<Vec<u8>>>(),
705 vec![
706 vec![1, !0, 0b11111],
707 vec![2, !0, 0b11111],
708 vec![3, !0, 0b11111],
709 vec![4, !0, 0b11111],
710 ],
711 );
712
713 bav.push(&[5, !0, !0]);
714 assert_eq!(bav.occupied_len(), 5);
715 assert_eq!(bav.len(), 5);
716
717 bav.push(&[0, 0, 0]);
718 assert_eq!(bav.occupied_len(), 5);
719 assert_eq!(bav.len(), 6);
720
721 assert_eq!(bav.pop(), vec![0, 0, 0]);
722 assert_eq!(bav.occupied_len(), 5);
723 assert_eq!(bav.len(), 5);
724
725 assert_eq!(bav.pop(), vec![5, !0, 0b11111]);
726 assert_eq!(bav.occupied_len(), 4);
727 assert_eq!(bav.len(), 4);
728
729 bav.truncate(0);
730 assert!(bav.is_empty());
731 assert_eq!(bav.occupied_len(), 0);
732 assert_eq!(bav.len(), 0);
733
734 let mut bav = BitArrayVec::new(21, 8);
735 bav.reserve(10);
736 assert!(bav.capacity() >= 18);
737
738 let mut bav = BitArrayVec::new(21, 8);
739 bav.reserve_exact(10);
740 assert_eq!(bav.capacity(), 18);
741 }
742
743 #[test]
744 fn test_bit_count() {
745 let bav = BitArrayVec::new(8, 10);
746 assert_eq!(bav.bit_count(), 8);
747 }
748
749 #[test]
750 fn test_from_elem() {
751 let bav = BitArrayVec::from_elem(5, 4, &[1]);
752 assert_eq!(
753 bav.iter().collect::<Vec<Vec<u8>>>(),
754 vec![vec![1], vec![1], vec![1], vec![1]],
755 );
756 }
757
758 #[test]
759 fn test_with_capacity() {
760 let bav = BitArrayVec::with_capacity(5, 4);
761
762 assert_eq!(bav.len(), 0);
763 assert_eq!(bav.capacity(), 4);
764 }
765
766 #[test]
767 fn test_into_iter() {
768 let mut bav = BitArrayVec::new(5, 0);
769 bav.push(&[0]);
770 bav.push(&[1]);
771 bav.push(&[2]);
772 bav.push(&[3]);
773
774 assert_eq!(
775 bav.into_iter().collect::<Vec<Vec<u8>>>(),
776 vec![vec![0], vec![1], vec![2], vec![3]],
777 );
778 }
779}