orx_split_vec/common_traits/
eq.rs1use 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}