tower_vm/interpreter/
typeflag.rs

1#[repr(u8)]
2#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
3pub enum TypeFlag {
4    I8 = 0,
5    I16 = 1,
6    I32 = 2,
7    I64 = 3,
8    F32 = 4,
9    F64 = 5,
10    Bool = 6,
11    Char = 7,
12    U8 = 8,
13    U16 = 9,
14    U32 = 10,
15    U64 = 11,
16}
17
18impl TypeFlag {
19    pub fn to_code(self) -> Vec<u8> {
20        vec![self.into()]
21    }
22}
23
24impl Into<u8> for TypeFlag {
25    fn into(self) -> u8 {
26        self as u8
27    }
28}
29
30impl Into<u64> for TypeFlag {
31    fn into(self) -> u64 {
32        self as u64
33    }
34}
35
36impl From<u8> for TypeFlag {
37    fn from(byte: u8) -> Self {
38        match byte {
39            0 => Self::I8,
40            1 => Self::I16,
41            2 => Self::I32,
42            3 => Self::I64,
43            4 => Self::F32,
44            5 => Self::F64,
45            6 => Self::Bool,
46            7 => Self::Char,
47            8 => Self::U8,
48            9 => Self::U16,
49            10 => Self::U32,
50            11 => Self::U64,
51            _ => panic!("bad typeflag: {}", byte),
52        }
53    }
54}
55
56impl TypeFlag {
57    pub fn size(self) -> usize {
58        match self {
59            Self::I8 => 1,
60            Self::I16 => 2,
61            Self::I32 => 4,
62            Self::I64 => 8,
63            Self::F32 => 4,
64            Self::F64 => 8,
65            Self::Bool => 1,
66            Self::Char => 4,
67            Self::U8 => 1,
68            Self::U16 => 2,
69            Self::U32 => 4,
70            Self::U64 => 8,
71        }
72    }
73}