bitvek/
eq.rs

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}