abi_stable/sabi_types/
maybe_cmp.rs

1use std::cmp::{Eq, Ordering, PartialEq, PartialOrd};
2
3/// An Option-like type which only compares equal if it contains a value(the `Just` variant).
4///
5/// # Example
6///
7/// ```
8/// use abi_stable::sabi_types::MaybeCmp;
9///
10/// assert_eq!(MaybeCmp::Just(10), MaybeCmp::Just(10));
11///
12/// assert_ne!(MaybeCmp::Just(0), MaybeCmp::Just(10));
13/// assert_ne!(MaybeCmp::Just(0), MaybeCmp::Nothing);
14/// assert_ne!(MaybeCmp::Nothing, MaybeCmp::Just(0));
15/// assert_ne!(MaybeCmp::<u32>::Nothing, MaybeCmp::Nothing);
16///
17/// ```
18///
19#[allow(clippy::derive_hash_xor_eq)]
20#[derive(Debug, Copy, Clone, Hash)]
21#[repr(u8)]
22#[derive(StableAbi)]
23pub enum MaybeCmp<T> {
24    ///
25    Just(T),
26    ///
27    Nothing,
28}
29
30impl<T> Eq for MaybeCmp<T> where T: Eq {}
31
32impl<T> PartialEq for MaybeCmp<T>
33where
34    T: PartialEq,
35{
36    fn eq(&self, other: &Self) -> bool {
37        match (self, other) {
38            (MaybeCmp::Just(l), MaybeCmp::Just(r)) => l == r,
39            _ => false,
40        }
41    }
42}
43
44impl<T> PartialOrd for MaybeCmp<T>
45where
46    T: PartialOrd,
47{
48    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
49        match (self, other) {
50            (MaybeCmp::Just(l), MaybeCmp::Just(r)) => l.partial_cmp(r),
51            _ => None,
52        }
53    }
54}
55
56//#[cfg(test)]
57#[cfg(all(test, not(feature = "only_new_tests")))]
58mod tets {
59    use super::*;
60    #[test]
61    fn comparisons() {
62        assert_eq!(MaybeCmp::Just(0), MaybeCmp::Just(0));
63
64        assert_ne!(MaybeCmp::Just(0), MaybeCmp::Just(1));
65        assert_ne!(MaybeCmp::Nothing, MaybeCmp::Just(0));
66        assert_ne!(MaybeCmp::Just(0), MaybeCmp::Nothing);
67        assert_ne!(MaybeCmp::<()>::Nothing, MaybeCmp::Nothing);
68
69        assert_eq!(
70            MaybeCmp::Just(0).partial_cmp(&MaybeCmp::Just(0)),
71            Some(Ordering::Equal)
72        );
73        assert_eq!(
74            MaybeCmp::Just(0).partial_cmp(&MaybeCmp::Just(1)),
75            Some(Ordering::Less)
76        );
77        assert_eq!(MaybeCmp::Nothing.partial_cmp(&MaybeCmp::Just(0)), None);
78        assert_eq!(MaybeCmp::Just(0).partial_cmp(&MaybeCmp::Nothing), None);
79        assert_eq!(
80            MaybeCmp::<()>::Nothing.partial_cmp(&MaybeCmp::Nothing),
81            None
82        );
83    }
84}