pinned_deque/
cmp.rs

1use crate::*;
2use std::cmp::*;
3
4impl<T> PartialOrd for PinnedDeque<T>
5where
6    T: Sized + PartialOrd,
7{
8    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
9        let mut it_a = self.iter();
10        let mut it_b = other.iter();
11        loop {
12            let Some(a) = it_a.next() else {
13                break;
14            };
15            let Some(b) = it_b.next() else {
16                break;
17            };
18            let cmp = a.partial_cmp(b);
19            if !matches!(cmp, Some(Ordering::Equal)) {
20                return cmp;
21            }
22        }
23        match (it_a.next(), it_b.next()) {
24            (Some(_), None) => Some(Ordering::Greater),
25            (None, Some(_)) => Some(Ordering::Less),
26            (None, None) => Some(Ordering::Equal),
27            _ => unreachable!(),
28        }
29    }
30}
31
32impl<T> PartialEq for PinnedDeque<T>
33where
34    T: Sized + PartialEq,
35{
36    fn eq(&self, other: &Self) -> bool {
37        if self.len() != other.len() {
38            return false;
39        }
40        let mut it_a = self.iter();
41        let mut it_b = other.iter();
42        loop {
43            let Some(a) = it_a.next() else {
44                break;
45            };
46            let Some(b) = it_b.next() else {
47                break;
48            };
49            let eq = a.eq(b);
50            if !eq {
51                return false;
52            }
53        }
54        true
55    }
56}
57
58impl<T> Ord for PinnedDeque<T>
59where
60    T: Sized + Ord,
61{
62    fn cmp(&self, other: &Self) -> Ordering {
63        self.partial_cmp(other).unwrap()
64    }
65}
66
67impl<T> Eq for PinnedDeque<T> where T: Sized + Eq {}