dyn_std/core/
cmp.rs

1use core::any::Any;
2
3use crate::{Dyn, Instance};
4
5/// Dynamic (object-safe) version of [`PartialEq`](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialEq.html).
6pub trait PartialEq {
7    fn dyn_eq(&self, other: &dyn Any) -> bool;
8}
9
10impl<T: Dyn + core::cmp::PartialEq> PartialEq for T {
11    #[inline]
12    fn dyn_eq(&self, other: &dyn Any) -> bool {
13        other.downcast_ref::<Self>().map_or(false, |other| self.eq(other))
14    }
15}
16
17impl<T: core::cmp::PartialEq, U> core::cmp::PartialEq for Instance<T, U> {
18    #[inline]
19    fn eq(&self, other: &Self) -> bool {
20        self.0.eq(&other.0)
21    }
22}
23
24/// Dynamic (object-safe) version of [`Eq`](https://doc.rust-lang.org/nightly/core/cmp/trait.Eq.html).
25pub trait Eq: PartialEq {}
26
27impl<T: Dyn + core::cmp::Eq> Eq for T {}
28
29impl<T: core::cmp::Eq, U> core::cmp::Eq for Instance<T, U> {}
30
31/// Dynamic (object-safe) version of [`PartialOrd`](https://doc.rust-lang.org/nightly/core/cmp/trait.PartialOrd.html).
32pub trait PartialOrd: Dyn {
33    fn dyn_partial_cmp(&self, other: &dyn Any) -> Option<core::cmp::Ordering>;
34}
35
36impl<T: Dyn + core::cmp::PartialOrd> PartialOrd for T {
37    #[inline]
38    fn dyn_partial_cmp(&self, other: &dyn Any) -> Option<core::cmp::Ordering> {
39        other.downcast_ref::<Self>().map_or(None, |other| self.partial_cmp(other))
40    }
41}
42
43impl<T: core::cmp::PartialOrd, U> core::cmp::PartialOrd for Instance<T, U> {
44    #[inline]
45    fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
46        self.0.partial_cmp(&other.0)
47    }
48}
49
50/// Dynamic (object-safe) version of [`Ord`](https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html).
51pub trait Ord: PartialOrd {
52    fn dyn_cmp(&self, other: &dyn Any) -> core::cmp::Ordering;
53}
54
55impl<T: Dyn + core::cmp::Ord> Ord for T {
56    #[inline]
57    fn dyn_cmp(&self, other: &dyn Any) -> core::cmp::Ordering {
58        self.cmp(other.downcast_ref::<Self>().unwrap())
59    }
60}
61
62impl<T: core::cmp::Ord, U> core::cmp::Ord for Instance<T, U> {
63    #[inline]
64    fn cmp(&self, other: &Self) -> core::cmp::Ordering {
65        self.0.cmp(&other.0)
66    }
67}