use std::collections::HashMap;
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum TypeInfo {
Never,
Unit,
Scalar(ScalarType),
Compound(CompoundType),
Pointer(PointerType),
Impl(Vec<&'static str>),
Dyn(Vec<&'static str>),
#[cfg(feature="specialized_std")]
Specialized(SpecializedType)
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum ScalarType {
Bool,
I8, I16, I32, I64, I128,
U8, U16, U32, U64, U128,
F32, F64,
Char
}
impl ScalarType {
pub fn is_integer(self) -> bool {
matches!(self, ScalarType::I8 | ScalarType::I16 | ScalarType::I32 | ScalarType::I64 | ScalarType::I128 | ScalarType::U8 | ScalarType::U16 | ScalarType::U32 | ScalarType::U64 | ScalarType::U128)
}
pub fn is_float(self) -> bool {
matches!(self, ScalarType::F32 | ScalarType::F64)
}
pub fn is_signed(self) -> bool {
matches!(self, ScalarType::I8 | ScalarType::I16 | ScalarType::I32 | ScalarType::I64 | ScalarType::I128 | ScalarType::F32 | ScalarType::F64)
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum CompoundType {
Struct {
name: &'static str,
fields: HashMap<&'static str, TypeInfo>
},
Tuple {
fields: Vec<TypeInfo>,
},
Enum {
name: &'static str,
variants: HashMap<&'static str, EnumVariant>
},
Array {
type_info: Box<TypeInfo>,
length: usize,
},
Slice {
type_info: Box<TypeInfo>,
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum EnumVariant {
UnitVariant,
UnnamedVariant {
fields: Vec<TypeInfo>
},
NamedVariant {
fields: HashMap<&'static str, TypeInfo>
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum PointerType {
Reference{
lifetime: &'static str,
type_info: Box<TypeInfo>,
mutable: bool,
},
ConstPointer(Box<TypeInfo>),
MutPointer(Box<TypeInfo>)
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum SpecializedType {
Vec {
type_info: Box<TypeInfo>
},
VecDeque {
type_info: Box<TypeInfo>,
},
LinkedList {
type_info: Box<TypeInfo>,
},
HashMap {
key_type: Box<TypeInfo>,
value_type: Box<TypeInfo>,
},
BTreeMap {
key_type: Box<TypeInfo>,
value_type: Box<TypeInfo>,
},
HashSet {
type_info: Box<TypeInfo>,
},
BTreeSet {
type_info: Box<TypeInfo>,
},
BinaryHeap {
type_info: Box<TypeInfo>,
},
String
}