From 1869176bb76eacab41f318f3ecab08666e2a9c9a Mon Sep 17 00:00:00 2001 From: Michael Sippel <micha@fragmental.art> Date: Thu, 20 Mar 2025 19:49:03 +0100 Subject: [PATCH] make MsbCont morphism generic over item type --- morphisms/length_prefix.morphism-base | 29 ++++++--------------------- src/c_gen.rs | 11 +++++++++- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/morphisms/length_prefix.morphism-base b/morphisms/length_prefix.morphism-base index 58aa39e..6718c16 100644 --- a/morphisms/length_prefix.morphism-base +++ b/morphisms/length_prefix.morphism-base @@ -27,37 +27,20 @@ morph_array_as_lenpfx_to_valterm (Terminator:native.UInt8) return 0; ``` -morph_array_as_lenpfx_to_continuation_bit_8 () - <Seq~<LengthPrefix native.UInt64> native.UInt8> ---> <Seq~MsbCont native.UInt8> +morph_array_as_lenpfx_to_continuation_bit (T:Type) + <Seq~<LengthPrefix native.UInt64> T> +--> <Seq~MsbCont T> ``` for( uint64_t i = 0; i < src->len; ++i ) { - if( src->items[i] & (1<<7) ) { + const size_t n_bits = 8*sizeof(T); + if( src->items[i] & (1<<(n_bits-1)) ) { fprintf(stderr, "error: value to high for MsbContinuation\n"); return -1; } dst[i] = src->items[i]; if( i+1 < src->len ) - dst[i] |= (1<<7); - } - - return 0; -``` - -morph_array_as_lenpfx_to_continuation_bit_16 () - <Seq~<LengthPrefix native.UInt64> native.UInt16> ---> <Seq~MsbCont native.UInt16> -``` - for( uint64_t i = 0; i < src->len; ++i ) { - if( src->items[i] & (1<<15) ) { - fprintf(stderr, "error: value to high for MsbContinuation\n"); - return -1; - } - - dst[i] = src->items[i]; - if( i+1 < src->len ) - dst[i] |= (1<<15); + dst[i] |= (1<<(n_bits-1)); } return 0; diff --git a/src/c_gen.rs b/src/c_gen.rs index 3de02aa..ac68a93 100644 --- a/src/c_gen.rs +++ b/src/c_gen.rs @@ -295,7 +295,16 @@ int {} ( {} const * restrict src, {} * restrict dst ) {{ )); for (ty_id, kind) in self.type_args.iter() { if let Some(val) = σ.get(ty_id) { - s.push_str(&format!(" #define {} {}\n", dict.get_typename(&ty_id).unwrap(), encode_type_to_value(dict, val))); + eprintln!("val = {}", dict.unparse(&val)); + + let type_var_value = + if let Some(c_repr_type) = get_c_repr_type(dict, val.clone(), true) { + c_repr_type + } else { + encode_type_to_value(dict, val) + }; + + s.push_str(&format!(" #define {} {}\n", dict.get_typename(&ty_id).unwrap(), type_var_value)); } }