cxc/libraries/
type_interface_lib.rs1use 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}