1use std::ops::Neg;
2
3#[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);