1#![cfg_attr(not(feature = "std"), no_std)]
2#![cfg_attr(feature = "unstable", feature(allocator_api))]
3
4extern crate alloc;
16
17#[cfg(feature = "unstable")]
18use core::alloc::Allocator;
19use core::fmt;
20use core::num::Wrapping;
21use core::write;
22use core::prelude::rust_2021::*;
23use alloc::vec::Vec;
24use alloc::vec;
25#[cfg(feature = "unstable")]
26use alloc::alloc::Global;
27
28#[cfg(feature = "serde")]
29#[macro_use] extern crate serde;
30
31#[cfg(not(feature = "unstable"))]
34#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
35#[derive(Clone, Default, PartialEq, Eq)]
36pub struct BitVec {
37 nbits: usize,
38 vec: Vec<u8>,
39}
40
41#[cfg(feature = "unstable")]
44#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
45#[derive(Clone)]
46pub struct BitVec<A: Allocator = Global> {
47 nbits: usize,
48 vec: Vec<u8, A>,
49}
50
51#[cfg(feature = "unstable")]
55impl<A: Allocator, B: Allocator> PartialEq<BitVec<B>> for BitVec<A> {
56
57 fn eq(&self, other: &BitVec<B>) -> bool {
58 self.nbits == other.nbits && self.vec == other.vec
59 }
60
61}
62
63#[cfg(feauture = "unstable")]
64impl Default for BitVec {
65
66 fn default() -> Self {
67 Self { nbits: 0, vec: Vec::new() }
68 }
69
70}
71
72#[cfg(feature = "unstable")]
73impl<A: Allocator> Eq for BitVec<A> {}
74
75fn bytes_in_bits(nbits: usize) -> usize {
76 (nbits + 7) / 8
78}
79
80fn byte_from_bool(bit: bool) -> u8 {
81 if bit { !0u8 } else { 0u8 }
82}
83
84#[cfg(feature = "unstable")]
85impl<A: Allocator> BitVec<A> {
86 pub const fn new_in(alloc: A) -> Self {
91 Self { vec: Vec::new_in(alloc), nbits: 0 }
92 }
93
94 pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
96 Self { vec: Vec::with_capacity_in(bytes_in_bits(capacity), alloc), nbits: 0 }
97 }
98
99}
100
101impl BitVec {
102 pub const fn new() -> Self {
107 Self { vec: Vec::new(), nbits: 0 }
108 }
109
110 pub fn with_capacity(capacity: usize) -> Self {
115 Self { vec: Vec::with_capacity(bytes_in_bits(capacity)), nbits: 0 }
116 }
117
118 pub fn from_bytes(bytes: &[u8]) -> Self {
120 let mut vec = Self { vec: Vec::from(bytes), nbits: bytes.len() * 8 };
121 vec.set_unused_zero();
122 vec
123 }
124
125 pub fn from_bools(bools: &[bool]) -> Self {
127 let mut vec = Self::with_capacity(bools.len());
128 for &b in bools {
129 vec.push(b);
130 }
131 vec
132 }
133
134 pub fn from_elem(len: usize, value: bool) -> Self {
136 let mut vec = Self {
137 vec: vec![byte_from_bool(value); bytes_in_bits(len)],
138 nbits: len,
139 };
140 vec.set_unused_zero();
141 vec
142 }
143
144}
145
146macro_rules! impl_bitvec {
147 ($into_bytes_type: ty) => {
148
149 pub fn as_bytes(&self) -> &[u8] { &self.vec }
154
155 pub fn with_bytes_mut<U, F: FnOnce(&mut [u8]) -> U>(&mut self, f: F) -> U {
158 let val = f(&mut self.vec);
159 self.set_unused_zero();
160 val
161 }
162
163 pub fn into_bytes(self) -> $into_bytes_type { self.vec }
167
168 pub fn len(&self) -> usize { self.nbits }
173
174 pub fn is_empty(&self) -> bool { self.nbits == 0 }
176
177 fn validate_index(&self, index: usize) {
179 assert!(self.nbits <= self.vec.len() * 8,
180 "Expected #bits {} <= 8 x (#bytes {} in vec).", self.nbits, self.vec.len());
181 if index >= self.nbits { panic!("Index {} out of bounds [0, {})", index, self.nbits); }
182 }
183
184 pub fn get(&self, index: usize) -> Option<bool> {
186 if index < self.len() {
187 Some(unsafe { self.get_unchecked(index) })
188 } else {
189 None
190 }
191 }
192
193 pub fn set(&mut self, index: usize, value: bool) {
195 self.validate_index(index);
196 unsafe { self.set_unchecked(index, value) };
197 }
198
199 pub fn swap(&mut self, i: usize, j: usize) {
201 self.validate_index(i);
202 self.validate_index(j);
203 unsafe {
204 let val_i = self.get_unchecked(i);
205 let val_j = self.get_unchecked(j);
206 self.set_unchecked(i, val_j);
207 self.set_unchecked(j, val_i);
208 }
209 }
210
211 pub unsafe fn get_unchecked(&self, index: usize) -> bool {
213 let byte = self.vec.get_unchecked(index / 8);
214 let pattern = 1u8 << (index % 8);
215 (*byte & pattern) != 0u8
216 }
217
218 pub unsafe fn set_unchecked(&mut self, index: usize, value: bool) {
220 let byte = self.vec.get_unchecked_mut(index / 8);
221 let pattern = 1u8 << (index % 8);
222 *byte = if value { *byte | pattern }
223 else { *byte & !pattern };
224 }
225
226 pub fn push(&mut self, value: bool) {
231 let nbits = self.nbits; if nbits % 8 == 0 {
233 self.vec.push(if value { 1u8 } else { 0u8 });
234 } else {
235 unsafe { self.set_unchecked(nbits, value) };
236 }
237 self.nbits += 1;
238 }
239
240 pub fn pop(&mut self) -> Option<bool> {
242 if self.nbits == 0 { return None }
243 self.nbits -= 1;
244
245 let nbits = self.nbits; let value = unsafe { self.get_unchecked(nbits) };
248 unsafe { self.set_unchecked(nbits, false); }
250 if self.nbits % 8 == 0 {
252 assert!(self.nbits == (self.vec.len() - 1) * 8,
253 "Expected #bits {} == 8 x (#bytes {} in vec - 1) after bit pop and before vec pop.",
254 self.nbits, self.vec.len());
255 self.vec.pop();
256 }
257
258 Some(value)
259 }
260
261 pub fn clear(&mut self) {
263 self.vec.clear();
264 self.nbits = 0;
265 }
266
267 pub fn capacity(&self) -> usize {
269 self.vec.capacity() * 8
270 }
271
272 pub fn reserve(&mut self, additional: usize) {
275 self.vec.reserve(bytes_in_bits(additional))
276 }
277
278 pub fn truncate(&mut self, len: usize) {
282 if len < self.len() {
283 let nbytes = bytes_in_bits(len);
284 self.vec.truncate(nbytes);
285 self.nbits = len;
286 self.set_unused_zero()
287 }
288 }
289
290 pub fn resize(&mut self, new_len: usize, value: bool) {
293 if new_len > self.len() {
294 let additional = new_len - self.len();
295 self.reserve(additional);
296 for _ in 0..additional {
297 self.push(value);
298 }
299 } else {
300 self.truncate(new_len);
301 }
302 }
303
304
305 fn set_unused_zero(&mut self) {
310 if self.nbits % 8 == 0 { return }
311 let len = self.vec.len(); assert!(len > 0);
313
314 let byte = unsafe { self.vec.get_unchecked_mut(len - 1) };
315 let pattern = (Wrapping(1u8 << (self.nbits % 8)) - Wrapping(1u8)).0;
317 *byte &= pattern;
318 }
319 }
320}
321
322#[cfg(not(feature = "unstable"))]
323impl BitVec {
324 impl_bitvec!(Vec<u8>);
325
326 pub fn iter(&self) -> Iter {
331 self.into_iter()
332 }
333}
334
335#[cfg(feature = "unstable")]
336impl<A: Allocator> BitVec<A> {
337 impl_bitvec!(Vec<u8, A>);
338
339 pub fn iter(&self) -> Iter<A> {
344 self.into_iter()
345 }
346}
347
348macro_rules! impl_display {
349 () => {
350 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
351 for (val, index) in self.iter().zip(0..usize::max_value()) {
352 if index > 0 && index % 8 == 0 {
353 write!(f, " ")?;
354 }
355 write!(f, "{}", if val { "1" } else { "." })?;
356 }
357 Ok(())
358 }
359 }
360}
361
362#[cfg(not(feature = "unstable"))]
363impl fmt::Debug for BitVec {
364 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
365 write!(f, "BitVec{{{:?}: {}}}", self.nbits, &self)
366 }
367}
368
369#[cfg(not(feature = "unstable"))]
370impl fmt::Display for BitVec {
371 impl_display!();
372}
373
374#[cfg(feature = "unstable")]
375impl<A: Allocator> fmt::Debug for BitVec<A> {
376 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
377 write!(f, "BitVec{{{:?}: {}}}", self.nbits, &self)
378 }
379}
380
381#[cfg(feature = "unstable")]
382impl<A: Allocator> fmt::Display for BitVec<A> {
383 impl_display!();
384}
385
386impl Extend<bool> for BitVec {
387 fn extend<T>(&mut self, iterable: T)
388 where T: IntoIterator<Item = bool>
389 {
390 let iter = iterable.into_iter();
391 let (min, max) = iter.size_hint();
392 self.reserve(max.unwrap_or(min));
393 for val in iter { self.push(val); }
394 }
395}
396
397impl<'a> Extend<&'a bool> for BitVec {
398 fn extend<T>(&mut self, iterable: T)
399 where T: IntoIterator<Item = &'a bool>
400 {
401 let iter = iterable.into_iter();
402 let (min, max) = iter.size_hint();
403 self.reserve(max.unwrap_or(min));
404 for val in iter { self.push(*val); }
405 }
406}
407
408impl core::iter::FromIterator<bool> for BitVec {
409 fn from_iter<T>(iterable: T) -> Self
410 where T: IntoIterator<Item = bool>
411 {
412 let iter = iterable.into_iter();
413 let (min, max) = iter.size_hint();
414 let mut vec = BitVec::with_capacity(max.unwrap_or(min));
415 for val in iter { vec.push(val); }
416 vec
417 }
418}
419
420impl<'a> core::iter::FromIterator<&'a bool> for BitVec {
421 fn from_iter<T>(iterable: T) -> Self
422 where T: IntoIterator<Item = &'a bool>
423 {
424 let iter = iterable.into_iter();
425 let (min, max) = iter.size_hint();
426 let mut vec = BitVec::with_capacity(max.unwrap_or(min));
427 for &val in iter { vec.push(val); }
428 vec
429 }
430}
431
432impl From<&[bool]> for BitVec {
433 fn from(bools: &[bool]) -> Self {
434 BitVec::from_bools(bools)
435 }
436}
437
438impl From<&Vec<bool>> for BitVec {
439 fn from(bools: &Vec<bool>) -> Self {
440 BitVec::from_bools(bools)
441 }
442}
443
444impl From<Vec<bool>> for BitVec {
445 fn from(bools: Vec<bool>) -> Self {
446 BitVec::from_bools(&bools)
447 }
448}
449
450macro_rules! impl_iter {
454 () => {
455 type Item = bool;
456
457 fn size_hint(&self) -> (usize, Option<usize>) {
458 let remaining = self.vec.len() - self.index;
459 (remaining, Some(remaining))
460 }
461
462 fn count(self) -> usize {
463 self.vec.len() - self.index
464 }
465
466 fn last(self) -> Option<Self::Item> {
467 let len = self.vec.len();
468 if self.index < len {
469 Some(unsafe { self.vec.get_unchecked(len - 1) })
470 } else {
471 None
472 }
473 }
474
475 fn nth(&mut self, count: usize) -> Option<Self::Item> {
476 self.index = if count >= self.vec.nbits - self.index {
477 self.vec.nbits
478 } else {
479 self.index + count
480 };
481 self.next()
482 }
483
484 fn next(&mut self) -> Option<Self::Item> {
485 if self.index >= self.vec.nbits {
486 None
487 } else {
488 let val = unsafe { self.vec.get_unchecked(self.index) };
489 self.index += 1;
490 Some(val)
491 }
492 }
493 };
494}
495
496pub use self::iter::*;
497
498#[cfg(not(feature = "unstable"))]
499mod iter {
500 use super::BitVec;
501
502 #[derive(Clone)]
504 pub struct Iter<'a>
505 {
506 vec: &'a BitVec,
507 index: usize,
508 }
509
510 pub struct IntoIter
512 {
513 vec: BitVec,
514 index: usize,
515 }
516
517 impl<'a> Iterator for Iter<'a> {
518 impl_iter!();
519 }
520
521 impl Iterator for IntoIter {
522 impl_iter!();
523 }
524
525 impl<'a> IntoIterator for &'a BitVec {
526 type Item = bool;
527 type IntoIter = Iter<'a>;
528 fn into_iter(self) -> Self::IntoIter {
529 Iter {
530 vec: self,
531 index: 0,
532 }
533 }
534 }
535
536 impl IntoIterator for BitVec {
537 type Item = bool;
538 type IntoIter = IntoIter;
539 fn into_iter(self) -> Self::IntoIter {
540 IntoIter {
541 vec: self,
542 index: 0,
543 }
544 }
545 }
546}
547
548#[cfg(feature = "unstable")]
549mod iter {
550 use alloc::alloc::Global;
551 use core::alloc::Allocator;
552 use super::BitVec;
553
554 #[derive(Clone)]
556 pub struct Iter<'a, A: Allocator = Global>
557 {
558 vec: &'a BitVec<A>,
559 index: usize,
560 }
561
562 pub struct IntoIter<A: Allocator = Global>
564 {
565 vec: BitVec<A>,
566 index: usize,
567 }
568
569 impl<'a, A: Allocator> Iterator for Iter<'a, A> {
570 impl_iter!();
571 }
572
573 impl<A: Allocator> Iterator for IntoIter<A> {
574 impl_iter!();
575 }
576
577 impl<'a, A: Allocator> IntoIterator for &'a BitVec<A> {
578 type Item = bool;
579 type IntoIter = Iter<'a, A>;
580 fn into_iter(self) -> Self::IntoIter {
581 Iter::<A> {
582 vec: self,
583 index: 0,
584 }
585 }
586 }
587
588 impl<A: Allocator> IntoIterator for BitVec<A> {
589 type Item = bool;
590 type IntoIter = IntoIter<A>;
591 fn into_iter(self) -> Self::IntoIter {
592 IntoIter::<A> {
593 vec: self,
594 index: 0,
595 }
596 }
597 }
598}
599
600static TRUE: bool = true;
604static FALSE: bool = false;
605
606#[cfg(not(feature = "unstable"))]
607impl core::ops::Index<usize> for BitVec {
608 type Output = bool;
609
610 fn index(&self, index: usize) -> &Self::Output {
611 assert!(index < self.len());
612 let value = unsafe { self.get_unchecked(index) };
613 if value { &TRUE } else { &FALSE }
614 }
615}
616
617#[cfg(feature = "unstable")]
618impl<A: Allocator> core::ops::Index<usize> for BitVec<A> {
619 type Output = bool;
620
621 fn index(&self, index: usize) -> &Self::Output {
622 assert!(index < self.len());
623 let value = unsafe { self.get_unchecked(index) };
624 if value { &TRUE } else { &FALSE }
625 }
626}
627#[cfg(test)]
630mod test {
631 use super::BitVec;
632 use alloc::{vec::Vec, vec, format};
633
634 #[test]
635 fn test_index() {
636 let vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
637 assert_eq!(vec[0], true);
638 assert_eq!(vec[4], false);
639 assert_eq!(vec[15], true);
640 }
641
642 #[test]
643 fn test_constructors_for_empty() {
644 let vec = BitVec::new();
645 assert_eq!(vec.len(), 0);
646 assert_eq!(vec.capacity(), 0);
647 assert_eq!(vec.as_bytes(), &[]);
648
649 let vec = BitVec::with_capacity(0);
650 assert_eq!(vec.len(), 0);
651 assert_eq!(vec.capacity(), 0);
652 assert_eq!(vec.as_bytes(), &[]);
653
654 let vec = BitVec::with_capacity(1);
655 assert_eq!(vec.len(), 0);
656 assert_eq!(vec.capacity(), 8);
657 assert_eq!(vec.as_bytes(), &[]);
658
659 let vec = BitVec::with_capacity(8);
660 assert_eq!(vec.len(), 0);
661 assert_eq!(vec.capacity(), 8);
662 assert_eq!(vec.as_bytes(), &[]);
663
664 let vec = BitVec::with_capacity(9);
665 assert_eq!(vec.len(), 0);
666 assert_eq!(vec.capacity(), 16);
667 assert_eq!(vec.as_bytes(), &[]);
668 }
669
670 #[test]
671 fn test_convert_to_bools() {
672 let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
673 let vec: BitVec = BitVec::from_bools(from);
674 let bools: Vec<bool> = (&vec).iter().collect();
675 assert_eq!(bools, from);
676 let bools: Vec<bool> = vec.iter().collect();
677 assert_eq!(bools, from);
678 }
679
680 #[test]
681 fn test_convert_from_bools() {
682 use core::iter::FromIterator;
683
684 let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
685 let vec: BitVec = BitVec::from_bools(from);
686 assert_eq!(vec.len(), 11);
687 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
688
689 let vec: BitVec = from.into();
690 assert_eq!(vec.len(), 11);
691 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
692
693 let from = &vec![true, false, false, true, true, false, false, true, true, true, false];
694 let vec: BitVec = from.into();
695 assert_eq!(vec.len(), 11);
696 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
697 let vec = BitVec::from_iter(from);
698 assert_eq!(vec.len(), 11);
699 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
700
701 let from = vec![true, false, false, true, true, false, false, true, true, true, false];
702 let vec: BitVec = from.clone().into();
703 assert_eq!(vec.len(), 11);
704 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
705 let vec = BitVec::from_iter(from);
706 assert_eq!(vec.len(), 11);
707 assert_eq!(vec.as_bytes(), &[0x99, 0x03]);
708 }
709
710 #[test]
711 fn test_constructors_from_bytes() {
712 let vec = BitVec::from_bytes(&[0xab, 0xcd]);
713 assert_eq!(vec.len(), 16);
714 assert_eq!(vec.as_bytes(), &[0xab, 0xcd]);
715
716 let vec = BitVec::from_elem(4, true);
717 assert_eq!(vec.len(), 4);
718 assert_eq!(vec.as_bytes(), &[0x0f]);
719
720 let vec = BitVec::from_elem(31, true);
721 assert_eq!(vec.len(), 31);
722 assert_eq!(vec.as_bytes(), &[0xff, 0xff, 0xff, 0x7f]);
723
724 let vec = BitVec::from_elem(4, false);
725 assert_eq!(vec.len(), 4);
726 assert_eq!(vec.as_bytes(), &[0]);
727
728 let vec = BitVec::from_elem(31, false);
729 assert_eq!(vec.len(), 31);
730 assert_eq!(vec.as_bytes(), &[0, 0, 0, 0]);
731 }
732
733 #[test]
734 fn test_with_bytes_mut() {
735 let mut vec = BitVec::from_elem(28, false);
736 assert_eq!(vec.len(), 28);
737 assert_eq!(vec.as_bytes(), &[0, 0, 0, 0]);
738
739 vec.with_bytes_mut(|slice| {
741 assert_eq!(slice.len(), 4);
742 for i in 0..4 { slice[i] = 0xff; }
743 });
744 assert_eq!(vec.as_bytes(), &[0xff, 0xff, 0xff, 0x0f]);
746 }
747
748 #[test]
749 fn test_into_bytes() {
750 let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0xe3]);
751 vec.pop(); vec.pop();
752 assert_eq!(vec.len(), 54);
753 let vec = vec.into_bytes();
754 assert_eq!(vec, &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23]);
755 }
756
757 #[test]
758 fn test_get_set_index() {
759 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
760 assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
761 assert_eq!(Some(true), vec.get(8));
762 assert_eq!(true, vec[8]);
763
764 vec.set(8, true);
765 assert_eq!(Some(true), vec.get(8));
766 assert_eq!(true, vec[8]);
767 assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
768
769 vec.set(8, false);
770 assert_eq!(Some(false), vec.get(8));
771 assert_eq!(false, vec[8]);
772 assert_eq!(vec.as_bytes(), &[0xef, 0xa4, 0x71]);
773
774 vec.set(7, false);
775 assert_eq!(Some(false), vec.get(7));
776 assert_eq!(false, vec[7]);
777 assert_eq!(vec.as_bytes(), &[0x6f, 0xa4, 0x71]);
778
779 assert_eq!(None, vec.get(vec.len()));
780 }
781
782 #[test]
783 fn test_pop_to_empty() {
784 let mut vec = BitVec::new();
785 assert_eq!(vec.pop(), None);
786 assert_eq!(vec.pop(), None);
787
788 let mut vec = BitVec::from_bytes(&[0b01111111]);
789 assert_eq!(vec.pop(), Some(false));
790 assert_eq!(vec.len(), 7);
791 for _ in 0..7 {
792 assert_eq!(vec.pop(), Some(true));
793 }
794 assert_eq!(vec.len(), 0);
795 assert_eq!(vec.pop(), None);
796 assert_eq!(vec.pop(), None);
797 assert_eq!(vec.len(), 0);
798 }
799
800 #[test]
801 fn test_pop_push() {
802 let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b11100011]);
803 assert_eq!(vec.len(), 56);
804
805 assert_eq!(vec.pop(), Some(true));
807 assert_eq!(vec.pop(), Some(true));
808 assert_eq!(vec.len(), 54);
809 assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b00100011]);
810
811 assert_eq!(vec.pop(), Some(true));
813 assert_eq!(vec.pop(), Some(false));
814 assert_eq!(vec.pop(), Some(false));
815 assert_eq!(vec.pop(), Some(false));
816 assert_eq!(vec.pop(), Some(true));
817 assert_eq!(vec.pop(), Some(true));
818 assert_eq!(vec.len(), 48);
819 assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45]);
820
821 for _ in 0..4 {
823 vec.push(true);
824 vec.push(false);
825 }
826 assert_eq!(vec.len(), 56);
827 assert_eq!(vec.as_bytes(), &[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0b01010101]);
828 }
829
830 #[test]
831 fn test_clear() {
832 let mut vec = BitVec::from_bytes(&[0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0xe3]);
833 assert_eq!(vec.len(), 56);
834 vec.clear();
835 assert_eq!(vec.len(), 0);
836 assert_eq!(vec.as_bytes(), &[]);
837 }
838
839 fn assert_iter_eq<I: IntoIterator<Item=bool>>(vec: I, expected: &Vec<bool>) {
840 let actual: Vec<bool> = vec.into_iter().collect();
841 assert_eq!(&actual, expected);
842 }
843
844 #[test]
845 fn test_iter() {
846 let l = true;
847 let o = false;
848
849 assert_iter_eq(&BitVec::new(), &Vec::new());
850
851 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
852 assert_iter_eq(&vec, &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l,l,o]);
854 vec.pop(); vec.pop();
855
856 assert_iter_eq(&vec, &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l]);
858 }
859
860 #[test]
861 fn test_into_iter() {
862 let l = true;
863 let o = false;
864
865 assert_iter_eq(&BitVec::new(), &Vec::new());
866
867 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
868 assert_iter_eq(vec.clone(), &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l,l,o]);
870 vec.pop(); vec.pop();
871
872 assert_iter_eq(vec.clone(), &vec![l,l,l,l,o,l,l,l, l,o,l,o,o,l,o,l, l,o,o,o,l,l]);
874 }
875
876 #[test]
877 #[should_panic(expected = "out of bounds")]
878 fn test_set_validation() {
879 let _ = &BitVec::from_bytes(&[0xef, 0xa5, 0x71]).set(24, true);
880 }
881
882 #[test]
883 fn test_eq() {
884 let vec1 = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
885 let mut vec2 = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
886 assert!(vec1 == vec2);
887 vec2.push(true);
888 assert!(vec1 != vec2);
889 vec2.pop();
890 assert!(vec1 == vec2);
891 vec2.set(3, false);
892 assert!(vec1 != vec2);
893 }
894
895 #[test]
896 fn test_clone() {
897 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
898 assert_eq!(vec, vec.clone());
899 vec.pop(); vec.pop();
900 assert_eq!(vec, vec.clone());
901 }
902
903 #[test]
904 fn test_debug() {
905 assert_eq!(
906 format!("{:?}", &BitVec::from_bytes(&[0xef, 0xa5, 0x71])),
907 "BitVec{24: 1111.111 1.1..1.1 1...111.}"
908 )
909 }
910
911 #[test]
912 fn test_swap() {
913 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
914 vec.swap(0, 23);
915 assert_eq!(vec.len(), 24);
916 assert_eq!(vec.as_bytes(), &[0xee, 0xa5, 0xf1]);
917 vec.swap(0, 5);
918 assert_eq!(vec.len(), 24);
919 assert_eq!(vec.as_bytes(), &[0xcf, 0xa5, 0xf1]);
920 }
921
922 #[test]
923 fn test_capacity_reserve() {
924 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
925 assert_eq!(vec.len(), 24);
926 assert!(vec.capacity() >= vec.len());
927 let new_capacity = 2 * vec.capacity();
928 vec.reserve(new_capacity);
929 assert!(vec.capacity() >= new_capacity);
930 }
931
932 #[test]
933 fn test_truncate_extend() {
934 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
935
936 vec.truncate(25);
937 assert_eq!(vec.len(), 24);
938 assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
939
940 vec.truncate(12);
941 assert_eq!(vec.len(), 12);
942 assert_eq!(vec.as_bytes(), &[0xef, 0x05]);
943
944 vec.extend(core::iter::repeat(true).take(5));
945 assert_eq!(vec.len(), 17);
946 assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x01]);
947
948 vec.extend(core::iter::repeat(&true).take(6));
949 assert_eq!(vec.len(), 23);
950 assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x7f]);
951 }
952
953 #[test]
954 fn test_resize() {
955 let mut vec = BitVec::from_bytes(&[0xef, 0xa5, 0x71]);
956
957 vec.resize(24, true);
958 assert_eq!(vec.len(), 24);
959 assert_eq!(vec.as_bytes(), &[0xef, 0xa5, 0x71]);
960
961 vec.resize(12, true);
962 assert_eq!(vec.len(), 12);
963 assert_eq!(vec.as_bytes(), &[0xef, 0x05]);
964
965 vec.resize(17, true);
966 assert_eq!(vec.len(), 17);
967 assert_eq!(vec.as_bytes(), &[0xef, 0xf5, 0x01]);
968 }
969
970 #[test]
971 fn test_iter_overrides() {
972 let from: &[bool] = &[true, false, false, true, true, false, false, true, true, true, false];
973 let vec = BitVec::from_bools(from);
974 assert_eq!(vec.len(), 11);
975 assert_eq!(vec.iter().size_hint(), (11, Some(11)));
976 assert_eq!(vec.iter().count(), 11);
977 assert_eq!(vec.iter().last(), Some(false));
978
979 for (index, &b) in from.iter().enumerate() {
981 assert_eq!(vec.iter().nth(index), Some(b));
982 }
983 assert_eq!(vec.iter().nth(11), None);
984
985 let mut iter = vec.iter();
987 for (index, &b) in from.iter().enumerate() {
988 assert_eq!(iter.size_hint(), (11 - index, Some(11 - index)));
989 assert_eq!(iter.clone().count(), 11 - index);
990 assert_eq!(iter.clone().last(), Some(false));
991 assert_eq!(iter.nth(0), Some(b));
992 }
993 assert_eq!(iter.size_hint(), (0, Some(0)));
994 assert_eq!(iter.clone().count(), 0);
995 assert_eq!(iter.clone().last(), None);
996 assert_eq!(iter.nth(0), None);
997 }
998
999 #[cfg(feature = "unstable")]
1000 #[test]
1001 fn test_custom_allocator() {
1002 use alloc::alloc::Global;
1003
1004 let mut vec = Vec::new_in(Global);
1005 vec.push(false);
1006 vec.push(true);
1007 assert_eq!(vec[1], true);
1008 }
1009}