any_cmp/
any_partial_ord.rs

1//! Provider of [`AnyPartialOrd`].
2
3use crate::prelude::*;
4use std::any::Any;
5use std::cmp::Ordering;
6use std::fmt::{Debug, Formatter, Result};
7
8/// Like [`PartialOrd`], but this trait can be dynamic.
9///
10/// In a cross-type comparison, the [`TypeId`] of the type is compared first.
11/// And since the order of the [`TypeId`] depends on the Rust version, the
12/// comparison result also depends on it.
13///
14/// [`TypeId`]: core::any::TypeId
15pub trait AnyPartialOrd: AnyPartialEq {
16    /// This method returns an ordering between `self` and `other` values if one exists.
17    #[must_use]
18    fn any_partial_cmp(&self, other: &dyn AnyPartialOrd) -> Option<Ordering>;
19}
20
21impl<T> AnyPartialOrd for T
22where
23    T: Any + PartialOrd,
24{
25    fn any_partial_cmp(&self, other: &dyn AnyPartialOrd) -> Option<Ordering> {
26        if self.type_id() != other.type_id() {
27            return Some(self.type_id().cmp(&other.type_id()));
28        }
29
30        self.partial_cmp((other as &dyn Any).downcast_ref().unwrap())
31    }
32}
33
34impl PartialEq for dyn AnyPartialOrd {
35    fn eq(&self, other: &Self) -> bool {
36        self.any_eq(other as &dyn AnyPartialEq)
37    }
38}
39
40impl PartialEq for dyn AnyPartialOrd + Send {
41    fn eq(&self, other: &Self) -> bool {
42        self.any_eq(other as &dyn AnyPartialEq)
43    }
44}
45
46impl PartialEq for dyn AnyPartialOrd + Send + Sync {
47    fn eq(&self, other: &Self) -> bool {
48        self.any_eq(other as &dyn AnyPartialEq)
49    }
50}
51
52impl PartialOrd for dyn AnyPartialOrd {
53    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
54        self.any_partial_cmp(other)
55    }
56}
57
58impl PartialOrd for dyn AnyPartialOrd + Send {
59    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
60        self.any_partial_cmp(other)
61    }
62}
63
64impl PartialOrd for dyn AnyPartialOrd + Send + Sync {
65    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
66        self.any_partial_cmp(other)
67    }
68}
69
70impl Debug for dyn AnyPartialOrd {
71    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
72        f.debug_struct("AnyPartialOrd").finish_non_exhaustive()
73    }
74}
75
76impl Debug for dyn AnyPartialOrd + Send {
77    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
78        f.debug_struct("AnyPartialOrd").finish_non_exhaustive()
79    }
80}
81
82impl Debug for dyn AnyPartialOrd + Send + Sync {
83    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
84        f.debug_struct("AnyPartialOrd").finish_non_exhaustive()
85    }
86}