use crate::common::*;
use crate::tpi::data::TypeData;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct PrimitiveType {
pub kind: PrimitiveKind,
pub indirection: Option<Indirection>,
}
#[non_exhaustive]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum PrimitiveKind {
NoType,
Void,
Char,
UChar,
RChar,
WChar,
RChar16,
RChar32,
I8,
U8,
Short,
UShort,
I16,
U16,
Long,
ULong,
I32,
U32,
Quad,
UQuad,
I64,
U64,
Octa,
UOcta,
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 {
Near16,
Far16,
Huge16,
Near32,
Far32,
Near64,
Near128,
}
pub fn type_data_for_primitive(index: TypeIndex) -> Result<TypeData<'static>> {
assert!(index < TypeIndex(0x1000));
let indirection = match index.0 & 0xf00 {
0x000 => None,
0x100 => Some(Indirection::Near16),
0x200 => Some(Indirection::Far16),
0x300 => Some(Indirection::Huge16),
0x400 => Some(Indirection::Near32),
0x500 => Some(Indirection::Far32),
0x600 => Some(Indirection::Near64),
0x700 => Some(Indirection::Near128),
_ => {
return Err(Error::TypeNotFound(index.0));
}
};
let kind = match index.0 & 0xff {
0x00 => PrimitiveKind::NoType,
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::Short,
0x21 => PrimitiveKind::UShort,
0x72 => PrimitiveKind::I16,
0x73 => PrimitiveKind::U16,
0x12 => PrimitiveKind::Long,
0x22 => PrimitiveKind::ULong,
0x74 => PrimitiveKind::I32,
0x75 => PrimitiveKind::U32,
0x13 => PrimitiveKind::Quad,
0x23 => PrimitiveKind::UQuad,
0x76 => PrimitiveKind::I64,
0x77 => PrimitiveKind::U64,
0x14 => PrimitiveKind::Octa,
0x24 => PrimitiveKind::UOcta,
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.0));
}
};
Ok(TypeData::Primitive(PrimitiveType { kind, indirection }))
}