14 #include "cln/number.h"
17 #include "cln/integer_io.h"
18 #include "cln/exception.h"
23 uint64 cl_I_to_UQ (const cl_I& obj)
27 var sintV wert = FN_to_V(obj);
29 return (uint64)(uintV)wert;
32 var cl_heap_bignum* bn = TheBignum(obj);
33 var uintC len = bn->length;
34 if ((sintD)mspref(arrayMSDptr(bn->data,len),0) < 0)
36 #define IF_LENGTH(i) \
37 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
38 if (len == i) /* genau i Digits? */ \
39 /* 2^((i-1)*intDsize-1) <= obj < 2^(i*intDsize-1) */ \
40 if ( (i*intDsize-1 > 64) \
41 && ( ((i-1)*intDsize-1 >= 64) \
42 || (mspref(arrayMSDptr(bn->data,len),0) >= (uintD)bitc(64-(i-1)*intDsize)) \
48 return (uint64)arrayLSref(bn->data,1,0);
50 return (uint64)arrayLSref(bn->data,2,0);
54 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
56 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2));
58 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,3) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,3));
62 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
64 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
66 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,3) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,3));
68 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4));
70 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,5) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,5));
74 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
76 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
78 return (uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,3));
80 return (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,4));
82 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,5) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,5));
84 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,6) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,6));
86 return ((uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,7) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,7));
88 return ((uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8));
90 return ((uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,9) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,9));
94 bad: // unpassendes Objekt
95 std::ostringstream buf;
96 fprint(buf, "Not a 64-bit integer: ");
98 throw runtime_exception(buf.str());