2025-03-15 18:28:57 +01:00
|
|
|
|
```
|
|
|
|
|
#include <array/length-prefix.h>
|
|
|
|
|
```
|
2025-02-20 02:23:58 +01:00
|
|
|
|
|
|
|
|
|
morph_nat_as_u64_to_pos ()
|
|
|
|
|
ℕ
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ native.UInt64
|
2025-02-20 02:23:58 +01:00
|
|
|
|
--> ℕ
|
|
|
|
|
~ <PosInt 0 LittleEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit 0>~native.UInt64>
|
2025-02-20 02:23:58 +01:00
|
|
|
|
```
|
|
|
|
|
dst->len = 1;
|
|
|
|
|
dst->items[0] = *src;
|
|
|
|
|
return 0;
|
|
|
|
|
```
|
|
|
|
|
|
2025-03-18 14:05:42 +01:00
|
|
|
|
morph_nat_as_pos_to_u64 (Endianness:Type)
|
2025-02-20 02:23:58 +01:00
|
|
|
|
ℕ
|
2025-03-18 14:05:42 +01:00
|
|
|
|
~ <PosInt 0 Endianness>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit 0>~native.UInt64>
|
2025-02-20 02:23:58 +01:00
|
|
|
|
--> ℕ
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ native.UInt64
|
2025-02-20 02:23:58 +01:00
|
|
|
|
```
|
|
|
|
|
*dst = src->items[0];
|
|
|
|
|
return 0;
|
|
|
|
|
```
|
|
|
|
|
|
2025-02-14 13:54:59 +01:00
|
|
|
|
morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ)
|
2025-01-28 22:33:08 +01:00
|
|
|
|
ℕ
|
|
|
|
|
~ <PosInt SrcRadix LittleEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit SrcRadix>~native.UInt64>
|
2025-01-28 22:33:08 +01:00
|
|
|
|
--> ℕ
|
|
|
|
|
~ <PosInt DstRadix LittleEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LenghtPrefix native.UInt64> <Digit DstRadix>~native.UInt64>
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|
|
|
|
|
uint64_t value = 0;
|
|
|
|
|
|
|
|
|
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
|
|
|
|
value *= SrcRadix;
|
|
|
|
|
value += src->items[src->len - i - 1];
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-20 16:16:41 +01:00
|
|
|
|
length_prefix_uint64_t_array_uint64_t_clear( dst );
|
2025-02-16 17:08:55 +01:00
|
|
|
|
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#if DstRadix==0
|
2025-03-20 16:16:41 +01:00
|
|
|
|
length_prefix_uint64_t_array_uint64_t_push( dst, value );
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#else
|
|
|
|
|
if( value == 0 ) {
|
2025-03-20 16:16:41 +01:00
|
|
|
|
length_prefix_uint64_t_array_uint64_t_push( dst, 0 );
|
2025-03-18 14:05:42 +01:00
|
|
|
|
} else while( value > 0 ) {
|
2025-03-20 16:16:41 +01:00
|
|
|
|
length_prefix_uint64_t_array_uint64_t_push( dst, value % DstRadix );
|
2025-02-20 02:23:58 +01:00
|
|
|
|
value /= DstRadix;
|
|
|
|
|
}
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#endif
|
2025-02-16 17:08:55 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
```
|
2025-01-28 22:33:08 +01:00
|
|
|
|
|
2025-02-14 13:54:59 +01:00
|
|
|
|
morph_posint_radix_be (SrcRadix:ℤ, DstRadix:ℤ)
|
|
|
|
|
ℕ
|
|
|
|
|
~ <PosInt SrcRadix BigEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit SrcRadix>~native.UInt64>
|
2025-02-14 13:54:59 +01:00
|
|
|
|
--> ℕ
|
|
|
|
|
~ <PosInt DstRadix BigEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit DstRadix>~native.UInt64>
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|
|
|
|
|
uint64_t value = 0;
|
|
|
|
|
|
|
|
|
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
|
|
|
|
value *= SrcRadix;
|
|
|
|
|
value += src->items[i];
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#if DstRadix==0
|
2025-02-20 02:23:58 +01:00
|
|
|
|
dst->len = 1;
|
|
|
|
|
dst->items[0] = value;
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#else
|
2025-02-20 02:23:58 +01:00
|
|
|
|
uint64_t v = value;
|
|
|
|
|
dst->len = 0;
|
2025-03-18 14:05:42 +01:00
|
|
|
|
|
|
|
|
|
if( v == 0 ) {
|
|
|
|
|
dst->len = 1;
|
|
|
|
|
} else while( v ) {
|
2025-02-20 02:23:58 +01:00
|
|
|
|
dst->len++;
|
|
|
|
|
v /= DstRadix;
|
|
|
|
|
}
|
2025-02-16 17:08:55 +01:00
|
|
|
|
|
2025-02-20 02:23:58 +01:00
|
|
|
|
uint64_t i = dst->len;
|
|
|
|
|
while( value > 0 ) {
|
|
|
|
|
dst->items[--i] = value % DstRadix;
|
|
|
|
|
value /= DstRadix;
|
|
|
|
|
}
|
2025-03-18 14:05:42 +01:00
|
|
|
|
#endif
|
2025-02-16 17:08:55 +01:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
```
|
2025-02-14 13:54:59 +01:00
|
|
|
|
|
2025-01-28 22:33:08 +01:00
|
|
|
|
morph_posint_endianness (Radix:ℤ)
|
|
|
|
|
ℕ
|
|
|
|
|
~ <PosInt Radix LittleEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
2025-01-28 22:33:08 +01:00
|
|
|
|
--> ℕ
|
|
|
|
|
~ <PosInt Radix BigEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|
2025-03-20 16:16:41 +01:00
|
|
|
|
return length_prefix_uint64_t_array_uint64_t_reverse( src, dst );
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|
2025-01-28 22:33:08 +01:00
|
|
|
|
|
|
|
|
|
morph_posint_endianness (Radix:ℤ)
|
|
|
|
|
ℕ
|
|
|
|
|
~ <PosInt Radix BigEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
2025-01-28 22:33:08 +01:00
|
|
|
|
--> ℕ
|
|
|
|
|
~ <PosInt Radix LittleEndian>
|
2025-03-20 16:28:16 +01:00
|
|
|
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|
2025-03-20 16:16:41 +01:00
|
|
|
|
return length_prefix_uint64_t_array_uint64_t_reverse( src, dst );
|
2025-02-16 17:08:55 +01:00
|
|
|
|
```
|