cxc/libraries/
type_interface_lib.rs

1use crate::lex::VarName;
2use crate::parse::Expr;
3use crate::parse::FuncCode;
4use crate::Type;
5
6use crate::parse::TypeSpec;
7use crate::parse::TypeSpecRelation;
8use crate::typ::ABI;
9use crate::typ::spec_from_type::type_to_type_spec;
10use crate::unit::CompData;
11
12use super::Library;
13
14pub struct TypeInterfaceLib;
15
16impl Library for TypeInterfaceLib {
17    fn add_to_unit(&self, unit: &mut crate::Unit) {
18        unit.add_static_deriver(VarName::from("size_in_bytes"), size_in_bytes);
19
20        unit.add_type_level_func("EraseDataU8".into(), erase_data_u8);
21    }
22}
23
24fn erase_data_u8(input: Vec<Type>, _: &CompData) -> Type {
25    Type::u(8).get_array(input[0].size() as u32)
26}
27
28fn size_in_bytes(_: &CompData, typ: Type) -> Option<FuncCode> {
29    Some(FuncCode {
30        name: VarName::from("size_in_bytes"),
31        ret_type: TypeSpec::Int(32),
32        args: Vec::new(),
33        generic_count: 0,
34        code: Expr::Number(typ.size() as u64).wrap(),
35        relation: TypeSpecRelation::Static(type_to_type_spec(typ)),
36        is_external: false,
37        abi: ABI::C,
38    })
39}