1pub use assert_approx_eq::assert_approx_eq;
3
4pub fn eq<T>(lh: T, rh: T, margin: T) -> bool
15where
16 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
17{
18 (rh <= (lh + margin)) & (rh >= (lh - margin))
19}
20
21pub fn ne<T>(lh: T, rh: T, margin: T) -> bool
32where
33 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
34{
35 (lh + margin < rh) | (lh - margin > rh)
36}
37
38pub fn gt<T>(lh: T, rh: T, margin: T) -> bool
49where
50 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
51{
52 lh > (rh + margin)
53}
54
55pub fn lt<T>(lh: T, rh: T, margin: T) -> bool
66where
67 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
68{
69 lh < (rh - margin)
70}
71
72pub fn ge<T>(lh: T, rh: T, margin: T) -> bool
83where
84 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
85{
86 lh >= (rh - margin)
87}
88
89pub fn le<T>(lh: T, rh: T, margin: T) -> bool
100where
101 T: PartialOrd + std::ops::Add<Output = T> + std::ops::Sub<Output = T> + Copy,
102{
103 lh <= (rh + margin)
104}
105
106#[cfg(test)]
107mod tests {
108
109 #[test]
110 fn eq() {
111 assert!(super::eq(std::f64::consts::PI, 3.0, 0.2));
112 assert!(super::eq(9.1, 9.1, 0.0));
113 assert!(super::eq(8.4, 9.1, 1.0));
114 assert!(super::eq(-0.1, -0.3, 0.2));
115 assert!(super::eq(-0.1, 0.1, 0.2));
116 assert!(!super::eq(0.1, 0.2, 0.01));
117 assert!(super::eq(1, 1, 0));
118 }
119
120 #[test]
121 fn ne() {
122 assert!(!super::ne(9.1, 9.1, 0.0));
123 assert!(!super::ne(8.4, 9.1, 1.0));
124 assert!(!super::ne(-0.1, -0.3, 0.2));
125 assert!(!super::ne(-0.1, 0.1, 0.2));
126 assert!(super::ne(0.1, 0.2, 0.01));
127 assert!(super::ne(1, 3, 1));
128 }
129
130 #[test]
131 fn gt() {
132 assert!(super::gt(8.1, 8.0, 0.0));
133 assert!(super::gt(8.1, 8.0, 0.05));
134 assert!(!super::gt(8.1, 8.0, 0.1));
135 assert!(super::gt(10, 8, 1));
136 }
137
138 #[test]
139 fn lt() {
140 assert!(super::lt(8.0, 8.1, 0.0));
141 assert!(super::lt(8.0, 8.1, 0.05));
142 assert!(!super::lt(8.0, 8.1, 0.1));
143 assert!(super::lt(8, 10, 1));
144 }
145
146 #[test]
147 fn ge() {
148 assert!(super::ge(8.1, 8.0, 0.0));
149 assert!(super::ge(8.1, 8.0, 0.05));
150 assert!(super::ge(8.1, 8.0, 0.1));
151 assert!(super::ge(8.0, 8.1, 0.1));
152 assert!(!super::ge(7.9, 8.1, 0.1));
153 assert!(super::ge(8, 7, 1));
154 }
155
156 #[test]
157 fn le() {
158 assert!(super::le(8.0, 8.1, 0.0));
159 assert!(super::le(8.0, 8.1, 0.05));
160 assert!(super::le(8.0, 8.1, 0.1));
161 assert!(super::le(8.1, 8.0, 0.1));
162 assert!(!super::le(8.2, 8.0, 0.1));
163 assert!(super::le(8, 8, 1));
164 }
165}