1use core::any::Any;
2
3use crate::{Dyn, Instance};
4
5pub 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
24pub 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
31pub 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
50pub 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}