summaryrefslogtreecommitdiff
path: root/spec/ruby/optional/capi/ext/numeric_spec.c
blob: 2f66c7bac7278884b9a78edb8ab2de20d01bb7cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include "ruby.h"
#include "rubyspec.h"

#ifdef __cplusplus
extern "C" {
#endif

static VALUE numeric_spec_size_of_VALUE(VALUE self) {
  return INT2FIX(sizeof(VALUE));
}

static VALUE numeric_spec_size_of_long_long(VALUE self) {
  return INT2FIX(sizeof(LONG_LONG));
}

#ifdef HAVE_NUM2CHR
static VALUE numeric_spec_NUM2CHR(VALUE self, VALUE value) {
  return INT2FIX(NUM2CHR(value));
}
#endif

#ifdef HAVE_RB_INT2INUM
static VALUE numeric_spec_rb_int2inum_14(VALUE self) {
  return rb_int2inum(14);
}
#endif

#ifdef HAVE_RB_UINT2INUM
static VALUE numeric_spec_rb_uint2inum_14(VALUE self) {
  return rb_uint2inum(14);
}

static VALUE numeric_spec_rb_uint2inum_n14(VALUE self) {
  return rb_uint2inum(-14);
}
#endif

#ifdef HAVE_RB_INTEGER
static VALUE numeric_spec_rb_Integer(VALUE self, VALUE str) {
  return rb_Integer(str);
}
#endif

#ifdef HAVE_RB_LL2INUM
static VALUE numeric_spec_rb_ll2inum_14(VALUE self) {
  return rb_ll2inum(14);
}
#endif

#ifdef HAVE_RB_ULL2INUM
static VALUE numeric_spec_rb_ull2inum_14(VALUE self) {
  return rb_ull2inum(14);
}

static VALUE numeric_spec_rb_ull2inum_n14(VALUE self) {
  return rb_ull2inum(-14);
}
#endif

#ifdef HAVE_RB_NUM2DBL
static VALUE numeric_spec_rb_num2dbl(VALUE self, VALUE num) {
  return rb_float_new(rb_num2dbl(num));
}
#endif

#ifdef HAVE_RB_NUM2INT
static VALUE numeric_spec_rb_num2int(VALUE self, VALUE num) {
  return LONG2NUM(rb_num2int(num));
}
#endif

#ifdef HAVE_RB_INT2NUM
static VALUE numeric_spec_rb_int2num(VALUE self, VALUE num) {
  return INT2NUM(rb_num2long(num));
}
#endif

#ifdef HAVE_RB_NUM2LONG
static VALUE numeric_spec_rb_num2long(VALUE self, VALUE num) {
  return LONG2NUM(rb_num2long(num));
}
#endif

#ifdef HAVE_RB_NUM2UINT
static VALUE numeric_spec_rb_num2uint(VALUE self, VALUE num) {
  return ULONG2NUM(rb_num2uint(num));
}
#endif

#ifdef HAVE_RB_NUM2ULONG
static VALUE numeric_spec_rb_num2ulong(VALUE self, VALUE num) {
  return ULONG2NUM(rb_num2ulong(num));
}
#endif

#ifdef HAVE_RB_NUM_ZERODIV
static VALUE numeric_spec_rb_num_zerodiv(VALUE self) {
  rb_num_zerodiv();
  return Qnil;
}
#endif

#ifdef HAVE_RB_CMPINT
static VALUE numeric_spec_rb_cmpint(VALUE self, VALUE val, VALUE b) {
  return INT2FIX(rb_cmpint(val, val, b));
}
#endif

#ifdef HAVE_RB_NUM_COERCE_BIN
static VALUE numeric_spec_rb_num_coerce_bin(VALUE self, VALUE x, VALUE y, VALUE op) {
  return rb_num_coerce_bin(x, y, SYM2ID(op));
}
#endif

#ifdef HAVE_RB_NUM_COERCE_CMP
static VALUE numeric_spec_rb_num_coerce_cmp(VALUE self, VALUE x, VALUE y, VALUE op) {
  return rb_num_coerce_cmp(x, y, SYM2ID(op));
}
#endif

#ifdef HAVE_RB_NUM_COERCE_RELOP
static VALUE numeric_spec_rb_num_coerce_relop(VALUE self, VALUE x, VALUE y, VALUE op) {
  return rb_num_coerce_relop(x, y, SYM2ID(op));
}
#endif

#ifdef HAVE_RB_ABSINT_SINGLEBIT_P
static VALUE numeric_spec_rb_absint_singlebit_p(VALUE self, VALUE num) {
  return INT2FIX(rb_absint_singlebit_p(num));
}
#endif

void Init_numeric_spec(void) {
  VALUE cls;
  cls = rb_define_class("CApiNumericSpecs", rb_cObject);

  rb_define_method(cls, "size_of_VALUE", numeric_spec_size_of_VALUE, 0);
  rb_define_method(cls, "size_of_long_long", numeric_spec_size_of_long_long, 0);

#ifdef HAVE_NUM2CHR
  rb_define_method(cls, "NUM2CHR", numeric_spec_NUM2CHR, 1);
#endif

#ifdef HAVE_RB_INT2INUM
  rb_define_method(cls, "rb_int2inum_14", numeric_spec_rb_int2inum_14, 0);
#endif

#ifdef HAVE_RB_UINT2INUM
  rb_define_method(cls, "rb_uint2inum_14", numeric_spec_rb_uint2inum_14, 0);
  rb_define_method(cls, "rb_uint2inum_n14", numeric_spec_rb_uint2inum_n14, 0);
#endif

#ifdef HAVE_RB_INTEGER
  rb_define_method(cls, "rb_Integer", numeric_spec_rb_Integer, 1);
#endif

#ifdef HAVE_RB_LL2INUM
  rb_define_method(cls, "rb_ll2inum_14", numeric_spec_rb_ll2inum_14, 0);
#endif

#ifdef HAVE_RB_ULL2INUM
  rb_define_method(cls, "rb_ull2inum_14", numeric_spec_rb_ull2inum_14, 0);
  rb_define_method(cls, "rb_ull2inum_n14", numeric_spec_rb_ull2inum_n14, 0);
#endif

#ifdef HAVE_RB_NUM2DBL
  rb_define_method(cls, "rb_num2dbl", numeric_spec_rb_num2dbl, 1);
#endif

#ifdef HAVE_RB_NUM2INT
  rb_define_method(cls, "rb_num2int", numeric_spec_rb_num2int, 1);
#endif

#ifdef HAVE_RB_NUM2LONG
  rb_define_method(cls, "rb_num2long", numeric_spec_rb_num2long, 1);
#endif

#ifdef HAVE_RB_INT2NUM
  rb_define_method(cls, "rb_int2num", numeric_spec_rb_int2num, 1);
#endif

#ifdef HAVE_RB_NUM2UINT
  rb_define_method(cls, "rb_num2uint", numeric_spec_rb_num2uint, 1);
#endif

#ifdef HAVE_RB_NUM2ULONG
  rb_define_method(cls, "rb_num2ulong", numeric_spec_rb_num2ulong, 1);
#endif

#ifdef HAVE_RB_NUM_ZERODIV
  rb_define_method(cls, "rb_num_zerodiv", numeric_spec_rb_num_zerodiv, 0);
#endif

#ifdef HAVE_RB_CMPINT
  rb_define_method(cls, "rb_cmpint", numeric_spec_rb_cmpint, 2);
#endif

#ifdef HAVE_RB_NUM_COERCE_BIN
  rb_define_method(cls, "rb_num_coerce_bin", numeric_spec_rb_num_coerce_bin, 3);
#endif

#ifdef HAVE_RB_NUM_COERCE_CMP
  rb_define_method(cls, "rb_num_coerce_cmp", numeric_spec_rb_num_coerce_cmp, 3);
#endif

#ifdef HAVE_RB_NUM_COERCE_RELOP
  rb_define_method(cls, "rb_num_coerce_relop", numeric_spec_rb_num_coerce_relop, 3);
#endif

#ifdef HAVE_RB_ABSINT_SINGLEBIT_P
rb_define_method(cls, "rb_absint_singlebit_p", numeric_spec_rb_absint_singlebit_p, 1);
#endif
}

#ifdef __cplusplus
}
#endif