pub mod impls;
pub mod type_id;
pub mod prelude {
use super::*;
pub use crate::impl_block;
pub use EnumVariants::*;
pub use InnerType::*;
pub use NumericTy::*;
pub use PrimitiveTy::*;
pub use SequenceTy::*;
pub use StructFields::*;
pub use TextualTy::*;
pub use Type::*;
pub use UserTy::*;
}
use prelude::*;
pub trait TypeInfo {
const INFO: Type;
}
const extern "C" fn type_info<T: TypeInfo>() -> &'static Type {
&T::INFO
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SizeInfo {
pub size: usize,
pub align: usize,
}
impl SizeInfo {
const fn new<T>() -> Self {
Self {
size: core::mem::size_of::<T>(),
align: core::mem::align_of::<T>(),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Type {
Sized(InnerType, SizeInfo),
Unsized(InnerType),
}
impl Type {
pub const fn is_sized(&self) -> bool {
match self {
Unsized(_) => false,
Sized(_, _) => true,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum InnerType {
Primitive(PrimitiveTy),
Sequence(SequenceTy),
User(UserTy),
Function(FunctionTy),
Pointer(IndirectTy),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PrimitiveTy {
Boolean,
Numeric(NumericTy),
Textual(TextualTy),
Never,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NumericTy {
Integer(IntegerTy),
Float(FloatTy),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TextualTy {
Char,
Str,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SequenceTy {
Tuple(TupleTy),
Array(ArrayTy),
Slice(SliceTy),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum UserTy {
Struct(StructTy),
Enum(EnumTy),
Union(UnionTy),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FunctionTy {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Repr {
pub base: BaseRepr,
pub packed: bool,
pub align: Option<usize>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BaseRepr {
C,
Rust,
Transparent,
EnumSigned(usize),
EnumUnsigned(usize),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct StructTy {
pub repr: Repr,
pub name: &'static str,
pub fields: StructFields,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum StructFields {
Named(&'static [NamedField]),
Unnamed(&'static [Field]),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct UnionTy {
pub repr: Repr,
pub name: &'static str,
pub fields: &'static [NamedField],
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct TupleTy {
pub fields: &'static [&'static Type],
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct EnumTy {
pub repr: Repr,
pub name: &'static str,
pub variants: EnumVariants,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct IndirectTy {
pub indirection: Indirection,
pub target: extern "C" fn() -> &'static Type,
pub sized: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SliceTy {
pub ty: &'static Type,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ArrayTy {
pub ty: &'static Type,
pub size: usize,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct IntegerTy {
pub name: &'static str,
pub signed: bool,
pub size: usize,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct FloatTy {
pub size: usize,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct EnumVariant<T> {
pub name: &'static str,
pub value: Option<T>,
pub fields: StructFields,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum EnumVariants {
Undefined(&'static [EnumVariant<()>]),
C(&'static [EnumVariant<i128>]),
U8(&'static [EnumVariant<u8>]),
I8(&'static [EnumVariant<i8>]),
U16(&'static [EnumVariant<u16>]),
I16(&'static [EnumVariant<i16>]),
U32(&'static [EnumVariant<u32>]),
I32(&'static [EnumVariant<i32>]),
U64(&'static [EnumVariant<u64>]),
I64(&'static [EnumVariant<i64>]),
U128(&'static [EnumVariant<u128>]),
I128(&'static [EnumVariant<i128>]),
Usize(&'static [EnumVariant<usize>]),
Isize(&'static [EnumVariant<isize>]),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Indirection {
Ref,
MutRef,
ConstPtr,
MutPtr,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Field {
pub public: bool,
pub ty: &'static Type,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct NamedField {
pub name: &'static str,
pub inner: Field,
}