cp_library_rs/utils/
ord_float.rs

1//! 順序付きの浮動小数点数型 `OrdF64` の定義
2
3use 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
82// 演算の定義
83impl_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, %);