diff options
-rw-r--r-- | mini-gmp/ChangeLog | 5 | ||||
-rw-r--r-- | mini-gmp/mini-gmp.c | 24 | ||||
-rw-r--r-- | mini-gmp/mini-gmp.h | 4 | ||||
-rw-r--r-- | mini-gmp/tests/t-signed.c | 145 |
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); } |