1#![no_std]
30
31extern crate alloc;
32
33pub use self::iter::{IntoIter, Iter};
34pub use self::primitive::{Bit, Byte};
35
36use self::primitive::Word;
37use alloc::vec::Vec;
38use core::fmt;
39use core::hash::{Hash, Hasher};
40use core::ops::Index;
41
42mod bitwise;
43mod convert;
44mod iter;
45mod macros;
46mod primitive;
47
48#[cfg(feature = "serde")]
49mod serde;
50
51#[derive(Default)]
53pub struct BitVec {
54 len: usize,
56 buf: Vec<Word>,
57}
58
59impl BitVec {
60 #[inline]
71 pub const fn capacity(&self) -> usize {
72 self.buf.capacity().saturating_mul(Word::BITS)
73 }
74
75 #[inline]
85 pub const fn len(&self) -> usize {
86 self.len
87 }
88
89 #[inline]
103 pub const fn is_empty(&self) -> bool {
104 self.len == 0
105 }
106
107 const fn buf_used(&self) -> usize {
112 self.len.div_ceil(Word::BITS)
113 }
114}
115
116impl BitVec {
117 #[inline]
129 pub const fn new() -> Self {
130 let len = 0;
131 let buf = Vec::new();
132 Self { len, buf }
133 }
134
135 #[inline]
151 pub fn with_capacity(capacity: usize) -> Self {
152 let len = 0;
153 let buf_capacity = capacity.div_ceil(Word::BITS);
154 let buf = Vec::with_capacity(buf_capacity);
155 Self { len, buf }
156 }
157}
158
159impl BitVec {
160 pub fn reserve(&mut self, additional: usize) -> &mut Self {
176 let capacity = self.len.checked_add(additional).expect("capacity overflow");
177 let buf_capacity = capacity.div_ceil(Word::BITS);
178 if let Some(buf_additional) = buf_capacity.checked_sub(self.buf.len()) {
179 self.buf.reserve(buf_additional);
180 };
181 self
182 }
183
184 pub fn shrink_to_fit(&mut self) -> &mut Self {
202 let buf_new_len = self.buf_used();
203 unsafe {
204 self.buf.set_len(buf_new_len);
205 }
206 self.buf.shrink_to_fit();
207 self
208 }
209
210 pub fn shrink_to(&mut self, min_capacity: usize) -> &mut Self {
237 let buf_min_capacity = min_capacity.div_ceil(Word::BITS);
238 if buf_min_capacity < self.buf.len() {
239 let buf_new_len = self.buf_used().max(buf_min_capacity);
240 unsafe {
241 self.buf.set_len(buf_new_len);
242 }
243 self.buf.shrink_to_fit();
244 } else if buf_min_capacity < self.buf.capacity() {
245 self.buf.shrink_to(buf_min_capacity);
246 }
247 self
248 }
249
250 #[inline]
262 pub fn get(&self, index: usize) -> Option<Bit> {
263 if index >= self.len {
264 None
265 } else {
266 Some(unsafe { self.get_unchecked(index) })
267 }
268 }
269
270 #[inline]
288 pub unsafe fn get_unchecked(&self, index: usize) -> Bit {
289 let loc = Loc::new(index);
290 let word = unsafe { self.buf.get_unchecked(loc.period) };
291 word.get(loc.offset)
292 }
293
294 #[inline]
308 #[must_use]
309 pub fn set(&mut self, index: usize, value: Bit) -> Option<&mut Self> {
310 if index >= self.len {
311 None
312 } else {
313 Some(unsafe { self.set_unchecked(index, value) })
314 }
315 }
316
317 #[inline]
339 pub unsafe fn set_unchecked(&mut self, index: usize, value: Bit) -> &mut Self {
340 let loc = Loc::new(index);
341 let word = unsafe { self.buf.get_unchecked_mut(loc.period) };
342 word.set(loc.offset, value);
343 self
344 }
345
346 pub fn push(&mut self, value: Bit) -> &mut Self {
362 if self.len == usize::MAX {
363 panic!("capacity overflow")
364 }
365 let loc = Loc::new(self.len);
366 if loc.period < self.buf.len() {
367 let word = unsafe { self.buf.get_unchecked_mut(loc.period) };
368 word.set(loc.offset, value);
369 } else if value {
370 self.buf.push(Word::MSB_SET);
371 } else {
372 self.buf.push(Word::MSB_CLEAR);
373 }
374 self.len += 1;
375 self
376 }
377
378 pub fn pop(&mut self) -> Option<Bit> {
394 if self.is_empty() {
395 return None;
396 }
397 self.len -= 1;
398 let loc = Loc::new(self.len);
399 let word = unsafe { self.buf.get_unchecked(loc.period) };
400 let value = word.get(loc.offset);
401 Some(value)
402 }
403}
404
405impl Index<usize> for BitVec {
406 type Output = Bit;
407
408 #[inline]
409 fn index(&self, index: usize) -> &Self::Output {
410 match self.get(index) {
411 None => panic!("index out of bounds"),
412 Some(false) => &false,
413 Some(true) => &true,
414 }
415 }
416}
417
418impl Clone for BitVec {
419 fn clone(&self) -> Self {
420 let len = self.len;
421 let buf_len = self.buf_used();
422 let buf = unsafe { self.buf.get_unchecked(0..buf_len).to_vec() };
423 Self { len, buf }
424 }
425}
426
427impl fmt::Debug for BitVec {
428 #[inline]
429 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
430 f.debug_list().entries(self.iter()).finish()
431 }
432}
433
434impl Extend<Bit> for BitVec {
435 fn extend<I>(&mut self, iter: I)
436 where
437 I: IntoIterator<Item = Bit>,
438 {
439 let iter = iter.into_iter();
440 let additional = iter.size_hint().0;
441 self.reserve(additional);
442 for value in iter {
443 self.push(value);
444 }
445 }
446}
447
448impl Hash for BitVec {
449 fn hash<H>(&self, state: &mut H)
450 where
451 H: Hasher,
452 {
453 if self.is_empty() {
454 return;
455 }
456
457 self.len.hash(state);
458
459 let last = self.len - 1;
460 let loc = Loc::new(last);
461
462 let head = unsafe { self.buf.get_unchecked(..loc.period) };
463 head.hash(state);
464
465 let tail = unsafe { self.buf.get_unchecked(loc.period) };
466 tail.align_last_to_lsb(loc.offset).hash(state);
467 }
468}
469
470impl PartialEq for BitVec {
471 fn eq(&self, other: &Self) -> bool {
472 if self.len != other.len {
473 return false;
474 }
475
476 if self.is_empty() {
477 return true;
478 }
479
480 let last = self.len - 1;
481 let loc = Loc::new(last);
482
483 let lhs_head = unsafe { self.buf.get_unchecked(..loc.period) };
484 let rhs_head = unsafe { other.buf.get_unchecked(..loc.period) };
485 if lhs_head != rhs_head {
486 return false;
487 }
488
489 let lhs_tail = unsafe { self.buf.get_unchecked(loc.period) };
490 let rhs_tail = unsafe { other.buf.get_unchecked(loc.period) };
491 (*lhs_tail ^ *rhs_tail).align_last_to_lsb(loc.offset) == Word::CLEAR
492 }
493}
494
495impl Eq for BitVec {}
496
497#[derive(Debug)]
498struct Loc {
499 period: usize,
500 offset: usize,
501}
502
503impl Loc {
504 const fn new(index: usize) -> Self {
505 let period = index / Word::BITS;
506 let offset = index % Word::BITS;
507 Self { period, offset }
508 }
509}
510
511#[cfg(test)]
512impl BitVec {
513 fn push_unused_word(&mut self) {
514 self.buf.push(Word::CLEAR);
515 }
516}
517
518#[cfg(test)]
519mod tests {
520 extern crate std;
521
522 use super::*;
523 use core::iter::repeat_n;
524 use std::hash::DefaultHasher;
525
526 #[test]
527 fn test_capacity() {
528 let vec = BitVec::with_capacity(0);
529 assert_eq!(vec.capacity(), 0);
530
531 let vec = BitVec::with_capacity(10);
532 assert!(vec.capacity() >= Word::BITS);
533
534 let vec = BitVec::with_capacity(Word::BITS + 1);
535 assert!(vec.capacity() >= Word::BITS * 2);
536 }
537
538 #[test]
539 fn test_len() {
540 let vec = bitvec![];
541 assert_eq!(vec.len(), 0);
542
543 let vec = bitvec![true, true, false, false];
544 assert_eq!(vec.len(), 4);
545 }
546
547 #[test]
548 fn test_is_empty() {
549 let vec = bitvec![];
550 assert!(vec.is_empty());
551
552 let vec = bitvec![true, true, false, false];
553 assert!(!vec.is_empty());
554 }
555
556 #[test]
557 fn test_new() {
558 let vec = BitVec::new();
559 assert_eq!(vec.len, 0);
560 assert_eq!(vec.buf, Vec::new());
561 }
562
563 #[test]
564 fn test_with_capacity() {
565 let vec = BitVec::with_capacity(0);
566 assert_eq!(vec.len, 0);
567 assert_eq!(vec.capacity(), 0);
568 assert_eq!(vec.buf.capacity(), 0);
569
570 let vec = BitVec::with_capacity(10);
571 assert_eq!(vec.len, 0);
572 assert!(vec.capacity() >= Word::BITS);
573 assert!(vec.buf.capacity() >= 1);
574
575 let vec = BitVec::with_capacity(Word::BITS + 1);
576 assert_eq!(vec.len, 0);
577 assert!(vec.capacity() >= Word::BITS * 2);
578 assert!(vec.buf.capacity() >= 2);
579 }
580
581 #[test]
582 fn test_reserve() {
583 let mut vec = bitvec![true, true, false, false];
584
585 vec.reserve(6);
586 assert!(vec.capacity() >= Word::BITS);
587
588 vec.reserve(Word::BITS - vec.len);
589 assert!(vec.capacity() >= Word::BITS);
590
591 vec.reserve(Word::BITS);
592 assert!(vec.capacity() >= Word::BITS * 2);
593 }
594
595 #[test]
596 fn test_shrink_to_fit() {
597 let mut vec = bitvec![true, true, false, false];
598 let unchanged = vec.clone();
599
600 vec.reserve(Word::BITS);
601 assert!(vec.capacity() >= Word::BITS * 2);
602
603 vec.shrink_to_fit();
604 assert!(vec.capacity() >= Word::BITS);
605 assert_eq!(vec, unchanged);
606
607 assert_eq!(vec.buf.len(), 1);
608 vec.push_unused_word();
609 assert_eq!(vec.buf.len(), 2);
610
611 vec.reserve(Word::BITS);
612 assert!(vec.capacity() >= Word::BITS * 2);
613
614 vec.shrink_to_fit();
615 assert!(vec.capacity() >= Word::BITS);
616 assert_eq!(vec, unchanged);
617 assert_eq!(vec.buf.len(), 1);
618 }
619
620 #[test]
621 fn test_shrink_to() {
622 let mut vec = bitvec![true, true, false, false];
623 let unchanged = vec.clone();
624
625 vec.reserve(Word::BITS * 2);
626 assert!(vec.capacity() >= Word::BITS * 3);
627
628 let capacity_unchanged = vec.capacity();
629 vec.shrink_to(capacity_unchanged + 1);
630 assert_eq!(vec.capacity(), capacity_unchanged);
631 assert_eq!(vec, unchanged);
632
633 vec.shrink_to(Word::BITS * 2);
634 assert!(vec.capacity() >= Word::BITS * 2);
635 assert_eq!(vec, unchanged);
636
637 vec.shrink_to(0);
638 assert!(vec.capacity() >= Word::BITS);
639 assert_eq!(vec, unchanged);
640
641 assert_eq!(vec.buf.len(), 1);
642 vec.push_unused_word();
643 assert_eq!(vec.buf.len(), 2);
644
645 vec.reserve(Word::BITS * 2);
646 assert!(vec.capacity() >= Word::BITS * 3);
647
648 let capacity_unchanged = vec.capacity();
649 vec.shrink_to(capacity_unchanged + 1);
650 assert_eq!(vec.capacity(), capacity_unchanged);
651 assert_eq!(vec, unchanged);
652 assert_eq!(vec.buf.len(), 2);
653
654 vec.shrink_to(Word::BITS * 2);
655 assert!(vec.capacity() >= Word::BITS * 2);
656 assert_eq!(vec, unchanged);
657 assert_eq!(vec.buf.len(), 2);
658
659 vec.shrink_to(0);
660 assert!(vec.capacity() >= Word::BITS);
661 assert_eq!(vec, unchanged);
662 assert_eq!(vec.buf.len(), 1);
663 }
664
665 #[test]
666 fn test_get() {
667 {
668 let mut vec = bitvec![true, true, false, false];
669
670 assert_eq!(vec.get(0), Some(true));
671 assert_eq!(vec.get(1), Some(true));
672 assert_eq!(vec.get(2), Some(false));
673 assert_eq!(vec.get(3), Some(false));
674 assert_eq!(vec.get(4), None);
675
676 vec.push_unused_word();
677
678 assert_eq!(vec.get(0), Some(true));
679 assert_eq!(vec.get(1), Some(true));
680 assert_eq!(vec.get(2), Some(false));
681 assert_eq!(vec.get(3), Some(false));
682 assert_eq!(vec.get(4), None);
683 }
684
685 {
686 let mut vec = bitvec![true; Word::BITS];
687
688 assert_eq!(vec.get(Word::BITS - 1), Some(true));
689 assert_eq!(vec.get(Word::BITS), None);
690
691 vec.push_unused_word();
692
693 assert_eq!(vec.get(Word::BITS - 1), Some(true));
694 assert_eq!(vec.get(Word::BITS), None);
695 }
696
697 {
698 let mut vec = bitvec![true; Word::BITS + 1];
699
700 assert_eq!(vec.get(Word::BITS), Some(true));
701 assert_eq!(vec.get(Word::BITS + 1), None);
702
703 vec.push_unused_word();
704
705 assert_eq!(vec.get(Word::BITS), Some(true));
706 assert_eq!(vec.get(Word::BITS + 1), None);
707 }
708 }
709
710 #[test]
711 fn test_get_unchecked() {
712 let mut vec = bitvec![true, true, false, false];
713
714 unsafe {
715 assert!(vec.get_unchecked(0));
716 assert!(vec.get_unchecked(1));
717 assert!(!vec.get_unchecked(2));
718 assert!(!vec.get_unchecked(3));
719 }
720
721 vec.push_unused_word();
722
723 unsafe {
724 assert!(vec.get_unchecked(0));
725 assert!(vec.get_unchecked(1));
726 assert!(!vec.get_unchecked(2));
727 assert!(!vec.get_unchecked(3));
728 }
729 }
730
731 #[test]
732 fn test_set() {
733 {
734 let mut vec = bitvec![true, true, false, false];
735 let unchanged = vec.clone();
736
737 assert!(vec.set(0, true).is_some());
738 assert!(vec.set(1, false).is_some());
739 assert!(vec.set(2, true).is_some());
740 assert!(vec.set(3, false).is_some());
741 assert!(vec.set(4, true).is_none());
742 assert_eq!(vec, bitvec![true, false, true, false]);
743
744 let mut vec = unchanged;
745 vec.push_unused_word();
746
747 assert!(vec.set(0, true).is_some());
748 assert!(vec.set(1, false).is_some());
749 assert!(vec.set(2, true).is_some());
750 assert!(vec.set(3, false).is_some());
751 assert!(vec.set(4, true).is_none());
752 assert_eq!(vec, bitvec![true, false, true, false]);
753 }
754
755 {
756 let mut vec = bitvec![true; Word::BITS];
757 let unchanged = vec.clone();
758
759 assert!(vec.set(Word::BITS - 1, false).is_some());
760 assert_eq!(vec.get(Word::BITS - 1), Some(false));
761 assert!(vec.set(Word::BITS, false).is_none());
762
763 let mut vec = unchanged;
764 vec.push_unused_word();
765
766 assert!(vec.set(Word::BITS - 1, false).is_some());
767 assert_eq!(vec.get(Word::BITS - 1), Some(false));
768 assert!(vec.set(Word::BITS, false).is_none());
769 }
770
771 {
772 let mut vec = bitvec![true; Word::BITS + 1];
773 let unchanged = vec.clone();
774
775 assert!(vec.set(Word::BITS, false).is_some());
776 assert_eq!(vec.get(Word::BITS), Some(false));
777 assert!(vec.set(Word::BITS + 1, false).is_none());
778
779 let mut vec = unchanged;
780 vec.push_unused_word();
781
782 assert!(vec.set(Word::BITS, false).is_some());
783 assert_eq!(vec.get(Word::BITS), Some(false));
784 assert!(vec.set(Word::BITS + 1, false).is_none());
785 }
786 }
787
788 #[test]
789 fn test_set_unchecked() {
790 let mut vec = bitvec![true, true, false, false];
791 let unchanged = vec.clone();
792
793 unsafe {
794 vec.set_unchecked(2, true);
795 vec.set_unchecked(3, true);
796 }
797 assert_eq!(vec, bitvec![true; 4]);
798
799 let mut vec = unchanged;
800 vec.push_unused_word();
801
802 unsafe {
803 vec.set_unchecked(2, true);
804 vec.set_unchecked(3, true);
805 }
806 assert_eq!(vec, bitvec![true; 4]);
807 }
808
809 #[test]
810 fn test_push() {
811 {
812 let mut vec = bitvec![true, true, false, false];
813 let unchanged = vec.clone();
814
815 vec.push(true);
816 assert_eq!(vec, bitvec![true, true, false, false, true]);
817 vec.push(false);
818 assert_eq!(vec, bitvec![true, true, false, false, true, false]);
819
820 let mut vec = unchanged;
821 vec.push_unused_word();
822
823 vec.push(true);
824 assert_eq!(vec, bitvec![true, true, false, false, true]);
825 vec.push(false);
826 assert_eq!(vec, bitvec![true, true, false, false, true, false]);
827 }
828
829 {
830 let mut vec = bitvec![true; Word::BITS];
831 let unchanged = vec.clone();
832
833 assert_eq!(vec.buf.len(), 1);
834 vec.push(true);
835 assert_eq!(vec.len, Word::BITS + 1);
836 assert_eq!(vec.get(vec.len - 1), Some(true));
837 assert_eq!(vec.buf.len(), 2);
838 vec.push(false);
839 assert_eq!(vec.len, Word::BITS + 2);
840 assert_eq!(vec.get(vec.len - 1), Some(false));
841 assert_eq!(vec.buf.len(), 2);
842
843 let mut vec = unchanged;
844 vec.push_unused_word();
845
846 assert_eq!(vec.buf.len(), 2);
847 vec.push(true);
848 assert_eq!(vec.len, Word::BITS + 1);
849 assert_eq!(vec.get(vec.len - 1), Some(true));
850 assert_eq!(vec.buf.len(), 2);
851 vec.push(false);
852 assert_eq!(vec.len, Word::BITS + 2);
853 assert_eq!(vec.get(vec.len - 1), Some(false));
854 assert_eq!(vec.buf.len(), 2);
855 }
856 }
857
858 #[test]
859 fn test_pop() {
860 {
861 let mut vec = bitvec![true, true, false, false];
862 let unchanged = vec.clone();
863
864 assert_eq!(vec.pop(), Some(false));
865 assert_eq!(vec, bitvec![true, true, false]);
866 assert_eq!(vec.pop(), Some(false));
867 assert_eq!(vec, bitvec![true, true]);
868 assert_eq!(vec.pop(), Some(true));
869 assert_eq!(vec, bitvec![true]);
870 assert_eq!(vec.pop(), Some(true));
871 assert_eq!(vec, bitvec![]);
872 assert_eq!(vec.pop(), None);
873 assert_eq!(vec, bitvec![]);
874
875 let mut vec = unchanged;
876 vec.push_unused_word();
877
878 assert_eq!(vec.pop(), Some(false));
879 assert_eq!(vec, bitvec![true, true, false]);
880 assert_eq!(vec.pop(), Some(false));
881 assert_eq!(vec, bitvec![true, true]);
882 assert_eq!(vec.pop(), Some(true));
883 assert_eq!(vec, bitvec![true]);
884 assert_eq!(vec.pop(), Some(true));
885 assert_eq!(vec, bitvec![]);
886 assert_eq!(vec.pop(), None);
887 assert_eq!(vec, bitvec![]);
888 }
889
890 {
891 let mut vec = bitvec![true; Word::BITS + 1];
892 let unchanged = vec.clone();
893
894 assert_eq!(vec.buf.len(), 2);
895 while vec.pop().is_some() {}
896 assert_eq!(vec.len, 0);
897 assert_eq!(vec.buf.len(), 2);
898
899 let mut vec = unchanged;
900 vec.push_unused_word();
901
902 assert_eq!(vec.buf.len(), 3);
903 while vec.pop().is_some() {}
904 assert_eq!(vec.len, 0);
905 assert_eq!(vec.buf.len(), 3);
906 }
907 }
908
909 #[test]
910 fn test_index() {
911 let mut vec = bitvec![true, true, false, false];
912
913 assert!(vec[0]);
914 assert!(vec[1]);
915 assert!(!vec[2]);
916 assert!(!vec[3]);
917
918 vec.push_unused_word();
919
920 assert!(vec[0]);
921 assert!(vec[1]);
922 assert!(!vec[2]);
923 assert!(!vec[3]);
924 }
925
926 #[test]
927 #[should_panic]
928 fn test_index_fails() {
929 let vec = bitvec![true, true, false, false];
930
931 let _ = vec[4];
932 }
933
934 #[test]
935 fn test_clone() {
936 let mut vec = bitvec![true, true, false, false];
937
938 let cloned = vec.clone();
939 assert_eq!(vec, cloned);
940
941 vec.push_unused_word();
942
943 let cloned = vec.clone();
944 assert_eq!(vec, cloned);
945 assert_eq!(vec.buf.len(), 2);
946 assert_eq!(cloned.buf.len(), 1);
947 }
948
949 #[test]
950 fn test_extend() {
951 let mut vec = bitvec![true, true, false, false];
952 let unchanged = vec.clone();
953
954 vec.extend([true; Word::BITS]);
955 assert_eq!(vec.len, Word::BITS + 4);
956 assert_eq!(vec.get(0), Some(true));
957 assert_eq!(vec.get(1), Some(true));
958 assert_eq!(vec.get(2), Some(false));
959 assert_eq!(vec.get(3), Some(false));
960 for index in 4..vec.len {
961 assert_eq!(vec.get(index), Some(true));
962 }
963
964 let mut vec = unchanged;
965 vec.push_unused_word();
966
967 vec.extend([true; Word::BITS]);
968 assert_eq!(vec.len, Word::BITS + 4);
969 assert_eq!(vec.get(0), Some(true));
970 assert_eq!(vec.get(1), Some(true));
971 assert_eq!(vec.get(2), Some(false));
972 assert_eq!(vec.get(3), Some(false));
973 for index in 4..vec.len {
974 assert_eq!(vec.get(index), Some(true));
975 }
976 }
977
978 #[test]
979 #[should_panic]
980 fn test_extend_fail() {
981 let mut vec = bitvec![true, true, false, false];
982
983 vec.extend(repeat_n(true, usize::MAX));
984 }
985
986 #[test]
987 fn test_hash() {
988 fn hash(vec: &BitVec) -> u64 {
989 let mut hasher = DefaultHasher::new();
990 vec.hash(&mut hasher);
991 hasher.finish()
992 }
993
994 {
995 let lhs = bitvec![true, true, false, false];
996 let rhs = bitvec![true; 4];
997 let unchanged = rhs.clone();
998
999 let lhs_hash = hash(&lhs);
1000 let rhs_hash = hash(&rhs);
1001 assert_ne!(lhs_hash, rhs_hash);
1002
1003 let mut rhs = unchanged;
1004 rhs.push_unused_word();
1005
1006 let lhs_hash = hash(&lhs);
1007 let rhs_hash = hash(&rhs);
1008 assert_ne!(lhs_hash, rhs_hash);
1009 }
1010
1011 {
1012 let lhs = bitvec![true, true, false, false];
1013 let mut rhs = bitvec![true, true, false, false, true];
1014 let unchanged = rhs.clone();
1015
1016 let lhs_hash = hash(&lhs);
1017 let rhs_hash = hash(&rhs);
1018 assert_ne!(lhs_hash, rhs_hash);
1019 rhs.pop();
1020 let rhs_hash = hash(&rhs);
1021 assert_eq!(lhs_hash, rhs_hash);
1022
1023 let mut rhs = unchanged;
1024 rhs.push_unused_word();
1025
1026 let lhs_hash = hash(&lhs);
1027 let rhs_hash = hash(&rhs);
1028 assert_ne!(lhs_hash, rhs_hash);
1029 rhs.pop();
1030 let rhs_hash = hash(&rhs);
1031 assert_eq!(lhs_hash, rhs_hash);
1032 }
1033
1034 {
1035 let lhs = bitvec![true; Word::BITS + 1];
1036 let mut rhs = lhs.clone();
1037
1038 let lhs_hash = hash(&lhs);
1039 let rhs_hash = hash(&rhs);
1040 assert_eq!(lhs_hash, rhs_hash);
1041 rhs.push(true).pop();
1042 let rhs_hash = hash(&rhs);
1043 assert_eq!(lhs_hash, rhs_hash);
1044
1045 let mut rhs = lhs.clone();
1046 rhs.push_unused_word();
1047
1048 let lhs_hash = hash(&lhs);
1049 let rhs_hash = hash(&rhs);
1050 assert_eq!(lhs_hash, rhs_hash);
1051 rhs.push(true).pop();
1052 let rhs_hash = hash(&rhs);
1053 assert_eq!(lhs_hash, rhs_hash);
1054 }
1055 }
1056
1057 #[test]
1058 fn test_eq() {
1059 {
1060 let lhs = bitvec![true, true, false, false];
1061 let rhs = bitvec![true; 4];
1062 let unchanged = rhs.clone();
1063
1064 assert_ne!(lhs, rhs);
1065
1066 let mut rhs = unchanged;
1067 rhs.push_unused_word();
1068
1069 assert_ne!(lhs, rhs);
1070 }
1071
1072 {
1073 let lhs = bitvec![true, true, false, false];
1074 let mut rhs = bitvec![true, true, false, false, true];
1075 let unchanged = rhs.clone();
1076
1077 assert_ne!(lhs, rhs);
1078 rhs.pop();
1079 assert_eq!(lhs, rhs);
1080
1081 let mut rhs = unchanged;
1082 rhs.push_unused_word();
1083
1084 assert_ne!(lhs, rhs);
1085 rhs.pop();
1086 assert_eq!(lhs, rhs);
1087 }
1088
1089 {
1090 let lhs = bitvec![true; Word::BITS + 1];
1091 let mut rhs = lhs.clone();
1092
1093 assert_eq!(lhs, rhs);
1094 rhs.push(true).pop();
1095 assert_eq!(lhs, rhs);
1096
1097 let mut rhs = lhs.clone();
1098 rhs.push_unused_word();
1099
1100 assert_eq!(lhs, rhs);
1101 rhs.push(true).pop();
1102 assert_eq!(lhs, rhs);
1103 }
1104 }
1105}