summaryrefslogtreecommitdiff
path: root/mini-gmp
diff options
context:
space:
mode:
authorNiels M?ller <nisse@lysator.liu.se>2020-04-20 17:25:22 +0200
committerNiels M?ller <nisse@lysator.liu.se>2020-04-20 17:25:22 +0200
commit96b35cb3bf61d7883d67e42c1a796513abdd5082 (patch)
tree0912288360b308bbf3e24544dcb48afb2fcbef13 /mini-gmp
parent3ed5a1dbb1d7af03c416f7f8e6d86e23a3b7ce40 (diff)
downloadgmp-96b35cb3bf61d7883d67e42c1a796513abdd5082.tar.gz
mini-gmp: More functions mpz_fits_*_p.
New functions mpz_fits_sint_p, mpz_fits_uint_p, mpz_fits_sshort_p, and mpz_fits_ushort_p. New tests, contributed by Marco.
Diffstat (limited to 'mini-gmp')
-rw-r--r--mini-gmp/ChangeLog5
-rw-r--r--mini-gmp/mini-gmp.c24
-rw-r--r--mini-gmp/mini-gmp.h4
-rw-r--r--mini-gmp/tests/t-signed.c145
4 files changed, 177 insertions, 1 deletions
diff --git a/mini-gmp/ChangeLog b/mini-gmp/ChangeLog
index 6431b7ed2..8c235133d 100644
--- a/mini-gmp/ChangeLog
+++ b/mini-gmp/ChangeLog
@@ -1,6 +1,11 @@
2020-04-20 Niels Möller <nisse@lysator.liu.se>
* mini-gmp.c (mpz_fits_slong_p): Simplify, by using mpz_cmp_si.
+ (mpz_fits_sint_p, mpz_fits_uint_p, mpz_fits_sshort_p)
+ (mpz_fits_ushort_p): New functions.
+ * mini-gmp.h: Declare new functions.
+ * tests/t-signed.c (try_fits_utype_p, try_fits_sint_p)
+ (try_fits_sshort_p): New tests.
2020-02-02 Marco Bodrato <bodrato@mail.dm.unipi.it>
diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c
index e5dc556af..e20b94ab7 100644
--- a/mini-gmp/mini-gmp.c
+++ b/mini-gmp/mini-gmp.c
@@ -1564,6 +1564,30 @@ mpz_fits_ulong_p (const mpz_t u)
return us >= 0 && mpn_absfits_ulong_p (u->_mp_d, us);
}
+int
+mpz_fits_sint_p (const mpz_t u)
+{
+ return mpz_cmp_si (u, INT_MAX) <= 0 && mpz_cmp_si (u, INT_MIN) >= 0;
+}
+
+int
+mpz_fits_uint_p (const mpz_t u)
+{
+ return u->_mp_size >= 0 && mpz_cmpabs_ui (u, UINT_MAX) <= 0;
+}
+
+int
+mpz_fits_sshort_p (const mpz_t u)
+{
+ return mpz_cmp_si (u, SHRT_MAX) <= 0 && mpz_cmp_si (u, SHRT_MIN) >= 0;
+}
+
+int
+mpz_fits_ushort_p (const mpz_t u)
+{
+ return u->_mp_size >= 0 && mpz_cmpabs_ui (u, USHRT_MAX) <= 0;
+}
+
long int
mpz_get_si (const mpz_t u)
{
diff --git a/mini-gmp/mini-gmp.h b/mini-gmp/mini-gmp.h
index 7cce3f7a3..ef64823d4 100644
--- a/mini-gmp/mini-gmp.h
+++ b/mini-gmp/mini-gmp.h
@@ -244,6 +244,10 @@ mp_bitcnt_t mpz_scan1 (const mpz_t, mp_bitcnt_t);
int mpz_fits_slong_p (const mpz_t);
int mpz_fits_ulong_p (const mpz_t);
+int mpz_fits_sint_p (const mpz_t);
+int mpz_fits_uint_p (const mpz_t);
+int mpz_fits_sshort_p (const mpz_t);
+int mpz_fits_ushort_p (const mpz_t);
long int mpz_get_si (const mpz_t);
unsigned long int mpz_get_ui (const mpz_t);
double mpz_get_d (const mpz_t);
diff --git a/mini-gmp/tests/t-signed.c b/mini-gmp/tests/t-signed.c
index e183944d7..cfa40d717 100644
--- a/mini-gmp/tests/t-signed.c
+++ b/mini-gmp/tests/t-signed.c
@@ -1,6 +1,6 @@
/* Exercise some mpz_..._si functions.
-Copyright 2013, 2016 Free Software Foundation, Inc.
+Copyright 2013, 2016, 2020 Free Software Foundation, Inc.
This file is part of the GNU MP Library test suite.
@@ -197,9 +197,152 @@ try_fits_slong_p (void)
}
void
+try_fits_utype_p (void)
+{
+ mpz_t x;
+ mpz_init (x);
+ if (!mpz_fits_ulong_p (x))
+ {
+ printf ("mpz_fits_ulong_p (0) false!\n");
+ abort ();
+ }
+ if (!mpz_fits_uint_p (x))
+ {
+ printf ("mpz_fits_uint_p (0) false!\n");
+ abort ();
+ }
+ if (!mpz_fits_ushort_p (x))
+ {
+ printf ("mpz_fits_udhort_p (0) false!\n");
+ abort ();
+ }
+ mpz_set_si (x, -1);
+ if (mpz_fits_ulong_p (x))
+ {
+ printf ("mpz_fits_ulong_p (- 1) true!\n");
+ abort ();
+ }
+ if (mpz_fits_uint_p (x))
+ {
+ printf ("mpz_fits_uint_p (- 1) true!\n");
+ abort ();
+ }
+ if (mpz_fits_ushort_p (x))
+ {
+ printf ("mpz_fits_ushort_p (- 1) true!\n");
+ abort ();
+ }
+ mpz_set_ui (x, ULONG_MAX);
+ if (!mpz_fits_ulong_p (x))
+ {
+ printf ("mpz_fits_ulong_p (ULONG_MAX) false!\n");
+ abort ();
+ }
+ mpz_add_ui (x, x, 1);
+ if (mpz_fits_ulong_p (x))
+ {
+ printf ("mpz_fits_ulong_p (ULONG_MAX + 1) true!\n");
+ abort ();
+ }
+ mpz_set_ui (x, UINT_MAX);
+ if (!mpz_fits_uint_p (x))
+ {
+ printf ("mpz_fits_uint_p (UINT_MAX) false!\n");
+ abort ();
+ }
+ mpz_add_ui (x, x, 1);
+ if (mpz_fits_uint_p (x))
+ {
+ printf ("mpz_fits_uint_p (UINT_MAX + 1) true!\n");
+ abort ();
+ }
+ mpz_set_ui (x, USHRT_MAX);
+ if (!mpz_fits_ushort_p (x))
+ {
+ printf ("mpz_fits_ushort_p (USHRT_MAX) false!\n");
+ abort ();
+ }
+ mpz_add_ui (x, x, 1);
+ if (mpz_fits_ushort_p (x))
+ {
+ printf ("mpz_fits_ushort_p (USHRT_MAX + 1) true!\n");
+ abort ();
+ }
+
+ mpz_clear (x);
+}
+
+void
+try_fits_sint_p (void)
+{
+ mpz_t x;
+ mpz_init_set_si (x, INT_MAX);
+ if (!mpz_fits_sint_p (x))
+ {
+ printf ("mpz_fits_sint_p (INT_MAX) false!\n");
+ abort ();
+ }
+ mpz_add_ui (x, x, 1);
+ if (mpz_fits_sint_p (x))
+ {
+ printf ("mpz_fits_sint_p (INT_MAX + 1) true!\n");
+ abort ();
+ }
+ mpz_set_si (x, INT_MIN);
+ if (!mpz_fits_sint_p (x))
+ {
+ printf ("mpz_fits_sint_p (INT_MIN) false!\n");
+ abort ();
+ }
+ mpz_sub_ui (x, x, 1);
+ if (mpz_fits_sint_p (x))
+ {
+ printf ("mpz_fits_sint_p (INT_MIN - 1) true!\n");
+ abort ();
+ }
+
+ mpz_clear (x);
+}
+
+void
+try_fits_sshort_p (void)
+{
+ mpz_t x;
+ mpz_init_set_si (x, SHRT_MAX);
+ if (!mpz_fits_sshort_p (x))
+ {
+ printf ("mpz_fits_sshort_p (SHRT_MAX) false!\n");
+ abort ();
+ }
+ mpz_add_ui (x, x, 1);
+ if (mpz_fits_sshort_p (x))
+ {
+ printf ("mpz_fits_sshort_p (SHRT_MAX + 1) true!\n");
+ abort ();
+ }
+ mpz_set_si (x, SHRT_MIN);
+ if (!mpz_fits_sshort_p (x))
+ {
+ printf ("mpz_fits_sshort_p (SHRT_MIN) false!\n");
+ abort ();
+ }
+ mpz_sub_ui (x, x, 1);
+ if (mpz_fits_sshort_p (x))
+ {
+ printf ("mpz_fits_sshort_p (SHRT_MIN - 1) true!\n");
+ abort ();
+ }
+
+ mpz_clear (x);
+}
+
+void
testmain (int argc, char *argv[])
{
try_fits_slong_p ();
+ try_fits_sint_p ();
+ try_fits_sshort_p ();
+ try_fits_utype_p ();
try_op_si (-1);
try_op_si (1);
}