diff options
author | Andy Wingo <wingo@pobox.com> | 2022-01-04 10:33:52 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2022-01-13 09:37:16 +0100 |
commit | 8b99ace658ab2bb3805f3262db122f39dd5cdff8 (patch) | |
tree | 073d77d549b45a42a410b6bec969278adaca410b /libguile/integers.h | |
parent | 7ec40fe5b08e5a05a0cd62f1f0920e83233d104e (diff) | |
download | guile-8b99ace658ab2bb3805f3262db122f39dd5cdff8.tar.gz |
Integer library takes bignums via opaque struct pointer
* libguile/integers.h (scm_bignum): Declare opaque struct type and a
function to cast SCM to this type. Adapt all routines that take bignums
to take a "struct scm_bignum *".
* libguile/integers.c: Adapt.
* libguile/numbers.c: Adapt all users.
Diffstat (limited to 'libguile/integers.h')
-rw-r--r-- | libguile/integers.h | 202 |
1 files changed, 86 insertions, 116 deletions
diff --git a/libguile/integers.h b/libguile/integers.h index 3955e5ea8..0ffe713a1 100644 --- a/libguile/integers.h +++ b/libguile/integers.h @@ -23,153 +23,123 @@ #include "libguile/numbers.h" +struct scm_bignum; + +static inline struct scm_bignum * +scm_bignum (SCM x) +{ + if (!SCM_BIGP (x)) abort (); + return (struct scm_bignum *) SCM_UNPACK (x); +} + SCM_INTERNAL int scm_is_integer_odd_i (scm_t_inum i); -SCM_INTERNAL int scm_is_integer_odd_z (SCM z); +SCM_INTERNAL int scm_is_integer_odd_z (struct scm_bignum *z); SCM_INTERNAL SCM scm_integer_abs_i (scm_t_inum i); -SCM_INTERNAL SCM scm_integer_abs_z (SCM z); - -SCM_INTERNAL SCM scm_integer_floor_quotient_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_floor_quotient_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_floor_quotient_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_floor_quotient_zz (SCM x, SCM y); - -SCM_INTERNAL SCM scm_integer_floor_remainder_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_floor_remainder_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_floor_remainder_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_floor_remainder_zz (SCM x, SCM y); - -SCM_INTERNAL void scm_integer_floor_divide_ii (scm_t_inum x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_floor_divide_iz (scm_t_inum x, SCM y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_floor_divide_zi (SCM x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_floor_divide_zz (SCM x, SCM y, - SCM *qp, SCM *rp); - -SCM_INTERNAL SCM scm_integer_ceiling_quotient_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_ceiling_quotient_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_ceiling_quotient_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_ceiling_quotient_zz (SCM x, SCM y); - -SCM_INTERNAL SCM scm_integer_ceiling_remainder_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_ceiling_remainder_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_ceiling_remainder_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_ceiling_remainder_zz (SCM x, SCM y); - -SCM_INTERNAL void scm_integer_ceiling_divide_ii (scm_t_inum x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_ceiling_divide_iz (scm_t_inum x, SCM y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_ceiling_divide_zi (SCM x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_ceiling_divide_zz (SCM x, SCM y, - SCM *qp, SCM *rp); - -SCM_INTERNAL SCM scm_integer_truncate_quotient_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_truncate_quotient_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_truncate_quotient_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_truncate_quotient_zz (SCM x, SCM y); - -SCM_INTERNAL SCM scm_integer_truncate_remainder_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_truncate_remainder_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_truncate_remainder_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_truncate_remainder_zz (SCM x, SCM y); - -SCM_INTERNAL void scm_integer_truncate_divide_ii (scm_t_inum x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_truncate_divide_iz (scm_t_inum x, SCM y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_truncate_divide_zi (SCM x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_truncate_divide_zz (SCM x, SCM y, - SCM *qp, SCM *rp); - -SCM_INTERNAL SCM scm_integer_centered_quotient_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_centered_quotient_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_centered_quotient_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_centered_quotient_zz (SCM x, SCM y); - -SCM_INTERNAL SCM scm_integer_centered_remainder_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_centered_remainder_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_centered_remainder_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_centered_remainder_zz (SCM x, SCM y); - -SCM_INTERNAL void scm_integer_centered_divide_ii (scm_t_inum x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_centered_divide_iz (scm_t_inum x, SCM y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_centered_divide_zi (SCM x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_centered_divide_zz (SCM x, SCM y, - SCM *qp, SCM *rp); - -SCM_INTERNAL SCM scm_integer_round_quotient_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_round_quotient_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_round_quotient_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_round_quotient_zz (SCM x, SCM y); - -SCM_INTERNAL SCM scm_integer_round_remainder_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_round_remainder_iz (scm_t_inum x, SCM y); -SCM_INTERNAL SCM scm_integer_round_remainder_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_round_remainder_zz (SCM x, SCM y); - -SCM_INTERNAL void scm_integer_round_divide_ii (scm_t_inum x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_round_divide_iz (scm_t_inum x, SCM y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_round_divide_zi (SCM x, scm_t_inum y, - SCM *qp, SCM *rp); -SCM_INTERNAL void scm_integer_round_divide_zz (SCM x, SCM y, - SCM *qp, SCM *rp); +SCM_INTERNAL SCM scm_integer_abs_z (struct scm_bignum *z); + +#define DECLARE_QUOTIENT_OPERATORS(stem) \ + SCM_INTERNAL SCM scm_integer_##stem##_quotient_ii (scm_t_inum x, \ + scm_t_inum y); \ + SCM_INTERNAL SCM scm_integer_##stem##_quotient_iz (scm_t_inum x, \ + struct scm_bignum *y); \ + SCM_INTERNAL SCM scm_integer_##stem##_quotient_zi (struct scm_bignum *x, \ + scm_t_inum y); \ + SCM_INTERNAL SCM scm_integer_##stem##_quotient_zz (struct scm_bignum *x, \ + struct scm_bignum *y); + +#define DECLARE_REMAINDER_OPERATORS(stem) \ + SCM_INTERNAL SCM scm_integer_##stem##_remainder_ii (scm_t_inum x, \ + scm_t_inum y); \ + SCM_INTERNAL SCM scm_integer_##stem##_remainder_iz (scm_t_inum x, \ + struct scm_bignum *y); \ + SCM_INTERNAL SCM scm_integer_##stem##_remainder_zi (struct scm_bignum *x, \ + scm_t_inum y); \ + SCM_INTERNAL SCM scm_integer_##stem##_remainder_zz (struct scm_bignum *x, \ + struct scm_bignum *y); + +#define DECLARE_DIVIDE_OPERATORS(stem) \ + SCM_INTERNAL void scm_integer_##stem##_divide_ii (scm_t_inum x, \ + scm_t_inum y, \ + SCM *qp, SCM *rp); \ + SCM_INTERNAL void scm_integer_##stem##_divide_iz (scm_t_inum x, \ + struct scm_bignum *y, \ + SCM *qp, SCM *rp); \ + SCM_INTERNAL void scm_integer_##stem##_divide_zi (struct scm_bignum *x, \ + scm_t_inum y, \ + SCM *qp, SCM *rp); \ + SCM_INTERNAL void scm_integer_##stem##_divide_zz (struct scm_bignum *x, \ + struct scm_bignum *y, \ + SCM *qp, SCM *rp); + +#define DECLARE_DIVISION_OPERATORS(stem) \ + DECLARE_QUOTIENT_OPERATORS(stem); \ + DECLARE_REMAINDER_OPERATORS(stem); \ + DECLARE_DIVIDE_OPERATORS(stem) + +DECLARE_DIVISION_OPERATORS(floor); +DECLARE_DIVISION_OPERATORS(ceiling); +DECLARE_DIVISION_OPERATORS(truncate); +DECLARE_DIVISION_OPERATORS(centered); +DECLARE_DIVISION_OPERATORS(round); SCM_INTERNAL SCM scm_integer_gcd_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_gcd_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_gcd_zz (SCM x, SCM y); +SCM_INTERNAL SCM scm_integer_gcd_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL SCM scm_integer_gcd_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL SCM scm_integer_lcm_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_lcm_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_lcm_zz (SCM x, SCM y); +SCM_INTERNAL SCM scm_integer_lcm_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL SCM scm_integer_lcm_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL SCM scm_integer_logand_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logand_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logand_zz (SCM x, SCM y); +SCM_INTERNAL SCM scm_integer_logand_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL SCM scm_integer_logand_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL SCM scm_integer_logior_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logior_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logior_zz (SCM x, SCM y); +SCM_INTERNAL SCM scm_integer_logior_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL SCM scm_integer_logior_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL SCM scm_integer_logxor_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logxor_zi (SCM x, scm_t_inum y); -SCM_INTERNAL SCM scm_integer_logxor_zz (SCM x, SCM y); +SCM_INTERNAL SCM scm_integer_logxor_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL SCM scm_integer_logxor_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL int scm_integer_logtest_ii (scm_t_inum x, scm_t_inum y); -SCM_INTERNAL int scm_integer_logtest_zi (SCM x, scm_t_inum y); -SCM_INTERNAL int scm_integer_logtest_zz (SCM x, SCM y); +SCM_INTERNAL int scm_integer_logtest_zi (struct scm_bignum *x, scm_t_inum y); +SCM_INTERNAL int scm_integer_logtest_zz (struct scm_bignum *x, + struct scm_bignum *y); SCM_INTERNAL int scm_integer_logbit_ui (unsigned long bit, scm_t_inum n); -SCM_INTERNAL int scm_integer_logbit_uz (unsigned long bit, SCM n); +SCM_INTERNAL int scm_integer_logbit_uz (unsigned long bit, + struct scm_bignum *n); SCM_INTERNAL SCM scm_integer_lognot_i (scm_t_inum n); -SCM_INTERNAL SCM scm_integer_lognot_z (SCM n); +SCM_INTERNAL SCM scm_integer_lognot_z (struct scm_bignum *n); SCM_INTERNAL SCM scm_integer_modulo_expt_nnn (SCM n, SCM k, SCM m); SCM_INTERNAL SCM scm_integer_lsh_iu (scm_t_inum n, unsigned long count); -SCM_INTERNAL SCM scm_integer_lsh_zu (SCM n, unsigned long count); +SCM_INTERNAL SCM scm_integer_lsh_zu (struct scm_bignum *n, + unsigned long count); SCM_INTERNAL SCM scm_integer_floor_rsh_iu (scm_t_inum n, unsigned long count); -SCM_INTERNAL SCM scm_integer_floor_rsh_zu (SCM n, unsigned long count); +SCM_INTERNAL SCM scm_integer_floor_rsh_zu (struct scm_bignum *n, + unsigned long count); SCM_INTERNAL SCM scm_integer_round_rsh_iu (scm_t_inum n, unsigned long count); -SCM_INTERNAL SCM scm_integer_round_rsh_zu (SCM n, unsigned long count); +SCM_INTERNAL SCM scm_integer_round_rsh_zu (struct scm_bignum *n, + unsigned long count); SCM_INTERNAL SCM scm_integer_bit_extract_i (scm_t_inum n, unsigned long start, unsigned long bits); -SCM_INTERNAL SCM scm_integer_bit_extract_z (SCM n, unsigned long start, +SCM_INTERNAL SCM scm_integer_bit_extract_z (struct scm_bignum *n, + unsigned long start, unsigned long bits); SCM_INTERNAL SCM scm_integer_logcount_i (scm_t_inum n); -SCM_INTERNAL SCM scm_integer_logcount_z (SCM n); +SCM_INTERNAL SCM scm_integer_logcount_z (struct scm_bignum *n); |