cp_library_rs/utils/
ord_float.rs1use std::{
4 fmt::Display,
5 ops::{Add, Div, Mul, Rem, Sub},
6};
7
8use num_traits::{Bounded, One, Zero};
9
10macro_rules! impl_ord_f64 {
11 (f64, $op_trait:ident, $op_func:ident, $op:tt) => {
12 impl $op_trait<f64> for OrdF64 {
13 type Output = Self;
14 fn $op_func(self, rhs: f64) -> Self::Output {
15 Self(self.0 $op rhs)
16 }
17 }
18 };
19 ($op_trait:ident, $op_func:ident, $op:tt) => {
20 impl $op_trait for OrdF64 {
21 type Output = Self;
22 fn $op_func(self, rhs: Self) -> Self::Output {
23 Self(self.0 $op rhs.0)
24 }
25 }
26 };
27}
28
29#[derive(Debug, PartialEq, Clone, Copy)]
30pub struct OrdF64(pub f64);
31
32impl Eq for OrdF64 {}
33
34impl PartialOrd for OrdF64 {
35 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
36 Some(self.cmp(other))
37 }
38}
39
40impl Ord for OrdF64 {
41 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
42 self.partial_cmp(other).unwrap()
43 }
44}
45
46impl Display for OrdF64 {
47 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48 write!(f, "{}", self.0)
49 }
50}
51
52impl From<f64> for OrdF64 {
53 fn from(value: f64) -> Self {
54 Self(value)
55 }
56}
57
58impl Bounded for OrdF64 {
59 fn min_value() -> Self {
60 Self(f64::MIN)
61 }
62 fn max_value() -> Self {
63 Self(f64::MAX)
64 }
65}
66
67impl Zero for OrdF64 {
68 fn is_zero(&self) -> bool {
69 self.0 == 0.0
70 }
71 fn zero() -> Self {
72 Self(0.0)
73 }
74}
75
76impl One for OrdF64 {
77 fn one() -> Self {
78 Self(1.0)
79 }
80}
81
82impl_ord_f64!(Add, add, +);
84impl_ord_f64!(Sub, sub, -);
85impl_ord_f64!(Mul, mul, *);
86impl_ord_f64!(Div, div, /);
87impl_ord_f64!(Rem, rem, %);
88impl_ord_f64!(f64, Add, add, +);
89impl_ord_f64!(f64, Sub, sub, -);
90impl_ord_f64!(f64, Mul, mul, *);
91impl_ord_f64!(f64, Div, div, /);
92impl_ord_f64!(f64, Rem, rem, %);