1use std::ops::{Add, Sub, Mul, Div, AddAssign};
2
3pub trait Scalar:
7 private::Sealed +
8 Copy +
9 Add<Self, Output=Self> +
10 Sub<Self, Output=Self> +
11 Mul<Self, Output=Self> +
12 Div<Self, Output=Self> +
13 AddAssign +
14 PartialOrd {
15
16 fn abs(self) -> Self;
20
21 fn sqrt(self) -> Self;
25
26 fn is_finite(self) -> bool;
30
31 fn zero() -> Self;
35
36 fn one() -> Self;
40
41 fn from_f32(x: f32) -> Self;
45
46 fn from_f64(x: f64) -> Self;
50
51 fn from_usize(x: usize) -> Self;
55}
56
57impl Scalar for f32 {
61 fn abs(self) -> Self {self.abs()}
62 fn sqrt(self) -> Self {self.sqrt()}
63 fn is_finite(self) -> bool {self.is_finite()}
64 fn zero() -> Self {0.0_f32}
65 fn one() -> Self {1.0_f32}
66 fn from_f32(x: f32) -> Self {x}
67 fn from_f64(x: f64) -> Self {x as f32}
68 fn from_usize(x: usize) -> Self {x as f32}
69}
70
71impl Scalar for f64 {
75 fn abs(self) -> Self {self.abs()}
76 fn sqrt(self) -> Self {self.sqrt()}
77 fn is_finite(self) -> bool {self.is_finite()}
78 fn zero() -> Self {0.0}
79 fn one() -> Self {1.0}
80 fn from_f32(x: f32) -> Self {x as f64}
81 fn from_f64(x: f64) -> Self {x}
82 fn from_usize(x: usize) -> Self {x as f64}
83}
84
85mod private {
86
87 pub trait Sealed {}
88
89 impl Sealed for f32 {}
90 impl Sealed for f64 {}
91}