use common::*;
use super::data::TypeData;
#[derive(Debug,Copy,Clone,PartialEq,Eq)]
pub struct PrimitiveType {
pub kind: PrimitiveKind,
pub indirection: Indirection,
}
#[derive(Debug,Copy,Clone,PartialEq,Eq)]
pub enum PrimitiveKind {
Void,
Char,
UChar,
RChar,
WChar,
RChar16,
RChar32,
I8,
U8,
I16,
U16,
I32,
U32,
I64,
U64,
I128,
U128,
F16,
F32,
F32PP,
F48,
F64,
F80,
F128,
Complex32,
Complex64,
Complex80,
Complex128,
Bool8,
Bool16,
Bool32,
Bool64,
HRESULT,
}
#[derive(Debug,Copy,Clone,PartialEq,Eq)]
pub enum Indirection {
None,
Pointer16,
FarPointer1616,
HugePointer1616,
Pointer32,
Pointer1632,
Pointer64,
}
pub fn type_data_for_primitive(index: TypeIndex) -> Result<TypeData<'static>> {
assert!(index < 0x1000);
let indirection = match index & 0xf00 {
0x000 => Indirection::None,
0x100 => Indirection::Pointer16,
0x200 => Indirection::FarPointer1616,
0x300 => Indirection::FarPointer1616,
0x400 => Indirection::Pointer32,
0x500 => Indirection::Pointer1632,
0x600 => Indirection::Pointer64,
_ => { return Err(Error::TypeNotFound(index)); }
};
let kind = match index & 0xff {
0x03 => PrimitiveKind::Void,
0x08 => PrimitiveKind::HRESULT,
0x10 => PrimitiveKind::Char,
0x20 => PrimitiveKind::UChar,
0x68 => PrimitiveKind::I8,
0x69 => PrimitiveKind::U8,
0x70 => PrimitiveKind::RChar,
0x71 => PrimitiveKind::WChar,
0x7a => PrimitiveKind::RChar16,
0x7b => PrimitiveKind::RChar32,
0x11 => PrimitiveKind::I16,
0x21 => PrimitiveKind::U16,
0x72 => PrimitiveKind::I16,
0x73 => PrimitiveKind::U16,
0x12 => PrimitiveKind::I32,
0x22 => PrimitiveKind::U32,
0x74 => PrimitiveKind::I32,
0x75 => PrimitiveKind::U32,
0x13 => PrimitiveKind::I64,
0x23 => PrimitiveKind::U64,
0x76 => PrimitiveKind::I64,
0x77 => PrimitiveKind::U64,
0x14 => PrimitiveKind::I128,
0x24 => PrimitiveKind::U128,
0x78 => PrimitiveKind::I128,
0x79 => PrimitiveKind::U128,
0x46 => PrimitiveKind::F16,
0x40 => PrimitiveKind::F32,
0x45 => PrimitiveKind::F32PP,
0x44 => PrimitiveKind::F48,
0x41 => PrimitiveKind::F64,
0x42 => PrimitiveKind::F80,
0x43 => PrimitiveKind::F128,
0x50 => PrimitiveKind::Complex32,
0x51 => PrimitiveKind::Complex64,
0x52 => PrimitiveKind::Complex80,
0x53 => PrimitiveKind::Complex128,
0x30 => PrimitiveKind::Bool8,
0x31 => PrimitiveKind::Bool16,
0x32 => PrimitiveKind::Bool32,
0x33 => PrimitiveKind::Bool64,
_ => { return Err(Error::TypeNotFound(index)); }
};
Ok(TypeData::Primitive(PrimitiveType {
kind: kind,
indirection: indirection,
}))
}