numo-narray 0.9.0.1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +47 -0
- data/Rakefile +41 -0
- data/ext/numo/narray/SFMT-params.h +97 -0
- data/ext/numo/narray/SFMT-params19937.h +46 -0
- data/ext/numo/narray/SFMT.c +620 -0
- data/ext/numo/narray/SFMT.h +157 -0
- data/ext/numo/narray/array.c +525 -0
- data/ext/numo/narray/data.c +901 -0
- data/ext/numo/narray/depend.erb +33 -0
- data/ext/numo/narray/extconf.rb +117 -0
- data/ext/numo/narray/gen/bit.erb.c +811 -0
- data/ext/numo/narray/gen/cogen.rb +18 -0
- data/ext/numo/narray/gen/def/dcomplex.rb +32 -0
- data/ext/numo/narray/gen/def/dfloat.rb +30 -0
- data/ext/numo/narray/gen/def/int16.rb +29 -0
- data/ext/numo/narray/gen/def/int32.rb +29 -0
- data/ext/numo/narray/gen/def/int64.rb +29 -0
- data/ext/numo/narray/gen/def/int8.rb +29 -0
- data/ext/numo/narray/gen/def/robject.rb +30 -0
- data/ext/numo/narray/gen/def/scomplex.rb +32 -0
- data/ext/numo/narray/gen/def/sfloat.rb +30 -0
- data/ext/numo/narray/gen/def/uint16.rb +29 -0
- data/ext/numo/narray/gen/def/uint32.rb +29 -0
- data/ext/numo/narray/gen/def/uint64.rb +29 -0
- data/ext/numo/narray/gen/def/uint8.rb +29 -0
- data/ext/numo/narray/gen/dtype.erb.c +328 -0
- data/ext/numo/narray/gen/tmpl/accum.c +36 -0
- data/ext/numo/narray/gen/tmpl/accum_binary.c +75 -0
- data/ext/numo/narray/gen/tmpl/accum_index.c +58 -0
- data/ext/numo/narray/gen/tmpl/allocate.c +35 -0
- data/ext/numo/narray/gen/tmpl/aref.c +51 -0
- data/ext/numo/narray/gen/tmpl/aset.c +61 -0
- data/ext/numo/narray/gen/tmpl/binary.c +53 -0
- data/ext/numo/narray/gen/tmpl/binary2.c +55 -0
- data/ext/numo/narray/gen/tmpl/binary_s.c +34 -0
- data/ext/numo/narray/gen/tmpl/bit_binary.c +94 -0
- data/ext/numo/narray/gen/tmpl/bit_count.c +82 -0
- data/ext/numo/narray/gen/tmpl/bit_unary.c +77 -0
- data/ext/numo/narray/gen/tmpl/cast.c +37 -0
- data/ext/numo/narray/gen/tmpl/cast_array.c +79 -0
- data/ext/numo/narray/gen/tmpl/cast_numeric.c +22 -0
- data/ext/numo/narray/gen/tmpl/coerce_cast.c +8 -0
- data/ext/numo/narray/gen/tmpl/cond_binary.c +51 -0
- data/ext/numo/narray/gen/tmpl/cond_unary.c +45 -0
- data/ext/numo/narray/gen/tmpl/cum.c +42 -0
- data/ext/numo/narray/gen/tmpl/each.c +43 -0
- data/ext/numo/narray/gen/tmpl/each_with_index.c +64 -0
- data/ext/numo/narray/gen/tmpl/extract.c +23 -0
- data/ext/numo/narray/gen/tmpl/eye.c +91 -0
- data/ext/numo/narray/gen/tmpl/fill.c +38 -0
- data/ext/numo/narray/gen/tmpl/format.c +60 -0
- data/ext/numo/narray/gen/tmpl/format_to_a.c +47 -0
- data/ext/numo/narray/gen/tmpl/head.c +25 -0
- data/ext/numo/narray/gen/tmpl/inspect.c +16 -0
- data/ext/numo/narray/gen/tmpl/map_with_index.c +94 -0
- data/ext/numo/narray/gen/tmpl/median.c +44 -0
- data/ext/numo/narray/gen/tmpl/minmax.c +47 -0
- data/ext/numo/narray/gen/tmpl/poly.c +49 -0
- data/ext/numo/narray/gen/tmpl/pow.c +74 -0
- data/ext/numo/narray/gen/tmpl/powint.c +17 -0
- data/ext/numo/narray/gen/tmpl/qsort.c +149 -0
- data/ext/numo/narray/gen/tmpl/rand.c +33 -0
- data/ext/numo/narray/gen/tmpl/rand_norm.c +46 -0
- data/ext/numo/narray/gen/tmpl/robj_allocate.c +32 -0
- data/ext/numo/narray/gen/tmpl/seq.c +61 -0
- data/ext/numo/narray/gen/tmpl/set2.c +56 -0
- data/ext/numo/narray/gen/tmpl/sort.c +36 -0
- data/ext/numo/narray/gen/tmpl/sort_index.c +86 -0
- data/ext/numo/narray/gen/tmpl/store.c +31 -0
- data/ext/numo/narray/gen/tmpl/store_array.c +5 -0
- data/ext/numo/narray/gen/tmpl/store_from.c +53 -0
- data/ext/numo/narray/gen/tmpl/store_numeric.c +22 -0
- data/ext/numo/narray/gen/tmpl/to_a.c +41 -0
- data/ext/numo/narray/gen/tmpl/unary.c +58 -0
- data/ext/numo/narray/gen/tmpl/unary2.c +58 -0
- data/ext/numo/narray/gen/tmpl/unary_s.c +57 -0
- data/ext/numo/narray/index.c +822 -0
- data/ext/numo/narray/kwarg.c +79 -0
- data/ext/numo/narray/math.c +140 -0
- data/ext/numo/narray/narray.c +1539 -0
- data/ext/numo/narray/ndloop.c +1928 -0
- data/ext/numo/narray/numo/compat.h +23 -0
- data/ext/numo/narray/numo/intern.h +112 -0
- data/ext/numo/narray/numo/narray.h +411 -0
- data/ext/numo/narray/numo/ndloop.h +99 -0
- data/ext/numo/narray/numo/template.h +140 -0
- data/ext/numo/narray/numo/types/bit.h +19 -0
- data/ext/numo/narray/numo/types/complex.h +410 -0
- data/ext/numo/narray/numo/types/complex_macro.h +205 -0
- data/ext/numo/narray/numo/types/dcomplex.h +11 -0
- data/ext/numo/narray/numo/types/dfloat.h +12 -0
- data/ext/numo/narray/numo/types/float_def.h +34 -0
- data/ext/numo/narray/numo/types/float_macro.h +277 -0
- data/ext/numo/narray/numo/types/int16.h +12 -0
- data/ext/numo/narray/numo/types/int32.h +12 -0
- data/ext/numo/narray/numo/types/int64.h +12 -0
- data/ext/numo/narray/numo/types/int8.h +12 -0
- data/ext/numo/narray/numo/types/int_macro.h +34 -0
- data/ext/numo/narray/numo/types/robj_macro.h +218 -0
- data/ext/numo/narray/numo/types/robject.h +21 -0
- data/ext/numo/narray/numo/types/scomplex.h +11 -0
- data/ext/numo/narray/numo/types/sfloat.h +13 -0
- data/ext/numo/narray/numo/types/uint16.h +12 -0
- data/ext/numo/narray/numo/types/uint32.h +12 -0
- data/ext/numo/narray/numo/types/uint64.h +12 -0
- data/ext/numo/narray/numo/types/uint8.h +12 -0
- data/ext/numo/narray/numo/types/uint_macro.h +31 -0
- data/ext/numo/narray/numo/types/xint_macro.h +133 -0
- data/ext/numo/narray/rand.c +87 -0
- data/ext/numo/narray/step.c +506 -0
- data/ext/numo/narray/struct.c +872 -0
- data/lib/2.1/numo/narray.so +0 -0
- data/lib/2.2/numo/narray.so +0 -0
- data/lib/2.3/numo/narray.so +0 -0
- data/lib/erbpp/line_number.rb +126 -0
- data/lib/erbpp/narray_def.rb +338 -0
- data/lib/erbpp.rb +286 -0
- data/lib/numo/narray.rb +6 -0
- data/numo-narray.gemspec +35 -0
- data/spec/bit_spec.rb +93 -0
- data/spec/narray_spec.rb +249 -0
- metadata +238 -0
@@ -0,0 +1,506 @@
|
|
1
|
+
/*
|
2
|
+
step.c
|
3
|
+
Numerical Array Extension for Ruby
|
4
|
+
(C) Copyright 2007,2013 by Masahiro TANAKA
|
5
|
+
|
6
|
+
This program is free software.
|
7
|
+
You can distribute/modify this program
|
8
|
+
under the same terms as Ruby itself.
|
9
|
+
NO WARRANTY.
|
10
|
+
*/
|
11
|
+
#include <ruby.h>
|
12
|
+
#include <math.h>
|
13
|
+
|
14
|
+
#include "numo/narray.h"
|
15
|
+
|
16
|
+
#if defined(__FreeBSD__) && __FreeBSD__ < 4
|
17
|
+
#include <floatingpoint.h>
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#ifdef HAVE_FLOAT_H
|
21
|
+
#include <float.h>
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#ifdef HAVE_IEEEFP_H
|
25
|
+
#include <ieeefp.h>
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#ifndef DBL_EPSILON
|
29
|
+
#define DBL_EPSILON 2.2204460492503131e-16
|
30
|
+
#endif
|
31
|
+
|
32
|
+
static ID id_beg, id_end, id_len, id_step, id_excl;
|
33
|
+
|
34
|
+
//#define EXCL(r) RTEST(rb_ivar_get((r), id_excl))
|
35
|
+
#define EXCL(r) RTEST(rb_funcall((r), rb_intern("exclude_end?"), 0))
|
36
|
+
|
37
|
+
#define SET_EXCL(r,v) rb_ivar_set((r), id_excl, (v) ? Qtrue : Qfalse)
|
38
|
+
|
39
|
+
static void
|
40
|
+
step_init(
|
41
|
+
VALUE self,
|
42
|
+
VALUE beg,
|
43
|
+
VALUE end,
|
44
|
+
VALUE step,
|
45
|
+
VALUE len,
|
46
|
+
VALUE excl
|
47
|
+
)
|
48
|
+
{
|
49
|
+
if (RTEST(len)) {
|
50
|
+
if (!(FIXNUM_P(len) || TYPE(len)==T_BIGNUM)) {
|
51
|
+
rb_raise(rb_eArgError, "length must be Integer");
|
52
|
+
}
|
53
|
+
if (RTEST(rb_funcall(len,rb_intern("<"),1,INT2FIX(0)))) {
|
54
|
+
rb_raise(rb_eRangeError,"length must be non negative");
|
55
|
+
}
|
56
|
+
}
|
57
|
+
rb_ivar_set(self, id_beg, beg);
|
58
|
+
rb_ivar_set(self, id_end, end);
|
59
|
+
rb_ivar_set(self, id_len, len);
|
60
|
+
rb_ivar_set(self, id_step, step);
|
61
|
+
SET_EXCL(self, excl);
|
62
|
+
}
|
63
|
+
|
64
|
+
VALUE
|
65
|
+
nary_step_new(
|
66
|
+
VALUE beg,
|
67
|
+
VALUE end,
|
68
|
+
VALUE step,
|
69
|
+
VALUE len,
|
70
|
+
VALUE excl
|
71
|
+
)
|
72
|
+
{
|
73
|
+
VALUE self = rb_obj_alloc(na_cStep);
|
74
|
+
|
75
|
+
step_init(self, beg, end, step, len, excl);
|
76
|
+
return self;
|
77
|
+
}
|
78
|
+
|
79
|
+
VALUE
|
80
|
+
nary_step_new2(
|
81
|
+
VALUE range,
|
82
|
+
VALUE step,
|
83
|
+
VALUE len
|
84
|
+
)
|
85
|
+
{
|
86
|
+
VALUE beg, end, excl;
|
87
|
+
VALUE self = rb_obj_alloc(na_cStep);
|
88
|
+
|
89
|
+
//beg = rb_ivar_get(range, id_beg);
|
90
|
+
beg = rb_funcall(range, id_beg, 0);
|
91
|
+
//end = rb_ivar_get(range, id_end);
|
92
|
+
end = rb_funcall(range, id_end, 0);
|
93
|
+
excl = rb_funcall(range, rb_intern("exclude_end?"), 0);
|
94
|
+
|
95
|
+
step_init(self, beg, end, step, len, excl);
|
96
|
+
return self;
|
97
|
+
}
|
98
|
+
|
99
|
+
|
100
|
+
/*
|
101
|
+
* call-seq:
|
102
|
+
* Step.new(start, end, step=nil, length=nil) => step
|
103
|
+
* Step.new(range, step=nil, length=nil) => step
|
104
|
+
*
|
105
|
+
* Constructs a step using three parameters among <i>start</i>,
|
106
|
+
* <i>end</i>, <i>step</i> and <i>length</i>. <i>start</i>,
|
107
|
+
* <i>end</i> parameters can be replaced with <i>range</i>. If the
|
108
|
+
* <i>step</i> is omitted (or supplied with nil), then calculated
|
109
|
+
* from <i>length</i> or definded as 1.
|
110
|
+
*/
|
111
|
+
|
112
|
+
static VALUE
|
113
|
+
step_initialize( int argc, VALUE *argv, VALUE self )
|
114
|
+
{
|
115
|
+
VALUE a, b=Qnil, c=Qnil, d=Qnil, e=Qnil;
|
116
|
+
|
117
|
+
rb_scan_args(argc, argv, "13", &a, &b, &c, &d);
|
118
|
+
/* Selfs are immutable, so that they should be initialized only once. */
|
119
|
+
if (rb_ivar_defined(self, id_beg)) {
|
120
|
+
rb_name_error(rb_intern("initialize"), "`initialize' called twice");
|
121
|
+
}
|
122
|
+
if (rb_obj_is_kind_of(a,rb_cRange)) {
|
123
|
+
if (argc>3) {
|
124
|
+
rb_raise(rb_eArgError, "extra argument");
|
125
|
+
}
|
126
|
+
d = c;
|
127
|
+
c = b;
|
128
|
+
e = rb_funcall(a, rb_intern("exclude_end?"), 0);
|
129
|
+
//b = rb_ivar_get(a, id_end);
|
130
|
+
b = rb_funcall(a, id_end, 0);
|
131
|
+
//a = rb_ivar_get(a, id_beg);
|
132
|
+
a = rb_funcall(a, id_beg, 0);
|
133
|
+
}
|
134
|
+
step_init(self, a, b, c, d, e);
|
135
|
+
return Qnil;
|
136
|
+
}
|
137
|
+
|
138
|
+
/*
|
139
|
+
* call-seq:
|
140
|
+
* step.begin => obj
|
141
|
+
* step.first => obj
|
142
|
+
*
|
143
|
+
* Returns the start of <i>step</i>.
|
144
|
+
*/
|
145
|
+
|
146
|
+
static VALUE
|
147
|
+
step_first( VALUE self )
|
148
|
+
{
|
149
|
+
return rb_ivar_get(self, id_beg);
|
150
|
+
}
|
151
|
+
|
152
|
+
/*
|
153
|
+
* call-seq:
|
154
|
+
* step.end => obj
|
155
|
+
* step.last => obj
|
156
|
+
*
|
157
|
+
* Returns the object that defines the end of <i>step</i>.
|
158
|
+
*/
|
159
|
+
|
160
|
+
static VALUE
|
161
|
+
step_last( VALUE self )
|
162
|
+
{
|
163
|
+
return rb_ivar_get(self, id_end);
|
164
|
+
}
|
165
|
+
|
166
|
+
/*
|
167
|
+
* call-seq:
|
168
|
+
* step.length => obj
|
169
|
+
* step.size => obj
|
170
|
+
*
|
171
|
+
* Returns the length of <i>step</i>.
|
172
|
+
*/
|
173
|
+
|
174
|
+
static VALUE
|
175
|
+
step_length( VALUE self )
|
176
|
+
{
|
177
|
+
return rb_ivar_get(self, id_len);
|
178
|
+
}
|
179
|
+
|
180
|
+
/*
|
181
|
+
* call-seq:
|
182
|
+
* step.step => obj
|
183
|
+
*
|
184
|
+
* Returns the step of <i>step</i>.
|
185
|
+
*/
|
186
|
+
|
187
|
+
static VALUE
|
188
|
+
step_step( VALUE self )
|
189
|
+
{
|
190
|
+
return rb_ivar_get(self, id_step);
|
191
|
+
}
|
192
|
+
|
193
|
+
/*
|
194
|
+
* call-seq:
|
195
|
+
* step.exclude_end? => true or false
|
196
|
+
*
|
197
|
+
* Returns <code>true</code> if <i>step</i> excludes its end value.
|
198
|
+
*/
|
199
|
+
static VALUE
|
200
|
+
step_exclude_end_p(VALUE self)
|
201
|
+
{
|
202
|
+
return RTEST(rb_ivar_get(self, id_excl)) ? Qtrue : Qfalse;
|
203
|
+
}
|
204
|
+
|
205
|
+
|
206
|
+
/*
|
207
|
+
* call-seq:
|
208
|
+
* step.parameters([array_size]) => [start,step,length]
|
209
|
+
*
|
210
|
+
* Returns the iteration parameters of <i>step</i>. If
|
211
|
+
* <i>array_sizse</i> is given, negative array index is considered.
|
212
|
+
*/
|
213
|
+
|
214
|
+
void
|
215
|
+
nary_step_array_index(VALUE self, size_t ary_size,
|
216
|
+
size_t *plen, ssize_t *pbeg, ssize_t *pstep)
|
217
|
+
{
|
218
|
+
size_t len;
|
219
|
+
ssize_t beg=0, step=1;
|
220
|
+
VALUE vbeg, vend, vstep, vlen;
|
221
|
+
ssize_t end=ary_size;
|
222
|
+
|
223
|
+
//vbeg = rb_ivar_get(self, id_beg);
|
224
|
+
//vend = rb_ivar_get(self, id_end);
|
225
|
+
vlen = rb_ivar_get(self, id_len);
|
226
|
+
vstep = rb_ivar_get(self, id_step);
|
227
|
+
vbeg = rb_funcall(self, id_beg, 0);
|
228
|
+
vend = rb_funcall(self, id_end, 0);
|
229
|
+
//vlen = rb_funcall(self, id_len, 0);
|
230
|
+
//vstep = rb_funcall(self, id_step, 0);
|
231
|
+
|
232
|
+
if (RTEST(vbeg)) {
|
233
|
+
beg = NUM2SSIZE(vbeg);
|
234
|
+
if (beg<0) {
|
235
|
+
beg += ary_size;
|
236
|
+
}
|
237
|
+
}
|
238
|
+
if (RTEST(vend)) {
|
239
|
+
end = NUM2SSIZE(vend);
|
240
|
+
if (end<0) {
|
241
|
+
end += ary_size;
|
242
|
+
}
|
243
|
+
}
|
244
|
+
|
245
|
+
//puts("pass 1");
|
246
|
+
|
247
|
+
if (RTEST(vlen)) {
|
248
|
+
len = NUM2SIZE(vlen);
|
249
|
+
if (len>0) {
|
250
|
+
if (RTEST(vstep)) {
|
251
|
+
step = NUM2SSIZE(step);
|
252
|
+
if (RTEST(vbeg)) {
|
253
|
+
if (RTEST(vend)) {
|
254
|
+
rb_raise( rb_eStandardError, "verbose Step object" );
|
255
|
+
} else {
|
256
|
+
end = beg + step*(len-1);
|
257
|
+
}
|
258
|
+
} else {
|
259
|
+
if (RTEST(vend)) {
|
260
|
+
if (EXCL(self)) {
|
261
|
+
if (step>0) end--;
|
262
|
+
if (step<0) end++;
|
263
|
+
}
|
264
|
+
beg = end - step*(len-1);
|
265
|
+
} else {
|
266
|
+
beg = 0;
|
267
|
+
end = step*(len-1);
|
268
|
+
}
|
269
|
+
}
|
270
|
+
} else { // no step
|
271
|
+
step = 1;
|
272
|
+
if (RTEST(vbeg)) {
|
273
|
+
if (RTEST(vend)) {
|
274
|
+
if (EXCL(self)) {
|
275
|
+
if (beg<end) end--;
|
276
|
+
if (beg>end) end++;
|
277
|
+
}
|
278
|
+
if (len>1)
|
279
|
+
step = (end-beg)/(len-1);
|
280
|
+
} else {
|
281
|
+
end = beg + (len-1);
|
282
|
+
}
|
283
|
+
} else {
|
284
|
+
if (RTEST(vend)) {
|
285
|
+
if (EXCL(self)) {
|
286
|
+
end--;
|
287
|
+
}
|
288
|
+
beg = end - (len-1);
|
289
|
+
} else {
|
290
|
+
beg = 0;
|
291
|
+
end = len-1;
|
292
|
+
}
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
296
|
+
} else { // no len
|
297
|
+
if (RTEST(vstep)) {
|
298
|
+
step = NUM2SSIZE(vstep);
|
299
|
+
} else {
|
300
|
+
step = 1;
|
301
|
+
}
|
302
|
+
if (step>0) {
|
303
|
+
if (!RTEST(vbeg)) {
|
304
|
+
beg = 0;
|
305
|
+
}
|
306
|
+
if (!RTEST(vend)) {
|
307
|
+
end = ary_size-1;
|
308
|
+
}
|
309
|
+
else if (EXCL(self)) {
|
310
|
+
end--;
|
311
|
+
}
|
312
|
+
if (beg<=end) {
|
313
|
+
len = (end-beg)/step+1;
|
314
|
+
} else {
|
315
|
+
len = 0;
|
316
|
+
}
|
317
|
+
} else if (step<0) {
|
318
|
+
if (!RTEST(vbeg)) {
|
319
|
+
beg = ary_size-1;
|
320
|
+
}
|
321
|
+
if (!RTEST(vend)) {
|
322
|
+
end = 0;
|
323
|
+
}
|
324
|
+
else if (EXCL(self)) {
|
325
|
+
end++;
|
326
|
+
}
|
327
|
+
if (beg>=end) {
|
328
|
+
len = (beg-end)/(-step)+1;
|
329
|
+
} else {
|
330
|
+
len = 0;
|
331
|
+
}
|
332
|
+
} else {
|
333
|
+
rb_raise( rb_eStandardError, "step must be non-zero" );
|
334
|
+
}
|
335
|
+
}
|
336
|
+
|
337
|
+
//puts("pass 2");
|
338
|
+
|
339
|
+
if (beg<0 || beg>=(ssize_t)ary_size ||
|
340
|
+
end<0 || end>=(ssize_t)ary_size) {
|
341
|
+
rb_raise( rb_eRangeError,
|
342
|
+
"beg=%"SZF"d,end=%"SZF"d is out of array size (%"SZF"u)",
|
343
|
+
beg, end, ary_size );
|
344
|
+
}
|
345
|
+
if (plen) *plen = len;
|
346
|
+
if (pbeg) *pbeg = beg;
|
347
|
+
if (pstep) *pstep = step;
|
348
|
+
}
|
349
|
+
|
350
|
+
|
351
|
+
void
|
352
|
+
nary_step_sequence( VALUE self, size_t *plen, double *pbeg, double *pstep )
|
353
|
+
{
|
354
|
+
VALUE vbeg, vend, vstep, vlen;
|
355
|
+
double dbeg, dend, dstep=1, dsize, err;
|
356
|
+
size_t size, n;
|
357
|
+
|
358
|
+
//vbeg = rb_ivar_get(self, id_beg);
|
359
|
+
vbeg = rb_funcall(self, id_beg, 0);
|
360
|
+
dbeg = NUM2DBL(vbeg);
|
361
|
+
|
362
|
+
//vend = rb_ivar_get(self, id_end);
|
363
|
+
vend = rb_funcall(self, id_end, 0);
|
364
|
+
|
365
|
+
vlen = rb_ivar_get(self, id_len);
|
366
|
+
vstep = rb_ivar_get(self, id_step);
|
367
|
+
//vlen = rb_funcall(self, id_len ,0);
|
368
|
+
//vstep = rb_funcall(self, id_step,0);
|
369
|
+
|
370
|
+
if (RTEST(vlen)) {
|
371
|
+
size = NUM2SIZE(vlen);
|
372
|
+
|
373
|
+
if (!RTEST(vstep)) {
|
374
|
+
if (RTEST(vend)) {
|
375
|
+
dend = NUM2DBL(vend);
|
376
|
+
if (EXCL(self)) {
|
377
|
+
n = size;
|
378
|
+
} else {
|
379
|
+
n = size-1;
|
380
|
+
}
|
381
|
+
if (n>0) {
|
382
|
+
dstep = (dend-dbeg)/n;
|
383
|
+
} else {
|
384
|
+
dstep = 1;
|
385
|
+
}
|
386
|
+
} else {
|
387
|
+
dstep = 1;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
} else {
|
391
|
+
if (!RTEST(vstep)) {
|
392
|
+
dstep = 1;
|
393
|
+
} else {
|
394
|
+
dstep = NUM2DBL(vstep);
|
395
|
+
}
|
396
|
+
if (RTEST(vend)) {
|
397
|
+
dend = NUM2DBL(vend);
|
398
|
+
err = (fabs(dbeg)+fabs(dend)+fabs(dend-dbeg))/fabs(dstep)*DBL_EPSILON;
|
399
|
+
if (err>0.5) err=0.5;
|
400
|
+
dsize = (dend-dbeg)/dstep;
|
401
|
+
if (EXCL(self))
|
402
|
+
dsize -= err;
|
403
|
+
else
|
404
|
+
dsize += err;
|
405
|
+
dsize = floor(dsize) + 1;
|
406
|
+
if (dsize<0) dsize=0;
|
407
|
+
if (isinf(dsize) || isnan(dsize)) {
|
408
|
+
rb_raise(rb_eArgError, "not finite size");
|
409
|
+
}
|
410
|
+
size = dsize;
|
411
|
+
} else {
|
412
|
+
rb_raise(rb_eArgError, "cannot determine length argument");
|
413
|
+
}
|
414
|
+
}
|
415
|
+
|
416
|
+
if (plen) *plen = size;
|
417
|
+
if (pbeg) *pbeg = dbeg;
|
418
|
+
if (pstep) *pstep = dstep;
|
419
|
+
}
|
420
|
+
|
421
|
+
/*
|
422
|
+
static VALUE
|
423
|
+
step_each( VALUE self )
|
424
|
+
{
|
425
|
+
VALUE a;
|
426
|
+
double beg, step;
|
427
|
+
size_t i, size;
|
428
|
+
|
429
|
+
a = nary_step_parameters( self, Qnil );
|
430
|
+
beg = NUM2DBL(RARRAY_PTR(a)[0]);
|
431
|
+
step = NUM2DBL(RARRAY_PTR(a)[1]);
|
432
|
+
size = NUM2SIZE(RARRAY_PTR(a)[2]);
|
433
|
+
|
434
|
+
for (i=0; i<size; i++) {
|
435
|
+
rb_yield(rb_float_new(beg+i*step));
|
436
|
+
}
|
437
|
+
return self;
|
438
|
+
}
|
439
|
+
*/
|
440
|
+
|
441
|
+
static VALUE
|
442
|
+
range_with_step( VALUE range, VALUE step )
|
443
|
+
{
|
444
|
+
return nary_step_new2( range, step, Qnil );
|
445
|
+
}
|
446
|
+
|
447
|
+
static VALUE
|
448
|
+
range_with_length( VALUE range, VALUE len )
|
449
|
+
{
|
450
|
+
return nary_step_new2( range, Qnil, len );
|
451
|
+
}
|
452
|
+
|
453
|
+
|
454
|
+
static VALUE
|
455
|
+
nary_s_step( int argc, VALUE *argv, VALUE mod )
|
456
|
+
{
|
457
|
+
VALUE self = rb_obj_alloc(na_cStep);
|
458
|
+
step_initialize(argc, argv, self);
|
459
|
+
return self;
|
460
|
+
}
|
461
|
+
|
462
|
+
|
463
|
+
VALUE
|
464
|
+
nary_is_sequence( VALUE arg )
|
465
|
+
{
|
466
|
+
if ( rb_obj_is_kind_of(arg, rb_cRange) )
|
467
|
+
return Qtrue;
|
468
|
+
if ( rb_obj_is_kind_of(arg, na_cStep) )
|
469
|
+
return Qtrue;
|
470
|
+
return Qfalse;
|
471
|
+
}
|
472
|
+
|
473
|
+
|
474
|
+
|
475
|
+
void
|
476
|
+
Init_nary_step()
|
477
|
+
{
|
478
|
+
na_cStep = rb_define_class_under(cNArray, "Step", rb_cObject);
|
479
|
+
rb_include_module(na_cStep, rb_mEnumerable);
|
480
|
+
rb_define_method(na_cStep, "initialize", step_initialize, -1);
|
481
|
+
|
482
|
+
//rb_define_method(na_cStep, "each", step_each, 0);
|
483
|
+
|
484
|
+
rb_define_method(na_cStep, "first", step_first, 0);
|
485
|
+
rb_define_method(na_cStep, "last", step_last, 0);
|
486
|
+
rb_define_method(na_cStep, "begin", step_first, 0);
|
487
|
+
rb_define_method(na_cStep, "end", step_last, 0);
|
488
|
+
rb_define_method(na_cStep, "step", step_step, 0);
|
489
|
+
rb_define_method(na_cStep, "length", step_length, 0);
|
490
|
+
rb_define_method(na_cStep, "size", step_length, 0);
|
491
|
+
rb_define_method(na_cStep, "exclude_end?", step_exclude_end_p, 0);
|
492
|
+
//rb_define_method(na_cStep, "to_s", step_to_s, 0);
|
493
|
+
//rb_define_method(na_cStep, "inspect", step_inspect, 0);
|
494
|
+
//rb_define_method(na_cStep, "parameters", nary_step_parameters, 1);
|
495
|
+
|
496
|
+
rb_define_method(rb_cRange, "%", range_with_step, 1);
|
497
|
+
rb_define_method(rb_cRange, "*", range_with_length, 1);
|
498
|
+
|
499
|
+
rb_define_singleton_method(cNArray, "step", nary_s_step, -1);
|
500
|
+
|
501
|
+
id_beg = rb_intern("begin");
|
502
|
+
id_end = rb_intern("end");
|
503
|
+
id_len = rb_intern("length");
|
504
|
+
id_step = rb_intern("step");
|
505
|
+
id_excl = rb_intern("excl");
|
506
|
+
}
|