4 #include "base/cl_sysdep.h"
7 #include "integer/cl_I.h"
14 #include "cln/number.h"
15 #include "base/digitseq/cl_DS.h"
17 #include "cln/integer_io.h"
18 #include "cln/exception.h"
23 sint64 cl_I_to_Q (const cl_I& obj)
27 return (sint64)(sintV)FN_to_V(obj);
29 var cl_heap_bignum* bn = TheBignum(obj);
30 var uintC len = bn->length;
31 if ((sintD)mspref(arrayMSDptr(bn->data,len),0) >= 0) {
33 #define IF_LENGTH(i) \
34 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
35 if (len == i) /* genau i Digits? */ \
36 /* 2^((i-1)*intDsize-1) <= obj < 2^(i*intDsize-1) */ \
37 if ( (i*intDsize > 64) \
38 && ( ((i-1)*intDsize >= 64) \
39 || (mspref(arrayMSDptr(bn->data,len),0) >= (uintD)bitc(63-(i-1)*intDsize)) \
45 return (uint64)arrayLSref(bn->data,1,0);
49 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
51 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2));
55 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
57 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
59 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,3) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,3));
61 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4));
65 return (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,1));
67 return (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,2));
69 return (uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,3));
71 return (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,4));
73 return ((uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,5) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,5));
75 return ((uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,6) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,6));
77 return ((uint64)get_uint3D_Dptr(arrayLSDptr(bn->data,7) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,7));
79 return ((uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8));
84 #define IF_LENGTH(i) \
85 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
86 if (len == i) /* genau i Digits? */ \
87 /* - 2^(i*intDsize-1) <= obj < - 2^((i-1)*intDsize-1) */ \
88 if ( (i*intDsize > 64) \
89 && ( ((i-1)*intDsize >= 64) \
90 || (mspref(arrayMSDptr(bn->data,len),0) < (uintD)(-bitc(63-(i-1)*intDsize))) \
96 return (sint64)arrayLSref(bn->data,1,0);
100 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
102 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,2) lspop 1) << 32) | (uint64)get_uint1D_Dptr(arrayLSDptr(bn->data,2));
106 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
108 return (sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,2));
110 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,3) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,3));
112 return ((sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,4) lspop 2) << 32) | (uint64)get_uint2D_Dptr(arrayLSDptr(bn->data,4));
116 return (sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,1));
118 return (sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,2));
120 return (sint64)get_sint3D_Dptr(arrayLSDptr(bn->data,3));
122 return (sint64)get_sint4D_Dptr(arrayLSDptr(bn->data,4));
124 return ((sint64)get_sint1D_Dptr(arrayLSDptr(bn->data,5) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,5));
126 return ((sint64)get_sint2D_Dptr(arrayLSDptr(bn->data,6) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,6));
128 return ((sint64)get_sint3D_Dptr(arrayLSDptr(bn->data,7) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,7));
130 return ((sint64)get_sint4D_Dptr(arrayLSDptr(bn->data,8) lspop 4) << 32) | (uint64)get_uint4D_Dptr(arrayLSDptr(bn->data,8));
134 bad: // unpassendes Objekt
135 std::ostringstream buf;
136 fprint(buf, "Not a 64-bit integer: ");
138 throw runtime_exception(buf.str());