diff --git a/src/c_gen.rs b/src/c_gen.rs index 829b526..32b3ef4 100644 --- a/src/c_gen.rs +++ b/src/c_gen.rs @@ -194,56 +194,47 @@ impl LdmcCTargetMorph { }) } MorphismInstance2::MapSeq { ψ, seq_repr, item_morph } => { - let i = 0; // <--todo - self.add_instantiation(dict, item_morph.as_ref().clone()).expect("add instantiation"); - if let Some(seq_repr) = seq_repr { + if let Ok(item_morph_inst) = self.add_instantiation(dict, item_morph.as_ref().clone()) { + if let Some(seq_repr) = seq_repr { + dict.add_varname("LengthType".into()); + if let Ok(γ) = laddertypes::unification_sugared::unify( + &dict.parse("<LengthPrefix LengthType>").expect("parse type template").sugar(dict), + seq_repr.as_ref() + ) { + let length_type = γ.get(&dict.get_typeid(&"LengthType".into()).expect("")).expect("cant get LengthType"); + let ty = morph_inst.get_type().strip_halo(); + let symbol = encode_morph_type_to_symbol(dict, &morph_inst.get_haloless_type()); + let item_morph_symbol = item_morph_inst.instantiated_symbol_name(dict, &HashMap::new()); - dict.add_varname("LengthType".into()); - if let Ok(γ) = laddertypes::unification_sugared::unify( - &dict.parse("<LengthPrefix LengthType>").expect("parse type template").sugar(dict), - seq_repr.as_ref() - ) { - let length_type = γ.get(&dict.get_typeid(&"LengthType".into()).expect("")).expect("cant get LengthType"); - let ty = morph_inst.get_type().strip_halo(); - let symbol = encode_morph_type_to_symbol(dict, &morph_inst.get_haloless_type()); - let item_morph_symbol = encode_morph_type_to_symbol(dict, &item_morph.get_haloless_type()); + let length_c_type = get_c_repr_type(dict, length_type.clone(), true).expect("cant c-repr type for array length"); + let src_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().src_type, true).expect("cant c-repr type for src item"); + let dst_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().dst_type, true).expect("cant c-repr type for dst item"); - let length_c_type = get_c_repr_type(dict, length_type.clone(), true).expect("cant c-repr type for array length"); - let src_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().src_type, true).expect("cant c-repr type for src item"); - let dst_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().dst_type, true).expect("cant c-repr type for dst item"); - let src_c_type = encode_type_to_symbol(dict, &ty.src_type); - let dst_c_type = encode_type_to_symbol(dict, &ty.dst_type); + // todo: self.add_active_length_prefix_map() - // todo: self.add_active_length_prefix_map() + let map_fn = format!("length_prefix_{}_array_map_{}_to_{}", + length_c_type, src_item_c_type, dst_item_c_type + ); + let c_source = format!(r#" + return {} ( {}, src, dst );"#, + map_fn, + item_morph_symbol, + ); - let map_fn = format!("length_prefix_{}_array_map_{}_to_{}", - length_c_type, src_item_c_type, dst_item_c_type - ); - - let src_buf = if i%2 == 0 { "bufA" } else { "bufB" }; - let dst_buf = if i%2 == 0 { "bufB" } else { "bufA" }; - let c_source = format!(r#" - {{ - {} const * restrict src = (void*) {}; - {} * restrict dst = (void*) {}; - FUSE( {} ( {}, src, dst ); - }}"#, - src_c_type, src_buf, - dst_c_type, dst_buf, - map_fn, - item_morph_symbol, - ); - - Ok(LdmcPrimMorph{ - symbol, type_args: Vec::new(), ty, - c_source - }) + Ok(LdmcPrimMorph{ + symbol, type_args: Vec::new(), ty, + c_source + }) + } else { + eprintln!("Error: Unknown Seq- Representation!!"); + Err(()) + } } else { - eprintln!("Error: Unknown Seq- Representation!!"); + eprintln!("Error: missing Seq- Representation!!"); Err(()) } } else { - eprintln!("Error: missing Seq- Representation!!"); + eprintln!("failed to add item-morph instantiation"); Err(()) } },