any_cmp/
any_partial_ord.rs1use crate::prelude::*;
4use std::any::Any;
5use std::cmp::Ordering;
6use std::fmt::{Debug, Formatter, Result};
7
8pub trait AnyPartialOrd: AnyPartialEq {
16 #[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}