carray 1.5.2 → 1.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +32 -0
- data/NEWS.md +56 -3
- data/README.md +34 -18
- data/Rakefile +1 -1
- data/TODO.md +5 -4
- data/carray.gemspec +10 -11
- data/ext/ca_obj_bitarray.c +4 -7
- data/ext/ca_obj_bitfield.c +3 -5
- data/ext/ca_obj_block.c +1 -6
- data/ext/ca_obj_refer.c +6 -8
- data/ext/ca_obj_unbound_repeat.c +21 -52
- data/ext/carray.h +4 -0
- data/ext/carray_access.c +77 -45
- data/ext/carray_attribute.c +16 -1
- data/ext/carray_cast.c +1 -1
- data/ext/carray_conversion.c +8 -1
- data/ext/carray_core.c +22 -16
- data/ext/carray_generate.c +3 -3
- data/ext/carray_mask.c +12 -2
- data/ext/carray_math.rb +20 -2
- data/ext/carray_numeric.c +32 -51
- data/ext/carray_order.c +159 -0
- data/ext/carray_test.c +13 -0
- data/ext/carray_undef.c +0 -8
- data/ext/carray_utils.c +126 -47
- data/ext/extconf.rb +13 -1
- data/ext/mkmath.rb +1 -1
- data/ext/ruby_carray.c +8 -1
- data/ext/ruby_ccomplex.c +1 -1
- data/ext/version.h +4 -4
- data/lib/carray.rb +7 -9
- data/lib/carray/autoload.rb +0 -2
- data/lib/carray/basic.rb +3 -5
- data/lib/carray/broadcast.rb +78 -22
- data/lib/carray/compose.rb +34 -10
- data/lib/carray/construct.rb +36 -14
- data/lib/carray/info.rb +1 -3
- data/lib/carray/inspect.rb +3 -5
- data/lib/carray/io/imagemagick.rb +1 -3
- data/lib/carray/iterator.rb +2 -3
- data/lib/carray/mask.rb +18 -7
- data/lib/carray/math.rb +4 -6
- data/lib/carray/math/histogram.rb +1 -3
- data/lib/carray/math/recurrence.rb +1 -3
- data/lib/carray/mkmf.rb +1 -3
- data/lib/carray/object/ca_obj_iterator.rb +1 -3
- data/lib/carray/object/ca_obj_link.rb +1 -3
- data/lib/carray/object/ca_obj_pack.rb +1 -3
- data/lib/carray/obsolete.rb +1 -17
- data/lib/carray/ordering.rb +1 -3
- data/lib/carray/serialize.rb +34 -25
- data/lib/carray/string.rb +1 -3
- data/lib/carray/struct.rb +3 -5
- data/lib/carray/testing.rb +5 -10
- data/lib/carray/time.rb +1 -3
- data/lib/carray/transform.rb +12 -3
- data/misc/NOTE +16 -38
- data/spec/Classes/CAUnboudRepeat_spec.rb +24 -0
- data/spec/Features/feature_attributes_spec.rb +6 -6
- data/spec/Features/feature_boolean_spec.rb +15 -14
- data/spec/Features/feature_broadcast.rb +16 -0
- data/spec/Features/feature_cast_spec.rb +1 -1
- data/spec/Features/feature_mask_spec.rb +6 -0
- metadata +10 -11
data/ext/carray_order.c
CHANGED
@@ -869,6 +869,162 @@ rb_ca_linear_search_nearest_index (VALUE self, VALUE value)
|
|
869
869
|
return ( NIL_P(raddr) ) ? Qnil : rb_ca_addr2index(self, raddr);
|
870
870
|
}
|
871
871
|
|
872
|
+
/* ----------------------------------------------------------------- */
|
873
|
+
|
874
|
+
static ca_size_t
|
875
|
+
linear_index (ca_size_t n, double *y, double yy, double *idx)
|
876
|
+
{
|
877
|
+
ca_size_t a, b, c, x1;
|
878
|
+
double ya, yb, yc;
|
879
|
+
double y1, y2;
|
880
|
+
double rest;
|
881
|
+
|
882
|
+
if ( yy <= y[0] ) {
|
883
|
+
x1 = 0;
|
884
|
+
goto found;
|
885
|
+
}
|
886
|
+
|
887
|
+
if ( yy >= y[n-1] ) {
|
888
|
+
x1 = n-2;
|
889
|
+
goto found;
|
890
|
+
}
|
891
|
+
|
892
|
+
/* check for equally spaced scale */
|
893
|
+
|
894
|
+
a = (ca_size_t)((yy-y[0])/(y[n-1]-y[0])*(n-1));
|
895
|
+
|
896
|
+
if ( a >= 0 && a < n-1 ) {
|
897
|
+
if ( (y[a] - yy) * (y[a+1] - yy) <= 0 ) { /* lucky case */
|
898
|
+
x1 = a;
|
899
|
+
goto found;
|
900
|
+
}
|
901
|
+
}
|
902
|
+
|
903
|
+
/* binary section method */
|
904
|
+
|
905
|
+
a = 0;
|
906
|
+
b = n-1;
|
907
|
+
|
908
|
+
ya = y[a];
|
909
|
+
yb = y[b];
|
910
|
+
|
911
|
+
if ( ya > yb ) {
|
912
|
+
return -1; /* input scale array should have accending order */
|
913
|
+
}
|
914
|
+
|
915
|
+
while ( (b - a) >= 1 ) {
|
916
|
+
|
917
|
+
c = (a + b)/2;
|
918
|
+
yc = y[c];
|
919
|
+
if ( a == c ) {
|
920
|
+
break;
|
921
|
+
}
|
922
|
+
|
923
|
+
if ( yc == yy ) {
|
924
|
+
a = c;
|
925
|
+
break;
|
926
|
+
}
|
927
|
+
else if ( (ya - yy) * (yc - yy) <= 0 ) {
|
928
|
+
b = c;
|
929
|
+
yb = yc;
|
930
|
+
}
|
931
|
+
else {
|
932
|
+
a = c;
|
933
|
+
ya = yc;
|
934
|
+
}
|
935
|
+
|
936
|
+
if ( ya > yb ) {
|
937
|
+
return -1; /* input scale array should have accending order */
|
938
|
+
}
|
939
|
+
}
|
940
|
+
|
941
|
+
x1 = a;
|
942
|
+
|
943
|
+
found:
|
944
|
+
|
945
|
+
y1 = y[x1];
|
946
|
+
y2 = y[x1+1];
|
947
|
+
rest = (yy-y1)/(y2-y1);
|
948
|
+
|
949
|
+
if ( fabs(y2-yy)/fabs(y2) < DBL_EPSILON*100 ) {
|
950
|
+
*idx = (double) (x1 + 1);
|
951
|
+
}
|
952
|
+
else if ( fabs(y1-yy)/fabs(y1) < DBL_EPSILON*100 ) {
|
953
|
+
*idx = (double) x1;
|
954
|
+
}
|
955
|
+
else {
|
956
|
+
*idx = rest + (double) x1;
|
957
|
+
}
|
958
|
+
|
959
|
+
return 0;
|
960
|
+
}
|
961
|
+
|
962
|
+
static VALUE
|
963
|
+
rb_ca_binary_search_linear_index (volatile VALUE self, volatile VALUE vx)
|
964
|
+
{
|
965
|
+
volatile VALUE out, out0;
|
966
|
+
CArray *ca, *sc, *cx, *co0, *co;
|
967
|
+
ca_size_t n;
|
968
|
+
double *x;
|
969
|
+
double *px;
|
970
|
+
double *po;
|
971
|
+
ca_size_t i;
|
972
|
+
|
973
|
+
Data_Get_Struct(self, CArray, ca);
|
974
|
+
|
975
|
+
if ( rb_ca_is_any_masked(self) ) {
|
976
|
+
rb_raise(rb_eRuntimeError, "self should not have any masked elements");
|
977
|
+
}
|
978
|
+
|
979
|
+
sc = ca_wrap_readonly(self, CA_FLOAT64);
|
980
|
+
cx = ca_wrap_readonly(vx, CA_FLOAT64);
|
981
|
+
|
982
|
+
co0 = carray_new(ca->data_type, cx->ndim, cx->dim, 0, NULL);
|
983
|
+
out = out0 = ca_wrap_struct(co0);
|
984
|
+
co = ca_wrap_writable(out, CA_FLOAT64);
|
985
|
+
|
986
|
+
ca_attach_n(3, sc, cx, co);
|
987
|
+
|
988
|
+
n = sc->elements;
|
989
|
+
x = (double*) sc->ptr;
|
990
|
+
px = (double*) cx->ptr;
|
991
|
+
po = (double*) co->ptr;
|
992
|
+
|
993
|
+
ca_update_mask(cx);
|
994
|
+
if ( cx->mask ) {
|
995
|
+
boolean8_t *mx, *mo;
|
996
|
+
ca_create_mask(co);
|
997
|
+
mx = (boolean8_t *) cx->mask->ptr;
|
998
|
+
mo = (boolean8_t *) co->mask->ptr;
|
999
|
+
for (i=0; i<cx->elements; i++) {
|
1000
|
+
if ( ! *mx ) {
|
1001
|
+
linear_index(n, x, *px, po);
|
1002
|
+
}
|
1003
|
+
else {
|
1004
|
+
*mo = 1;
|
1005
|
+
}
|
1006
|
+
mx++; mo++; px++, po++;
|
1007
|
+
}
|
1008
|
+
}
|
1009
|
+
else {
|
1010
|
+
for (i=0; i<cx->elements; i++) {
|
1011
|
+
linear_index(n, x, *px, po);
|
1012
|
+
px++, po++;
|
1013
|
+
}
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
ca_sync(co);
|
1017
|
+
ca_detach_n(3, sc, cx, co);
|
1018
|
+
|
1019
|
+
if ( rb_ca_is_scalar(vx) ) {
|
1020
|
+
return rb_funcall(out0, rb_intern("[]"), 1, INT2NUM(0));
|
1021
|
+
}
|
1022
|
+
else {
|
1023
|
+
return out0;
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
|
872
1028
|
void
|
873
1029
|
Init_carray_order ()
|
874
1030
|
{
|
@@ -893,4 +1049,7 @@ Init_carray_order ()
|
|
893
1049
|
rb_define_method(rb_cCArray, "search_nearest_index",
|
894
1050
|
rb_ca_linear_search_nearest_index, 1);
|
895
1051
|
|
1052
|
+
rb_define_method(rb_cCArray, "section",
|
1053
|
+
rb_ca_binary_search_linear_index, 1);
|
1054
|
+
|
896
1055
|
}
|
data/ext/carray_test.c
CHANGED
@@ -216,6 +216,12 @@ rb_obj_is_data_class (VALUE rtype)
|
|
216
216
|
return Qfalse;
|
217
217
|
}
|
218
218
|
|
219
|
+
static VALUE
|
220
|
+
rb_ca_s_is_data_class (VALUE self, VALUE rklass)
|
221
|
+
{
|
222
|
+
return rb_obj_is_data_class(rklass);
|
223
|
+
}
|
224
|
+
|
219
225
|
/* ------------------------------------------------------------- */
|
220
226
|
|
221
227
|
/* @overload valid_index? (*idx)
|
@@ -239,9 +245,11 @@ rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
|
|
239
245
|
}
|
240
246
|
for (i=0; i<ca->ndim; i++) {
|
241
247
|
idx = NUM2SIZE(argv[i]);
|
248
|
+
/*
|
242
249
|
if ( idx < 0 ) {
|
243
250
|
idx += ca->dim[i];
|
244
251
|
}
|
252
|
+
*/
|
245
253
|
if ( idx < 0 || idx >= ca->dim[i] ) {
|
246
254
|
return Qfalse;
|
247
255
|
}
|
@@ -264,9 +272,11 @@ rb_ca_is_valid_addr (VALUE self, VALUE raddr)
|
|
264
272
|
|
265
273
|
Data_Get_Struct(self, CArray, ca);
|
266
274
|
addr = NUM2SIZE(raddr);
|
275
|
+
/*
|
267
276
|
if ( addr < 0 ) {
|
268
277
|
addr += ca->elements;
|
269
278
|
}
|
279
|
+
*/
|
270
280
|
if ( addr < 0 || addr >= ca->elements ) {
|
271
281
|
return Qfalse;
|
272
282
|
}
|
@@ -598,4 +608,7 @@ Init_carray_test ()
|
|
598
608
|
rb_define_method(rb_cCArray, "==", rb_ca_equal, 1);
|
599
609
|
rb_define_alias(rb_cCArray, "eql?", "==");
|
600
610
|
rb_define_method(rb_cCArray, "hash", rb_ca_hash, 0);
|
611
|
+
|
612
|
+
rb_define_singleton_method(rb_cCArray, "data_class?", rb_ca_s_is_data_class, 1);
|
613
|
+
|
601
614
|
}
|
data/ext/carray_undef.c
CHANGED
@@ -41,12 +41,6 @@ static VALUE rb_ud_equal (VALUE self, VALUE other)
|
|
41
41
|
return ( self == other ) ? Qtrue : Qfalse;
|
42
42
|
}
|
43
43
|
|
44
|
-
|
45
|
-
static VALUE rb_obj_is_undef (VALUE self)
|
46
|
-
{
|
47
|
-
return ( self == CA_UNDEF ) ? Qtrue : Qfalse;
|
48
|
-
}
|
49
|
-
|
50
44
|
void
|
51
45
|
Init_carray_undef ()
|
52
46
|
{
|
@@ -61,7 +55,5 @@ Init_carray_undef ()
|
|
61
55
|
CA_UNDEF = rb_funcall(rb_cUNDEF, rb_intern("new"), 0);
|
62
56
|
rb_undef_method(CLASS_OF(rb_cUNDEF), "new");
|
63
57
|
rb_const_set(rb_cObject, rb_intern("UNDEF"), CA_UNDEF);
|
64
|
-
|
65
|
-
rb_define_method(rb_cObject, "undef?", rb_obj_is_undef, 0);
|
66
58
|
}
|
67
59
|
|
data/ext/carray_utils.c
CHANGED
@@ -18,36 +18,10 @@
|
|
18
18
|
#include "st.h"
|
19
19
|
#endif
|
20
20
|
|
21
|
-
|
22
|
-
#define
|
23
|
-
|
24
|
-
|
25
|
-
RSTRUCT_ENUM_END
|
26
|
-
};
|
27
|
-
struct RStruct {
|
28
|
-
struct RBasic basic;
|
29
|
-
union {
|
30
|
-
struct {
|
31
|
-
long len;
|
32
|
-
const VALUE *ptr;
|
33
|
-
} heap;
|
34
|
-
const VALUE ary[RSTRUCT_EMBED_LEN_MAX];
|
35
|
-
} as;
|
36
|
-
};
|
37
|
-
#define RSTRUCT(obj) (R_CAST(RStruct)(obj))
|
38
|
-
#endif
|
39
|
-
|
40
|
-
#if RUBY_VERSION_CODE >= 190
|
41
|
-
#define RANGE_BEG(r) (RSTRUCT(r)->as.ary[0])
|
42
|
-
#define RANGE_END(r) (RSTRUCT(r)->as.ary[1])
|
43
|
-
#define RANGE_EXCL(r) (RSTRUCT(r)->as.ary[2])
|
44
|
-
#else
|
45
|
-
static ID id_beg, id_end, id_excl;
|
46
|
-
#define RANGE_BEG(r) (rb_ivar_get(r, id_beg))
|
47
|
-
#define RANGE_END(r) (rb_ivar_get(r, id_end))
|
48
|
-
#define RANGE_EXCL(r) (rb_ivar_get(r, id_excl))
|
49
|
-
#endif
|
50
|
-
|
21
|
+
static ID id_begin, id_end, id_excl_end;
|
22
|
+
#define RANGE_BEG(r) (rb_funcall(r, id_begin, 0))
|
23
|
+
#define RANGE_END(r) (rb_funcall(r, id_end, 0))
|
24
|
+
#define RANGE_EXCL(r) (rb_funcall(r, id_excl_end, 0))
|
51
25
|
|
52
26
|
/* ------------------------------------------------------------------- */
|
53
27
|
|
@@ -163,7 +137,7 @@ void
|
|
163
137
|
ca_parse_range (VALUE arg, ca_size_t size,
|
164
138
|
ca_size_t *poffset, ca_size_t *pcount, ca_size_t *pstep)
|
165
139
|
{
|
166
|
-
ca_size_t
|
140
|
+
ca_size_t start, last, count, step, bound, excl;
|
167
141
|
|
168
142
|
retry:
|
169
143
|
|
@@ -182,24 +156,59 @@ ca_parse_range (VALUE arg, ca_size_t size,
|
|
182
156
|
}
|
183
157
|
else if ( rb_obj_is_kind_of(arg, rb_cRange) ) {
|
184
158
|
/* i..j */
|
185
|
-
|
159
|
+
start = NUM2SIZE(RANGE_BEG(arg));
|
186
160
|
last = NUM2SIZE(RANGE_END(arg));
|
187
161
|
excl = RTEST(RANGE_EXCL(arg));
|
188
|
-
CA_CHECK_INDEX(
|
162
|
+
CA_CHECK_INDEX(start, size);
|
189
163
|
if ( last < 0 ) {
|
190
164
|
last += size;
|
191
165
|
}
|
192
166
|
if ( excl ) {
|
193
|
-
last += ( (last>=
|
167
|
+
last += ( (last>=start) ? -1 : 1 );
|
194
168
|
}
|
195
169
|
if ( last < 0 || last >= size ) {
|
196
170
|
rb_raise(rb_eIndexError,
|
197
171
|
"invalid index range");
|
198
172
|
}
|
199
|
-
*poffset =
|
200
|
-
*pcount = llabs(last -
|
173
|
+
*poffset = start;
|
174
|
+
*pcount = llabs(last - start) + 1;
|
201
175
|
*pstep = 1;
|
202
176
|
}
|
177
|
+
#ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
|
178
|
+
else if ( rb_obj_is_kind_of(arg, rb_cArithSeq) ) { /* ca[--,ArithSeq,--]*/
|
179
|
+
rb_arithmetic_sequence_components_t x;
|
180
|
+
rb_arithmetic_sequence_extract(arg, &x);
|
181
|
+
|
182
|
+
start = NUM2SIZE(x.begin);
|
183
|
+
last = NUM2SIZE(x.end);
|
184
|
+
excl = RTEST(x.exclude_end);
|
185
|
+
step = NUM2SIZE(x.step);
|
186
|
+
if ( step == 0 ) {
|
187
|
+
rb_raise(rb_eRuntimeError, "step should not be 0");
|
188
|
+
}
|
189
|
+
if ( last < 0 ) {
|
190
|
+
last += size;
|
191
|
+
}
|
192
|
+
if ( excl ) {
|
193
|
+
last += ( (last>=start) ? -1 : 1 );
|
194
|
+
}
|
195
|
+
if ( last < 0 || last >= size ) {
|
196
|
+
rb_raise(rb_eIndexError, "index out of range");
|
197
|
+
}
|
198
|
+
CA_CHECK_INDEX(start, size);
|
199
|
+
if ( (last - start) * step < 0 ) {
|
200
|
+
count = 1;
|
201
|
+
}
|
202
|
+
else {
|
203
|
+
count = llabs(last - start)/llabs(step) + 1;
|
204
|
+
}
|
205
|
+
bound = start + (count - 1)*step;
|
206
|
+
CA_CHECK_INDEX(bound, size);
|
207
|
+
*poffset = start;
|
208
|
+
*pcount = count;
|
209
|
+
*pstep = step;
|
210
|
+
}
|
211
|
+
#endif
|
203
212
|
else if ( TYPE(arg) == T_ARRAY ) {
|
204
213
|
if ( RARRAY_LEN(arg) == 1 ) { /* [nil] or [i..j] or [i] */
|
205
214
|
arg = rb_ary_entry(arg, 0);
|
@@ -252,6 +261,41 @@ ca_parse_range (VALUE arg, ca_size_t size,
|
|
252
261
|
*pcount = count;
|
253
262
|
*pstep = step;
|
254
263
|
}
|
264
|
+
#ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
|
265
|
+
else if ( rb_obj_is_kind_of(arg0, rb_cArithSeq) ) { /* ca[--,ArithSeq,--]*/
|
266
|
+
rb_arithmetic_sequence_components_t x;
|
267
|
+
rb_arithmetic_sequence_extract(arg0, &x);
|
268
|
+
|
269
|
+
start = NUM2SIZE(x.begin);
|
270
|
+
last = NUM2SIZE(x.end);
|
271
|
+
excl = RTEST(x.exclude_end);
|
272
|
+
step = NUM2SIZE(x.step);
|
273
|
+
if ( step == 0 ) {
|
274
|
+
rb_raise(rb_eRuntimeError, "step should not be 0");
|
275
|
+
}
|
276
|
+
if ( last < 0 ) {
|
277
|
+
last += size;
|
278
|
+
}
|
279
|
+
if ( excl ) {
|
280
|
+
last += ( (last>=start) ? -1 : 1 );
|
281
|
+
}
|
282
|
+
if ( last < 0 || last >= size ) {
|
283
|
+
rb_raise(rb_eIndexError, "index out of range");
|
284
|
+
}
|
285
|
+
CA_CHECK_INDEX(start, size);
|
286
|
+
if ( (last - start) * step < 0 ) {
|
287
|
+
count = 1;
|
288
|
+
}
|
289
|
+
else {
|
290
|
+
count = llabs(last - start)/llabs(step) + 1;
|
291
|
+
}
|
292
|
+
bound = start + (count - 1)*step;
|
293
|
+
CA_CHECK_INDEX(bound, size);
|
294
|
+
*poffset = start;
|
295
|
+
*pcount = count;
|
296
|
+
*pstep = step;
|
297
|
+
}
|
298
|
+
#endif
|
255
299
|
else { /* [i,n] */
|
256
300
|
start = NUM2SIZE(arg0);
|
257
301
|
count = NUM2SIZE(arg1);
|
@@ -290,7 +334,7 @@ void
|
|
290
334
|
ca_parse_range_without_check (VALUE arg, ca_size_t size,
|
291
335
|
ca_size_t *poffset, ca_size_t *pcount, ca_size_t *pstep)
|
292
336
|
{
|
293
|
-
ca_size_t
|
337
|
+
ca_size_t start, last, count, step, bound, excl;
|
294
338
|
|
295
339
|
retry:
|
296
340
|
|
@@ -308,16 +352,35 @@ ca_parse_range_without_check (VALUE arg, ca_size_t size,
|
|
308
352
|
}
|
309
353
|
else if ( rb_obj_is_kind_of(arg, rb_cRange) ) {
|
310
354
|
/* i..j */
|
311
|
-
|
355
|
+
start = NUM2SIZE(RANGE_BEG(arg));
|
312
356
|
last = NUM2SIZE(RANGE_END(arg));
|
313
357
|
excl = RTEST(RANGE_EXCL(arg));
|
314
358
|
if ( excl ) {
|
315
|
-
last += ( (last>=
|
359
|
+
last += ( (last>=start) ? -1 : 1 );
|
316
360
|
}
|
317
|
-
*poffset =
|
318
|
-
*pcount = last -
|
361
|
+
*poffset = start;
|
362
|
+
*pcount = last - start + 1;
|
319
363
|
*pstep = 1;
|
320
364
|
}
|
365
|
+
#ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
|
366
|
+
else if ( rb_obj_is_kind_of(arg, rb_cArithSeq) ) { /* ca[--,ArithSeq,--]*/
|
367
|
+
rb_arithmetic_sequence_components_t x;
|
368
|
+
rb_arithmetic_sequence_extract(arg, &x);
|
369
|
+
|
370
|
+
start = NUM2SIZE(x.begin);
|
371
|
+
last = NUM2SIZE(x.end);
|
372
|
+
excl = RTEST(x.exclude_end);
|
373
|
+
step = NUM2SIZE(x.step);
|
374
|
+
if ( excl ) {
|
375
|
+
last += ( (last>=start) ? -1 : 1 );
|
376
|
+
}
|
377
|
+
count = (last - start)/llabs(step) + 1;
|
378
|
+
bound = start + (count - 1)*step;
|
379
|
+
*poffset = start;
|
380
|
+
*pcount = count;
|
381
|
+
*pstep = step;
|
382
|
+
}
|
383
|
+
#endif
|
321
384
|
else if ( TYPE(arg) == T_ARRAY ) {
|
322
385
|
if ( RARRAY_LEN(arg) == 1 ) { /* [nil] or [i..j] or [i] */
|
323
386
|
arg = rb_ary_entry(arg, 0);
|
@@ -349,6 +412,25 @@ ca_parse_range_without_check (VALUE arg, ca_size_t size,
|
|
349
412
|
*pcount = count;
|
350
413
|
*pstep = step;
|
351
414
|
}
|
415
|
+
#ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
|
416
|
+
else if ( rb_obj_is_kind_of(arg0, rb_cArithSeq) ) { /* ca[--,ArithSeq,--]*/
|
417
|
+
rb_arithmetic_sequence_components_t x;
|
418
|
+
rb_arithmetic_sequence_extract(arg0, &x);
|
419
|
+
|
420
|
+
start = NUM2SIZE(x.begin);
|
421
|
+
last = NUM2SIZE(x.end);
|
422
|
+
excl = RTEST(x.exclude_end);
|
423
|
+
step = NUM2SIZE(x.step);
|
424
|
+
if ( excl ) {
|
425
|
+
last += ( (last>=start) ? -1 : 1 );
|
426
|
+
}
|
427
|
+
count = (last - start)/llabs(step) + 1;
|
428
|
+
bound = start + (count - 1)*step;
|
429
|
+
*poffset = start;
|
430
|
+
*pcount = count;
|
431
|
+
*pstep = step;
|
432
|
+
}
|
433
|
+
#endif
|
352
434
|
else { /* [i,n] */
|
353
435
|
start = NUM2SIZE(arg0);
|
354
436
|
count = NUM2SIZE(arg1);
|
@@ -750,12 +832,9 @@ rb_set_options (VALUE ropt, const char *spec_in, ...)
|
|
750
832
|
void
|
751
833
|
Init_carray_utils ()
|
752
834
|
{
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
id_end = rb_intern("end");
|
757
|
-
id_excl = rb_intern("excl");
|
758
|
-
#endif
|
835
|
+
id_begin = rb_intern("begin");
|
836
|
+
id_end = rb_intern("end");
|
837
|
+
id_excl_end = rb_intern("exclude_end?");
|
759
838
|
|
760
839
|
rb_define_singleton_method(rb_cCArray, "_scan_float",
|
761
840
|
rb_ca_s_scan_float, -1);
|