1#ifndef INTERNAL_BIGNUM_H
2#define INTERNAL_BIGNUM_H
15#ifdef HAVE_SYS_TYPES_H
16# include <sys/types.h>
23# if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
24# define BDIGIT unsigned int
25# define SIZEOF_BDIGIT SIZEOF_INT
26# define BDIGIT_DBL unsigned LONG_LONG
27# define BDIGIT_DBL_SIGNED LONG_LONG
28# define PRI_BDIGIT_PREFIX ""
29# define PRI_BDIGIT_DBL_PREFIX PRI_LL_PREFIX
30# elif SIZEOF_INT*2 <= SIZEOF_LONG
31# define BDIGIT unsigned int
32# define SIZEOF_BDIGIT SIZEOF_INT
33# define BDIGIT_DBL unsigned long
34# define BDIGIT_DBL_SIGNED long
35# define PRI_BDIGIT_PREFIX ""
36# define PRI_BDIGIT_DBL_PREFIX "l"
37# elif SIZEOF_SHORT*2 <= SIZEOF_LONG
38# define BDIGIT unsigned short
39# define SIZEOF_BDIGIT SIZEOF_SHORT
40# define BDIGIT_DBL unsigned long
41# define BDIGIT_DBL_SIGNED long
42# define PRI_BDIGIT_PREFIX "h"
43# define PRI_BDIGIT_DBL_PREFIX "l"
45# define BDIGIT unsigned short
46# define SIZEOF_BDIGIT (SIZEOF_LONG/2)
47# define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
48# define BDIGIT_DBL unsigned long
49# define BDIGIT_DBL_SIGNED long
50# define PRI_BDIGIT_PREFIX "h"
51# define PRI_BDIGIT_DBL_PREFIX "l"
55#ifndef SIZEOF_ACTUAL_BDIGIT
56# define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGIT
59#ifdef PRI_BDIGIT_PREFIX
60# define PRIdBDIGIT PRI_BDIGIT_PREFIX"d"
61# define PRIiBDIGIT PRI_BDIGIT_PREFIX"i"
62# define PRIoBDIGIT PRI_BDIGIT_PREFIX"o"
63# define PRIuBDIGIT PRI_BDIGIT_PREFIX"u"
64# define PRIxBDIGIT PRI_BDIGIT_PREFIX"x"
65# define PRIXBDIGIT PRI_BDIGIT_PREFIX"X"
68#ifdef PRI_BDIGIT_DBL_PREFIX
69# define PRIdBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"d"
70# define PRIiBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"i"
71# define PRIoBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"o"
72# define PRIuBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"u"
73# define PRIxBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"x"
74# define PRIXBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"X"
77#define RBIGNUM(obj) ((struct RBignum *)(obj))
78#define BIGNUM_SIGN_BIT FL_USER1
79#define BIGNUM_EMBED_FLAG ((VALUE)FL_USER2)
80#define BIGNUM_EMBED_LEN_NUMBITS 3
81#define BIGNUM_EMBED_LEN_MASK \
82 (~(~(VALUE)0U << BIGNUM_EMBED_LEN_NUMBITS) << BIGNUM_EMBED_LEN_SHIFT)
83#define BIGNUM_EMBED_LEN_SHIFT \
85#ifndef BIGNUM_EMBED_LEN_MAX
86# if (SIZEOF_VALUE*RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT) < (1 << BIGNUM_EMBED_LEN_NUMBITS)-1
87# define BIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*RVALUE_EMBED_LEN_MAX/SIZEOF_ACTUAL_BDIGIT)
89# define BIGNUM_EMBED_LEN_MAX ((1 << BIGNUM_EMBED_LEN_NUMBITS)-1)
134static inline bool BIGNUM_SIGN(
VALUE b);
135static inline bool BIGNUM_POSITIVE_P(
VALUE b);
136static inline bool BIGNUM_NEGATIVE_P(
VALUE b);
137static inline void BIGNUM_SET_SIGN(
VALUE b,
bool sign);
138static inline void BIGNUM_NEGATE(
VALUE b);
139static inline size_t BIGNUM_LEN(
VALUE b);
141static inline int BIGNUM_LENINT(
VALUE b);
142static inline bool BIGNUM_EMBED_P(
VALUE b);
144RUBY_SYMBOL_EXPORT_BEGIN
157#if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
161VALUE rb_str2big_gmp(
VALUE arg,
int base,
int badcheck);
164RUBY_SYMBOL_EXPORT_END
167#if defined(HAVE_INT128_T)
168VALUE rb_int128t2big(int128_t n);
180BIGNUM_POSITIVE_P(
VALUE b)
182 return BIGNUM_SIGN(b);
186BIGNUM_NEGATIVE_P(
VALUE b)
188 return ! BIGNUM_POSITIVE_P(b);
192BIGNUM_SET_SIGN(
VALUE b,
bool sign)
203BIGNUM_NEGATE(
VALUE b)
211 if (! BIGNUM_EMBED_P(b)) {
212 return RBIGNUM(b)->as.heap.len;
215 size_t ret =
RBASIC(b)->flags;
223BIGNUM_LENINT(
VALUE b)
230BIGNUM_DIGITS(
VALUE b)
232 if (BIGNUM_EMBED_P(b)) {
236 return RBIGNUM(b)->as.heap.digits;
241BIGNUM_EMBED_P(
VALUE b)
#define MJIT_SYMBOL_EXPORT_END
#define MJIT_SYMBOL_EXPORT_BEGIN
char str[HTML_ESCAPE_MAX_LEN+1]
Thin wrapper to ruby/config.h.
VALUE rb_big_even_p(VALUE)
size_t rb_big_size(VALUE)
VALUE rb_integer_float_eq(VALUE x, VALUE y)
double rb_big_fdiv_double(VALUE x, VALUE y)
VALUE rb_big2str_generic(VALUE x, int base)
VALUE rb_big_mul_toom3(VALUE x, VALUE y)
VALUE rb_big_comp(VALUE x)
#define BIGNUM_EMBED_LEN_MAX
VALUE rb_big_sq_fast(VALUE x)
VALUE rb_big2str_poweroftwo(VALUE x, int base)
@ RB_INT_PARSE_UNDERSCORE
VALUE rb_big_gt(VALUE x, VALUE y)
VALUE rb_big_ge(VALUE x, VALUE y)
VALUE rb_big_aref(VALUE x, VALUE y)
VALUE rb_big_bit_length(VALUE big)
#define BIGNUM_EMBED_LEN_MASK
VALUE rb_str2big_karatsuba(VALUE arg, int base, int badcheck)
VALUE rb_big_lt(VALUE x, VALUE y)
VALUE rb_big_remainder(VALUE x, VALUE y)
VALUE rb_big_size_m(VALUE big)
const char ruby_digitmap[]
VALUE rb_int_powm(int const argc, VALUE *const argv, VALUE const num)
VALUE rb_str2big_normal(VALUE arg, int base, int badcheck)
#define BIGNUM_EMBED_FLAG
VALUE rb_big_mul_karatsuba(VALUE x, VALUE y)
VALUE rb_integer_float_cmp(VALUE x, VALUE y)
VALUE rb_big_divrem_normal(VALUE x, VALUE y)
VALUE rb_str_convert_to_inum(VALUE str, int base, int badcheck, int raise_exception)
VALUE rb_big_uminus(VALUE x)
VALUE rb_big_odd_p(VALUE)
VALUE rb_big_mul_balance(VALUE x, VALUE y)
#define BIGNUM_EMBED_LEN_SHIFT
VALUE rb_big_abs(VALUE x)
VALUE rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits, int base, int flags)
VALUE rb_big_mul_normal(VALUE x, VALUE y)
VALUE rb_str2big_poweroftwo(VALUE arg, int base, int badcheck)
VALUE rb_big_le(VALUE x, VALUE y)