rateslib/dual/dual_ops/
numeric_ops.rs1use crate::dual::dual::{Dual, Dual2};
2use crate::dual::enums::Number;
3use std::ops::{Add, Div, Mul, Sub};
4
5pub trait NumberOps<T>:
6 Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Sized + Clone
7{
8}
9impl<'a, T: 'a> NumberOps<T> for &'a T where
10 &'a T: Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T>
11{
12}
13impl NumberOps<Dual> for Dual {}
14impl NumberOps<Dual2> for Dual2 {}
15impl NumberOps<f64> for f64 {}
16impl NumberOps<Number> for Number {}
17
18#[cfg(test)]
19mod tests {
20 use super::*;
21
22 #[test]
23 fn test_fieldops() {
24 fn test_ops<T>(a: &T, b: &T) -> T
25 where
26 for<'a> &'a T: NumberOps<T>,
27 {
28 &(a + b) - a
29 }
30
31 fn test_ops2<T>(a: T, b: T) -> T
32 where
33 T: NumberOps<T>,
34 {
35 (a.clone() + b) - a
36 }
37
38 let x = 1.0;
39 let y = 2.0;
40 let z = test_ops(&x, &y);
41 println!("{:?}", z);
42
43 let z = test_ops2(x, y);
44 println!("{:?}", z);
45 }
46}