morphisms: add posint to u64 and vice-versa
This commit is contained in:
parent
24e28e7bb5
commit
d6107601a6
1 changed files with 46 additions and 13 deletions
|
@ -1,3 +1,27 @@
|
||||||
|
|
||||||
|
morph_nat_as_u64_to_pos ()
|
||||||
|
ℕ
|
||||||
|
~ x86.UInt64
|
||||||
|
--> ℕ
|
||||||
|
~ <PosInt 0 LittleEndian>
|
||||||
|
~ <Seq~<LengthPrefix x86.UInt64> <Digit 0>~x86.UInt64>
|
||||||
|
```
|
||||||
|
dst->len = 1;
|
||||||
|
dst->items[0] = *src;
|
||||||
|
return 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
morph_nat_as_u64_to_pos ()
|
||||||
|
ℕ
|
||||||
|
~ <PosInt 0 LittleEndian>
|
||||||
|
~ <Seq~<LengthPrefix x86.UInt64> <Digit 0>~x86.UInt64>
|
||||||
|
--> ℕ
|
||||||
|
~ x86.UInt64
|
||||||
|
```
|
||||||
|
*dst = src->items[0];
|
||||||
|
return 0;
|
||||||
|
```
|
||||||
|
|
||||||
morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ)
|
morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ)
|
||||||
ℕ
|
ℕ
|
||||||
~ <PosInt SrcRadix LittleEndian>
|
~ <PosInt SrcRadix LittleEndian>
|
||||||
|
@ -15,9 +39,13 @@ morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ)
|
||||||
|
|
||||||
length_prefix_uint64_array_clear( dst );
|
length_prefix_uint64_array_clear( dst );
|
||||||
|
|
||||||
while( value > 0 ) {
|
if( DstRadix == 0 ) {
|
||||||
length_prefix_uint64_array_push( dst, value % DstRadix );
|
length_prefix_uint64_array_push( dst, value );
|
||||||
value /= DstRadix;
|
} else if( DstRadix > 0 ) {
|
||||||
|
while( value > 0 ) {
|
||||||
|
length_prefix_uint64_array_push( dst, value % DstRadix );
|
||||||
|
value /= DstRadix;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -38,17 +66,22 @@ morph_posint_radix_be (SrcRadix:ℤ, DstRadix:ℤ)
|
||||||
value += src->items[i];
|
value += src->items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t v = value;
|
if( DstRadix == 0 ) {
|
||||||
dst->len = 0;
|
dst->len = 1;
|
||||||
while( v ) {
|
dst->items[0] = value;
|
||||||
dst->len++;
|
} else {
|
||||||
v /= DstRadix;
|
uint64_t v = value;
|
||||||
}
|
dst->len = 0;
|
||||||
|
while( v ) {
|
||||||
|
dst->len++;
|
||||||
|
v /= DstRadix;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t i = dst->len;
|
uint64_t i = dst->len;
|
||||||
while( value > 0 ) {
|
while( value > 0 ) {
|
||||||
dst->items[--i] = ( dst, value % DstRadix );
|
dst->items[--i] = value % DstRadix;
|
||||||
value /= DstRadix;
|
value /= DstRadix;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue