orbtk_utils/
number.rs

1use std::ops::Neg;
2
3/// Valid number types (64bit)
4#[derive(Debug, PartialOrd, PartialEq, Copy, Clone)]
5pub enum Number {
6    Real(i64),
7    Float(f64),
8}
9
10impl Default for Number {
11    fn default() -> Self {
12        Self::Real(0)
13    }
14}
15
16impl Neg for Number {
17    type Output = Number;
18
19    fn neg(self) -> Self::Output {
20        match self {
21            Number::Float(n) => Number::Float(-n),
22            Number::Real(n) => Number::Real(-n),
23        }
24    }
25}
26
27macro_rules! impl_float {
28    ($t:ty) => {
29        impl From<$t> for Number {
30            fn from(n: $t) -> Number {
31                Number::Float(n as f64)
32            }
33        }
34
35        impl From<Number> for $t {
36            fn from(n: Number) -> Self {
37                match n {
38                    Number::Real(n) => n as $t,
39                    Number::Float(n) => n as $t,
40                }
41            }
42        }
43    };
44}
45
46macro_rules! impl_real {
47    ($t:ty) => {
48        impl From<$t> for Number {
49            fn from(n: $t) -> Number {
50                Number::Real(n as i64)
51            }
52        }
53
54        impl From<Number> for $t {
55            fn from(n: Number) -> $t {
56                match n {
57                    Number::Real(n) => n as $t,
58                    Number::Float(n) => n as $t,
59                }
60            }
61        }
62    };
63}
64
65impl_float!(f32);
66impl_float!(f64);
67
68impl_real!(u8);
69impl_real!(i8);
70impl_real!(u16);
71impl_real!(i16);
72impl_real!(u32);
73impl_real!(i32);
74impl_real!(u64);
75impl_real!(i64);