orx_split_vec/common_traits/
eq.rs

1use crate::*;
2use alloc::vec::Vec;
3
4impl<T, G, U> PartialEq<U> for SplitVec<T, G>
5where
6    U: AsRef<[T]>,
7    T: PartialEq,
8    G: Growth,
9{
10    fn eq(&self, other: &U) -> bool {
11        are_fragments_eq_to_slice(&self.fragments, other.as_ref())
12    }
13}
14
15impl<T: PartialEq, G> PartialEq<SplitVec<T, G>> for [T]
16where
17    G: Growth,
18{
19    fn eq(&self, other: &SplitVec<T, G>) -> bool {
20        are_fragments_eq_to_slice(&other.fragments, self)
21    }
22}
23
24impl<T: PartialEq, G> PartialEq<SplitVec<T, G>> for Vec<T>
25where
26    G: Growth,
27{
28    fn eq(&self, other: &SplitVec<T, G>) -> bool {
29        are_fragments_eq_to_slice(&other.fragments, self)
30    }
31}
32
33impl<T: PartialEq, G, const N: usize> PartialEq<SplitVec<T, G>> for [T; N]
34where
35    G: Growth,
36{
37    fn eq(&self, other: &SplitVec<T, G>) -> bool {
38        are_fragments_eq_to_slice(&other.fragments, self)
39    }
40}
41
42impl<T: PartialEq, G> PartialEq<SplitVec<T, G>> for SplitVec<T, G>
43where
44    G: Growth,
45{
46    fn eq(&self, other: &SplitVec<T, G>) -> bool {
47        let mut iter1 = self.iter();
48        let mut iter2 = other.iter();
49        loop {
50            match (iter1.next(), iter2.next()) {
51                (Some(x), Some(y)) => {
52                    if x != y {
53                        return false;
54                    }
55                }
56                (None, None) => return true,
57                _ => return false,
58            }
59        }
60    }
61}
62
63impl<T: PartialEq, G: Growth> Eq for SplitVec<T, G> {}
64
65pub(crate) fn are_fragments_eq_to_slice<T: PartialEq>(
66    fragments: &[Fragment<T>],
67    slice: &[T],
68) -> bool {
69    let mut slice_beg = 0;
70    for fragment in fragments {
71        let slice_end = slice_beg + fragment.len();
72        let slice_of_slice = &slice[slice_beg..slice_end];
73        if fragment.data != slice_of_slice {
74            return false;
75        }
76        slice_beg = slice_end;
77    }
78    true
79}
80
81#[cfg(test)]
82mod tests {
83    use crate::test_all_growth_types;
84    use crate::*;
85    use alloc::vec::Vec;
86
87    #[test]
88    fn eq() {
89        fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
90            for i in 0..57 {
91                vec.push(i);
92            }
93
94            let eq_vec: Vec<_> = (0..vec.capacity()).collect();
95            let eq_vec_as_ref: &[usize] = eq_vec.as_ref();
96            assert_eq!(vec, eq_vec_as_ref);
97            assert_eq!(&vec, &eq_vec);
98            assert_eq!(vec, eq_vec);
99        }
100
101        test_all_growth_types!(test);
102    }
103}