``` #include <array/length-prefix.h> ``` morph_nat_as_u64_to_pos () ℕ ~ native.UInt64 --> ℕ ~ <PosInt 0 LittleEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit 0>~native.UInt64> ``` dst->len = 1; dst->items[0] = *src; return 0; ``` morph_nat_as_pos_to_u64 (Endianness:Type) ℕ ~ <PosInt 0 Endianness> ~ <Seq~<LengthPrefix native.UInt64> <Digit 0>~native.UInt64> --> ℕ ~ native.UInt64 ``` *dst = src->items[0]; return 0; ``` morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ) ℕ ~ <PosInt SrcRadix LittleEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit SrcRadix>~native.UInt64> --> ℕ ~ <PosInt DstRadix LittleEndian> ~ <Seq~<LenghtPrefix native.UInt64> <Digit DstRadix>~native.UInt64> ``` uint64_t value = 0; for( uint64_t i = 0; i < src->len; ++i ) { value *= SrcRadix; value += src->items[src->len - i - 1]; } length_prefix_uint64_t_array_uint64_t_clear( dst ); #if DstRadix==0 length_prefix_uint64_t_array_uint64_t_push( dst, value ); #else if( value == 0 ) { length_prefix_uint64_t_array_uint64_t_push( dst, 0 ); } else while( value > 0 ) { length_prefix_uint64_t_array_uint64_t_push( dst, value % DstRadix ); value /= DstRadix; } #endif return 0; ``` morph_posint_radix_be (SrcRadix:ℤ, DstRadix:ℤ) ℕ ~ <PosInt SrcRadix BigEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit SrcRadix>~native.UInt64> --> ℕ ~ <PosInt DstRadix BigEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit DstRadix>~native.UInt64> ``` uint64_t value = 0; for( uint64_t i = 0; i < src->len; ++i ) { value *= SrcRadix; value += src->items[i]; } #if DstRadix==0 dst->len = 1; dst->items[0] = value; #else uint64_t v = value; dst->len = 0; if( v == 0 ) { dst->len = 1; } else while( v ) { dst->len++; v /= DstRadix; } uint64_t i = dst->len; while( value > 0 ) { dst->items[--i] = value % DstRadix; value /= DstRadix; } #endif return 0; ``` morph_posint_endianness (Radix:ℤ) ℕ ~ <PosInt Radix LittleEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64> --> ℕ ~ <PosInt Radix BigEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64> ``` return length_prefix_uint64_t_array_uint64_t_reverse( src, dst ); ``` morph_posint_endianness (Radix:ℤ) ℕ ~ <PosInt Radix BigEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64> --> ℕ ~ <PosInt Radix LittleEndian> ~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64> ``` return length_prefix_uint64_t_array_uint64_t_reverse( src, dst ); ```