1use crate::{BITS_PER_WORD, BitVec};
2
3impl PartialEq for BitVec {
4 fn eq(&self, other: &Self) -> bool {
5 if self.len != other.len {
6 return false;
7 }
8 if self.is_empty() {
9 return true;
10 }
11 let last = self.data.len() - 1;
12 if unsafe { self.data.get_unchecked(..last) != other.data.get_unchecked(..last) } {
13 return false;
14 }
15 let xor = unsafe { self.data.get_unchecked(last) ^ other.data.get_unchecked(last) };
16 let unused = self.data.len() * BITS_PER_WORD - self.len;
17 xor >> unused == 0
18 }
19}
20
21impl Eq for BitVec {}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26 use crate::bitvec;
27
28 #[test]
29 fn test_eq() {
30 {
31 let lhs = bitvec![true, true, false, false];
32
33 let rhs = bitvec![true, true, false, false];
34 assert_eq!(lhs, rhs);
35
36 let rhs = bitvec![true, false, true, false];
37 assert_ne!(lhs, rhs);
38
39 let mut rhs = bitvec![true, true, false, false, true];
40 assert_ne!(lhs, rhs);
41 rhs.pop();
42 assert_ne!(lhs.data, rhs.data);
43 assert_eq!(lhs, rhs);
44 }
45
46 {
47 let lhs = bitvec![true; BITS_PER_WORD + 1];
48
49 let rhs = bitvec![true; BITS_PER_WORD + 1];
50 assert_eq!(lhs, rhs);
51
52 let rhs = bitvec![false; BITS_PER_WORD + 1];
53 assert_ne!(lhs, rhs);
54
55 let mut rhs = bitvec![true; BITS_PER_WORD + 2];
56 assert_ne!(lhs, rhs);
57 rhs.pop();
58 assert_ne!(lhs.data, rhs.data);
59 assert_eq!(lhs, rhs);
60 }
61 }
62}