summaryrefslogtreecommitdiff
path: root/libguile/integers.h
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2022-01-04 10:33:52 +0100
committerAndy Wingo <wingo@pobox.com>2022-01-13 09:37:16 +0100
commit8b99ace658ab2bb3805f3262db122f39dd5cdff8 (patch)
tree073d77d549b45a42a410b6bec969278adaca410b /libguile/integers.h
parent7ec40fe5b08e5a05a0cd62f1f0920e83233d104e (diff)
downloadguile-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.h202
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);