abi_stable/sabi_types/
maybe_cmp.rs1use std::cmp::{Eq, Ordering, PartialEq, PartialOrd};
2
3#[allow(clippy::derive_hash_xor_eq)]
20#[derive(Debug, Copy, Clone, Hash)]
21#[repr(u8)]
22#[derive(StableAbi)]
23pub enum MaybeCmp<T> {
24 Just(T),
26 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(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}