|
|
e0c8972 |
--- src/gmpints.c.orig 2016-03-19 16:35:29.000000000 -0600
|
|
|
e0c8972 |
+++ src/gmpints.c 2016-04-02 07:38:28.517903402 -0600
|
|
|
e0c8972 |
@@ -377,6 +377,41 @@ Obj ObjInt_UInt( UInt i )
|
|
|
e0c8972 |
}
|
|
|
e0c8972 |
}
|
|
|
e0c8972 |
|
|
|
e0c8972 |
+Obj ObjInt_LongLong( long long i )
|
|
|
e0c8972 |
+{
|
|
|
e0c8972 |
+ Obj gmp;
|
|
|
e0c8972 |
+ unsigned long long ull;
|
|
|
e0c8972 |
+ size_t j;
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+ if ( (-(1LL<
|
|
|
e0c8972 |
+ return INTOBJ_INT((Int) i);
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+ if ( i >= 0LL ) {
|
|
|
e0c8972 |
+ gmp = NewBag( T_INTPOS, sizeof(i) );
|
|
|
e0c8972 |
+ ull = (unsigned long long) i;
|
|
|
e0c8972 |
+ }
|
|
|
e0c8972 |
+ else {
|
|
|
e0c8972 |
+ gmp = NewBag( T_INTNEG, sizeof(i) );
|
|
|
e0c8972 |
+ ull = (unsigned long long) -i;
|
|
|
e0c8972 |
+ }
|
|
|
e0c8972 |
+ for ( j = 0U; j < sizeof(i) / sizeof(TypLimb); j++ )
|
|
|
e0c8972 |
+ ((TypLimb *)ADDR_OBJ( gmp ))[j] = ull >> (j * sizeof(TypLimb));
|
|
|
e0c8972 |
+ return GMP_NORMALIZE( gmp );
|
|
|
e0c8972 |
+}
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+Obj ObjInt_ULongLong( unsigned long long i )
|
|
|
e0c8972 |
+{
|
|
|
e0c8972 |
+ Obj gmp;
|
|
|
e0c8972 |
+ size_t j;
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+ if ( i < 1ULL<
|
|
|
e0c8972 |
+ return INTOBJ_INT((Int) i);
|
|
|
e0c8972 |
+ gmp = NewBag( T_INTPOS, sizeof(i) );
|
|
|
e0c8972 |
+ for ( j = 0U; j < sizeof(i) / sizeof(TypLimb); j++ )
|
|
|
e0c8972 |
+ ((TypLimb *)ADDR_OBJ( gmp ))[j] = i >> (j * sizeof(TypLimb));
|
|
|
e0c8972 |
+ return GMP_NORMALIZE( gmp );
|
|
|
e0c8972 |
+}
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
|
|
|
e0c8972 |
/****************************************************************************
|
|
|
e0c8972 |
**
|
|
|
e0c8972 |
--- src/gmpints.h.orig 2016-03-19 16:35:29.000000000 -0600
|
|
|
e0c8972 |
+++ src/gmpints.h 2016-04-02 07:38:28.518903322 -0600
|
|
|
e0c8972 |
@@ -87,6 +87,21 @@ typedef mp_size_t TypGMPSize;
|
|
|
e0c8972 |
Obj ObjInt_Int(Int i);
|
|
|
e0c8972 |
Obj ObjInt_UInt(UInt i);
|
|
|
e0c8972 |
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+/**************************************************************************
|
|
|
e0c8972 |
+** The following two functions convert a C long long or unsigned long long
|
|
|
e0c8972 |
+** respectively into* a GAP integer, either an immediate, small integer if
|
|
|
e0c8972 |
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+*F ObjInt_LongLong(long long i)
|
|
|
e0c8972 |
+*F ObjInt_ULongLong(unsigned long long i)
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+****************************************************************************/
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+Obj ObjInt_LongLong(long long i);
|
|
|
e0c8972 |
+Obj ObjInt_ULongLong(unsigned long long i);
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
/****************************************************************************
|
|
|
e0c8972 |
**
|
|
|
e0c8972 |
*/
|
|
|
e0c8972 |
--- src/integer.c.orig 2016-03-19 16:35:29.000000000 -0600
|
|
|
e0c8972 |
+++ src/integer.c 2016-04-02 07:38:28.520903161 -0600
|
|
|
e0c8972 |
@@ -216,6 +216,58 @@ Obj ObjInt_UInt(UInt i)
|
|
|
e0c8972 |
}
|
|
|
e0c8972 |
|
|
|
e0c8972 |
|
|
|
e0c8972 |
+/**************************************************************************
|
|
|
e0c8972 |
+** The following two functions convert a C long long or unsigned long long
|
|
|
e0c8972 |
+** respectively into a GAP integer, either an immediate, small integer if
|
|
|
e0c8972 |
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+*F ObjInt_LongLong(long long i)
|
|
|
e0c8972 |
+*F ObjInt_ULongLong(unsigned long long i)
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+****************************************************************************/
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+#define NDIGITS_RAW (sizeof (long long) / sizeof (TypDigit))
|
|
|
e0c8972 |
+#define NDIGITS (NDIGITS_RAW >= 4U ? NDIGITS_RAW : 4U)
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+Obj ObjInt_LongLong(long long i)
|
|
|
e0c8972 |
+{
|
|
|
e0c8972 |
+ Obj n;
|
|
|
e0c8972 |
+ long long bound = 1LL << NR_SMALL_INT_BITS;
|
|
|
e0c8972 |
+ if (i >= bound) {
|
|
|
e0c8972 |
+ /* We have to make a big integer */
|
|
|
e0c8972 |
+ size_t j;
|
|
|
e0c8972 |
+ n = NewBag(T_INTPOS, NDIGITS);
|
|
|
e0c8972 |
+ for ( j = 0U; j < NDIGITS; j++ )
|
|
|
e0c8972 |
+ ADDR_INT(n)[j] = (TypDigit) (i >> (j * NR_DIGIT_BITS));
|
|
|
e0c8972 |
+ return n;
|
|
|
e0c8972 |
+ } else if (-i > bound) {
|
|
|
e0c8972 |
+ size_t j;
|
|
|
e0c8972 |
+ n = NewBag(T_INTNEG, NDIGITS);
|
|
|
e0c8972 |
+ for ( j = 0U; j < NDIGITS; j++ )
|
|
|
e0c8972 |
+ ADDR_INT(n)[j] = (TypDigit) ((-i) >> (j * NR_DIGIT_BITS));
|
|
|
e0c8972 |
+ return n;
|
|
|
e0c8972 |
+ } else {
|
|
|
e0c8972 |
+ return INTOBJ_INT((Int) i);
|
|
|
e0c8972 |
+ }
|
|
|
e0c8972 |
+}
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+Obj ObjInt_ULongLong(unsigned long long i)
|
|
|
e0c8972 |
+{
|
|
|
e0c8972 |
+ Obj n;
|
|
|
e0c8972 |
+ unsigned long long bound = 1ULL << NR_SMALL_INT_BITS;
|
|
|
e0c8972 |
+ if (i >= bound) {
|
|
|
e0c8972 |
+ /* We have to make a big integer */
|
|
|
e0c8972 |
+ size_t j;
|
|
|
e0c8972 |
+ n = NewBag(T_INTPOS, NDIGITS);
|
|
|
e0c8972 |
+ for ( j = 0U; j < NDIGITS; j++ )
|
|
|
e0c8972 |
+ ADDR_INT(n)[j] = (TypDigit) (i >> (j * NR_DIGIT_BITS));
|
|
|
e0c8972 |
+ return n;
|
|
|
e0c8972 |
+ } else {
|
|
|
e0c8972 |
+ return INTOBJ_INT((Int) i);
|
|
|
e0c8972 |
+ }
|
|
|
e0c8972 |
+}
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
|
|
|
e0c8972 |
/****************************************************************************
|
|
|
e0c8972 |
**
|
|
|
e0c8972 |
--- src/integer.h.orig 2016-03-19 16:35:29.000000000 -0600
|
|
|
e0c8972 |
+++ src/integer.h 2016-04-02 07:38:28.521903081 -0600
|
|
|
e0c8972 |
@@ -59,6 +59,20 @@ Obj ObjInt_Int(Int i);
|
|
|
e0c8972 |
Obj ObjInt_UInt(UInt i);
|
|
|
e0c8972 |
|
|
|
e0c8972 |
|
|
|
e0c8972 |
+/**************************************************************************
|
|
|
e0c8972 |
+** The following two functions convert a C long long or unsigned long long
|
|
|
e0c8972 |
+** respectively into a GAP integer, either an immediate, small integer if
|
|
|
e0c8972 |
+** possible or otherwise a new GAP bag with TNUM T_INTPOS or T_INTNEG.
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+*F ObjInt_LongLong(long long i)
|
|
|
e0c8972 |
+*F ObjInt_ULongLong(unsigned long long i)
|
|
|
e0c8972 |
+**
|
|
|
e0c8972 |
+****************************************************************************/
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+Obj ObjInt_LongLong(long long i);
|
|
|
e0c8972 |
+Obj ObjInt_ULongLong(unsigned long long i);
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
+
|
|
|
e0c8972 |
/****************************************************************************
|
|
|
e0c8972 |
**
|
|
|
e0c8972 |
*F PrintInt( <int> ) . . . . . . . . . . . . . . . print an integer constant
|