minicas_core/
ty.rs

1use num::{BigRational, FromPrimitive, ToPrimitive};
2use std::fmt;
3
4/// The type of some data being computed on.
5#[derive(Debug, Clone, Copy, Default, Eq, PartialEq, Hash)]
6pub enum Ty {
7    #[default]
8    Rational,
9    Bool,
10}
11
12impl Ty {
13    pub fn all() -> &'static [Ty] {
14        &[Ty::Rational, Ty::Bool]
15    }
16
17    pub fn make_default(&self) -> TyValue {
18        match self {
19            Ty::Rational => TyValue::Rational(BigRational::from_usize(0).unwrap()),
20            Ty::Bool => TyValue::Bool(false),
21        }
22    }
23}
24
25/// Some constant data and its corresponding type.
26#[derive(Debug, Clone, Eq, PartialEq, Hash)]
27pub enum TyValue {
28    Rational(BigRational),
29    Bool(bool),
30}
31
32impl Default for TyValue {
33    fn default() -> Self {
34        TyValue::Rational(BigRational::from_usize(0).unwrap())
35    }
36}
37
38impl TyValue {
39    pub fn ty(&self) -> Ty {
40        match self {
41            TyValue::Rational(_) => Ty::Rational,
42            TyValue::Bool(_) => Ty::Bool,
43        }
44    }
45
46    pub fn to_usize(&self) -> Option<usize> {
47        match self {
48            TyValue::Rational(v) => v.to_usize(),
49            _ => None,
50        }
51    }
52    pub fn to_f32(&self) -> Option<f32> {
53        match self {
54            TyValue::Rational(v) => v.to_f32(),
55            _ => None,
56        }
57    }
58    pub fn to_f64(&self) -> Option<f64> {
59        match self {
60            TyValue::Rational(v) => v.to_f64(),
61            _ => None,
62        }
63    }
64}
65
66impl fmt::Display for TyValue {
67    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68        use TyValue::*;
69        match self {
70            Rational(v) => write!(f, "{}", v),
71            Bool(v) => write!(f, "{}", v),
72        }
73    }
74}
75
76impl From<BigRational> for TyValue {
77    fn from(input: BigRational) -> Self {
78        TyValue::Rational(input)
79    }
80}
81impl From<usize> for TyValue {
82    fn from(input: usize) -> Self {
83        TyValue::Rational(BigRational::from_usize(input).unwrap())
84    }
85}
86impl From<isize> for TyValue {
87    fn from(input: isize) -> Self {
88        TyValue::Rational(BigRational::from_isize(input).unwrap())
89    }
90}
91impl From<u32> for TyValue {
92    fn from(input: u32) -> Self {
93        TyValue::Rational(BigRational::from_u32(input).unwrap())
94    }
95}
96impl From<i32> for TyValue {
97    fn from(input: i32) -> Self {
98        TyValue::Rational(BigRational::from_i32(input).unwrap())
99    }
100}
101impl From<u64> for TyValue {
102    fn from(input: u64) -> Self {
103        TyValue::Rational(BigRational::from_u64(input).unwrap())
104    }
105}
106impl From<i64> for TyValue {
107    fn from(input: i64) -> Self {
108        TyValue::Rational(BigRational::from_i64(input).unwrap())
109    }
110}
111impl From<f32> for TyValue {
112    fn from(input: f32) -> Self {
113        TyValue::Rational(BigRational::from_f32(input).unwrap())
114    }
115}
116impl From<f64> for TyValue {
117    fn from(input: f64) -> Self {
118        TyValue::Rational(BigRational::from_f64(input).unwrap())
119    }
120}
121
122impl From<bool> for TyValue {
123    fn from(input: bool) -> Self {
124        TyValue::Bool(input)
125    }
126}