orx_concurrent_vec/common_traits/
eq.rs1use crate::{ConcurrentElement, ConcurrentSlice, ConcurrentVec};
2
3impl<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
17impl<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
43impl<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
69fn 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}