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