Thanks to visit codestin.com
Credit goes to docs.rs

orx_concurrent_vec/common_traits/
eq.rs

1use crate::{ConcurrentElement, ConcurrentSlice, ConcurrentVec};
2
3// elem
4impl<T: PartialEq> PartialEq for ConcurrentElement<T> {
5    #[inline]
6    fn eq(&self, other: &Self) -> bool {
7        self.0 == other.0
8    }
9}
10
11impl<T: PartialEq> PartialEq<T> for ConcurrentElement<T> {
12    fn eq(&self, other: &T) -> bool {
13        self.map(|x| x == other)
14    }
15}
16
17// vec
18
19impl<T: PartialEq> PartialEq for ConcurrentVec<T> {
20    fn eq(&self, other: &Self) -> bool {
21        eq_elem_iters(self.iter(), other.iter())
22    }
23}
24
25impl<T: PartialEq> PartialEq<ConcurrentSlice<'_, T>> for ConcurrentVec<T> {
26    fn eq(&self, other: &ConcurrentSlice<'_, T>) -> bool {
27        eq_elem_iters(self.iter(), other.iter())
28    }
29}
30
31impl<T: PartialEq> PartialEq<[T]> for ConcurrentVec<T> {
32    fn eq(&self, other: &[T]) -> bool {
33        eq_elem_iter_to_iter(self.iter(), other.iter())
34    }
35}
36
37impl<const N: usize, T: PartialEq> PartialEq<[T; N]> for ConcurrentVec<T> {
38    fn eq(&self, other: &[T; N]) -> bool {
39        eq_elem_iter_to_iter(self.iter(), other.iter())
40    }
41}
42
43// slice
44
45impl<T: PartialEq> PartialEq for ConcurrentSlice<'_, T> {
46    fn eq(&self, other: &Self) -> bool {
47        eq_elem_iters(self.iter(), other.iter())
48    }
49}
50
51impl<T: PartialEq> PartialEq<ConcurrentVec<T>> for ConcurrentSlice<'_, T> {
52    fn eq(&self, other: &ConcurrentVec<T>) -> bool {
53        eq_elem_iters(self.iter(), other.iter())
54    }
55}
56
57impl<T: PartialEq> PartialEq<[T]> for ConcurrentSlice<'_, T> {
58    fn eq(&self, other: &[T]) -> bool {
59        eq_elem_iter_to_iter(self.iter(), other.iter())
60    }
61}
62
63impl<const N: usize, T: PartialEq> PartialEq<[T; N]> for ConcurrentSlice<'_, T> {
64    fn eq(&self, other: &[T; N]) -> bool {
65        eq_elem_iter_to_iter(self.iter(), other.iter())
66    }
67}
68
69// helpers
70
71fn eq_elem_iters<'a, T, I, J>(mut a: I, mut b: J) -> bool
72where
73    I: Iterator<Item = &'a ConcurrentElement<T>>,
74    J: Iterator<Item = &'a ConcurrentElement<T>>,
75    T: PartialEq + 'a,
76{
77    loop {
78        match (a.next(), b.next()) {
79            (Some(a), Some(b)) if a == b => continue,
80            (None, None) => return true,
81            _ => return false,
82        }
83    }
84}
85
86fn eq_elem_iter_to_iter<'a, T, I, J>(mut a: I, mut b: J) -> bool
87where
88    I: Iterator<Item = &'a ConcurrentElement<T>>,
89    J: Iterator<Item = &'a T>,
90    T: PartialEq + 'a,
91{
92    loop {
93        match (a.next(), b.next()) {
94            (Some(a), Some(b)) if a.0.is_some_and(|a| a == b) => continue,
95            (None, None) => return true,
96            _ => return false,
97        }
98    }
99}