carray 1.5.1 → 1.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +32 -0
  3. data/{LICENSES → LICENSE} +0 -0
  4. data/NEWS.md +83 -0
  5. data/README.md +34 -18
  6. data/Rakefile +1 -1
  7. data/TODO.md +17 -0
  8. data/carray.gemspec +10 -7
  9. data/ext/ca_iter_block.c +3 -5
  10. data/ext/ca_iter_dimension.c +4 -5
  11. data/ext/ca_iter_window.c +2 -4
  12. data/ext/ca_obj_array.c +394 -124
  13. data/ext/ca_obj_bitarray.c +6 -11
  14. data/ext/ca_obj_bitfield.c +5 -9
  15. data/ext/ca_obj_block.c +5 -12
  16. data/ext/ca_obj_fake.c +3 -5
  17. data/ext/ca_obj_farray.c +3 -5
  18. data/ext/ca_obj_field.c +15 -17
  19. data/ext/ca_obj_grid.c +5 -6
  20. data/ext/ca_obj_mapping.c +2 -4
  21. data/ext/ca_obj_object.c +3 -5
  22. data/ext/ca_obj_reduce.c +2 -4
  23. data/ext/ca_obj_refer.c +11 -15
  24. data/ext/ca_obj_repeat.c +2 -4
  25. data/ext/ca_obj_select.c +2 -4
  26. data/ext/ca_obj_shift.c +3 -5
  27. data/ext/ca_obj_transpose.c +3 -5
  28. data/ext/ca_obj_unbound_repeat.c +68 -122
  29. data/ext/ca_obj_window.c +7 -9
  30. data/ext/carray.h +17 -8
  31. data/ext/carray_access.c +183 -58
  32. data/ext/carray_attribute.c +151 -197
  33. data/ext/carray_call_cfunc.c +1 -3
  34. data/ext/carray_cast.c +345 -144
  35. data/ext/carray_cast_func.rb +1 -2
  36. data/ext/carray_class.c +28 -36
  37. data/ext/carray_conversion.c +56 -59
  38. data/ext/carray_copy.c +16 -32
  39. data/ext/carray_core.c +73 -60
  40. data/ext/carray_element.c +25 -44
  41. data/ext/carray_generate.c +74 -53
  42. data/ext/carray_iterator.c +13 -15
  43. data/ext/carray_loop.c +53 -82
  44. data/ext/carray_mask.c +99 -119
  45. data/ext/carray_math.rb +28 -12
  46. data/ext/carray_mathfunc.c +1 -3
  47. data/ext/carray_numeric.c +42 -45
  48. data/ext/carray_operator.c +45 -32
  49. data/ext/carray_order.c +231 -65
  50. data/ext/carray_sort_addr.c +14 -21
  51. data/ext/carray_stat.c +1 -3
  52. data/ext/carray_stat_proc.rb +2 -4
  53. data/ext/carray_test.c +41 -30
  54. data/ext/carray_undef.c +1 -11
  55. data/ext/carray_utils.c +138 -51
  56. data/ext/extconf.rb +14 -2
  57. data/ext/mkmath.rb +2 -2
  58. data/ext/ruby_carray.c +15 -7
  59. data/ext/ruby_ccomplex.c +2 -4
  60. data/ext/ruby_float_func.c +1 -3
  61. data/ext/version.h +5 -7
  62. data/lib/carray.rb +9 -9
  63. data/lib/carray/autoload.rb +0 -2
  64. data/lib/carray/autoload/autoload_gem_numo_narray.rb +6 -6
  65. data/lib/carray/basic.rb +1 -3
  66. data/lib/carray/broadcast.rb +101 -0
  67. data/lib/carray/compose.rb +34 -10
  68. data/lib/carray/construct.rb +57 -18
  69. data/lib/carray/info.rb +1 -3
  70. data/lib/carray/inspect.rb +3 -5
  71. data/lib/carray/io/imagemagick.rb +1 -3
  72. data/lib/carray/iterator.rb +3 -3
  73. data/lib/carray/mask.rb +18 -7
  74. data/lib/carray/math.rb +4 -6
  75. data/lib/carray/math/histogram.rb +1 -3
  76. data/lib/carray/math/recurrence.rb +1 -3
  77. data/lib/carray/mkmf.rb +1 -3
  78. data/lib/carray/object/ca_obj_iterator.rb +1 -3
  79. data/lib/carray/object/ca_obj_link.rb +1 -3
  80. data/lib/carray/object/ca_obj_pack.rb +1 -3
  81. data/lib/carray/obsolete.rb +1 -17
  82. data/lib/carray/ordering.rb +29 -5
  83. data/lib/carray/serialize.rb +34 -25
  84. data/lib/carray/string.rb +1 -3
  85. data/lib/carray/struct.rb +3 -5
  86. data/lib/carray/testing.rb +5 -10
  87. data/lib/carray/time.rb +1 -3
  88. data/lib/carray/transform.rb +12 -3
  89. data/misc/NOTE +16 -38
  90. data/spec/Classes/CABitfield_spec.rb +58 -0
  91. data/spec/Classes/CABlockIterator_spec.rb +114 -0
  92. data/spec/Classes/CABlock_spec.rb +205 -0
  93. data/spec/Classes/CAField_spec.rb +39 -0
  94. data/spec/Classes/CAGrid_spec.rb +75 -0
  95. data/spec/Classes/CAMap_spec.rb +0 -0
  96. data/{test/test_CAMapping.rb → spec/Classes/CAMapping_spec.rb} +35 -36
  97. data/spec/Classes/CAObject_attribute_spec.rb +33 -0
  98. data/spec/Classes/CAObject_spec.rb +33 -0
  99. data/spec/Classes/CARefer_spec.rb +93 -0
  100. data/spec/Classes/CARepeat_spec.rb +65 -0
  101. data/spec/Classes/CASelect_spec.rb +22 -0
  102. data/spec/Classes/CAShift_spec.rb +16 -0
  103. data/spec/Classes/CAStruct_spec.rb +71 -0
  104. data/{test/test_CATranspose.rb → spec/Classes/CATranspose_spec.rb} +20 -21
  105. data/spec/Classes/CAUnboudRepeat_spec.rb +102 -0
  106. data/spec/Classes/CAWindow_spec.rb +54 -0
  107. data/spec/Classes/CAWrap_spec.rb +8 -0
  108. data/{test/test_CArray.rb → spec/Classes/CArray_spec.rb} +48 -92
  109. data/spec/Classes/CScalar_spec.rb +55 -0
  110. data/spec/Features/feature_130_spec.rb +19 -0
  111. data/spec/Features/feature_attributes_spec.rb +280 -0
  112. data/spec/Features/feature_boolean_spec.rb +98 -0
  113. data/spec/Features/feature_broadcast.rb +116 -0
  114. data/spec/Features/feature_cast_function.rb +19 -0
  115. data/spec/Features/feature_cast_spec.rb +33 -0
  116. data/spec/Features/feature_class_spec.rb +84 -0
  117. data/spec/Features/feature_complex_spec.rb +42 -0
  118. data/{test/test_composite.rb → spec/Features/feature_composite_spec.rb} +17 -18
  119. data/spec/Features/feature_convert_spec.rb +46 -0
  120. data/spec/Features/feature_copy_spec.rb +123 -0
  121. data/spec/Features/feature_creation_spec.rb +84 -0
  122. data/spec/Features/feature_element_spec.rb +144 -0
  123. data/spec/Features/feature_extream_spec.rb +54 -0
  124. data/spec/Features/feature_generate_spec.rb +74 -0
  125. data/spec/Features/feature_index_spec.rb +69 -0
  126. data/spec/Features/feature_mask_spec.rb +580 -0
  127. data/spec/Features/feature_math_spec.rb +97 -0
  128. data/spec/Features/feature_order_spec.rb +146 -0
  129. data/spec/Features/feature_ref_store_spec.rb +209 -0
  130. data/spec/Features/feature_serialization_spec.rb +125 -0
  131. data/spec/Features/feature_stat_spec.rb +397 -0
  132. data/spec/Features/feature_virtual_spec.rb +48 -0
  133. data/spec/Features/method_eq_spec.rb +81 -0
  134. data/spec/Features/method_is_nan_spec.rb +12 -0
  135. data/spec/Features/method_map_spec.rb +54 -0
  136. data/spec/Features/method_max_with.rb +20 -0
  137. data/spec/Features/method_min_with.rb +19 -0
  138. data/spec/Features/method_ne_spec.rb +18 -0
  139. data/spec/Features/method_project_spec.rb +188 -0
  140. data/spec/Features/method_ref_spec.rb +27 -0
  141. data/spec/Features/method_round_spec.rb +11 -0
  142. data/spec/Features/method_s_linspace_spec.rb +48 -0
  143. data/spec/Features/method_s_span_spec.rb +14 -0
  144. data/spec/Features/method_seq_spec.rb +47 -0
  145. data/spec/Features/method_sort_with.rb +43 -0
  146. data/spec/Features/method_sorted_with.rb +29 -0
  147. data/spec/Features/method_span_spec.rb +42 -0
  148. data/spec/Features/method_wrap_readonly_spec.rb +43 -0
  149. data/{test → spec/UnitTest}/test_CAVirtual.rb +0 -0
  150. data/spec/spec_all.rb +0 -1
  151. data/utils/convert_test.rb +73 -0
  152. data/utils/{extract_rdoc.rb → extract_yard.rb} +7 -12
  153. metadata +74 -58
  154. data/spec/CABlockIterator/CABlockIterator_spec.rb +0 -113
  155. data/spec/CArray/bug/store_spec.rb +0 -27
  156. data/spec/CArray/index/repeat_spec.rb +0 -10
  157. data/spec/CArray/method/eq_spec.rb +0 -80
  158. data/spec/CArray/method/is_nan_spec.rb +0 -12
  159. data/spec/CArray/method/ne_spec.rb +0 -18
  160. data/spec/CArray/method/round_spec.rb +0 -11
  161. data/spec/CArray/object/_attribute_spec.rb +0 -32
  162. data/spec/CArray/object/s_new_spec.rb +0 -31
  163. data/spec/CArray/serialize/Serialization_spec.rb +0 -89
  164. data/test/test_130.rb +0 -23
  165. data/test/test_ALL.rb +0 -49
  166. data/test/test_CABitfield.rb +0 -59
  167. data/test/test_CABlock.rb +0 -208
  168. data/test/test_CAField.rb +0 -40
  169. data/test/test_CAGrid.rb +0 -76
  170. data/test/test_CAMmap.rb +0 -11
  171. data/test/test_CARefer.rb +0 -94
  172. data/test/test_CARepeat.rb +0 -66
  173. data/test/test_CASelect.rb +0 -23
  174. data/test/test_CAShift.rb +0 -17
  175. data/test/test_CAWindow.rb +0 -55
  176. data/test/test_CAWrap.rb +0 -9
  177. data/test/test_CComplex.rb +0 -83
  178. data/test/test_CScalar.rb +0 -91
  179. data/test/test_attribute.rb +0 -281
  180. data/test/test_block_iterator.rb +0 -17
  181. data/test/test_boolean.rb +0 -99
  182. data/test/test_cast.rb +0 -33
  183. data/test/test_class.rb +0 -85
  184. data/test/test_complex.rb +0 -43
  185. data/test/test_convert.rb +0 -79
  186. data/test/test_copy.rb +0 -141
  187. data/test/test_creation.rb +0 -85
  188. data/test/test_element.rb +0 -146
  189. data/test/test_extream.rb +0 -55
  190. data/test/test_generate.rb +0 -75
  191. data/test/test_index.rb +0 -71
  192. data/test/test_mask.rb +0 -578
  193. data/test/test_math.rb +0 -98
  194. data/test/test_order.rb +0 -147
  195. data/test/test_ref_store.rb +0 -211
  196. data/test/test_stat.rb +0 -406
  197. data/test/test_struct.rb +0 -72
  198. data/test/test_virtual.rb +0 -49
data/ext/carray_stat.c CHANGED
@@ -3,10 +3,8 @@
3
3
  carray_stat.c
4
4
 
5
5
  This file is part of Ruby/CArray extension library.
6
- You can redistribute it and/or modify it under the terms of
7
- the Ruby Licence.
8
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
@@ -286,12 +286,10 @@ header = <<HERE_END
286
286
  carray_stat_proc.c
287
287
 
288
288
  This file is part of Ruby/CArray extension library.
289
- You can redistribute it and/or modify it under the terms of
290
- the Ruby Licence.
291
289
 
292
- This file is automatically generated from carray_stat_proc.rb
293
290
 
294
- Copyright (C) 2005 Hiroki Motoyoshi
291
+ This file is automatically generated from carray_stat_proc.rb
292
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
295
293
 
296
294
  ---------------------------------------------------------------------------- */
297
295
 
data/ext/carray_test.c CHANGED
@@ -3,10 +3,8 @@
3
3
  carray_test.c
4
4
 
5
5
  This file is part of Ruby/CArray extension library.
6
- You can redistribute it and/or modify it under the terms of
7
- the Ruby Licence.
8
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  This file includes the modified routine (ca_mem_hash) from
12
10
 
@@ -218,13 +216,18 @@ rb_obj_is_data_class (VALUE rtype)
218
216
  return Qfalse;
219
217
  }
220
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
+
221
225
  /* ------------------------------------------------------------- */
222
226
 
223
- /* rdoc:
224
- class CArray
225
- def valid_index? (*index)
226
- end
227
- end
227
+ /* @overload valid_index? (*idx)
228
+
229
+ (Inquiry)
230
+ Returns true if the given number list is valid as array index for the object
228
231
  */
229
232
 
230
233
  static VALUE
@@ -242,9 +245,11 @@ rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
242
245
  }
243
246
  for (i=0; i<ca->ndim; i++) {
244
247
  idx = NUM2SIZE(argv[i]);
248
+ /*
245
249
  if ( idx < 0 ) {
246
250
  idx += ca->dim[i];
247
251
  }
252
+ */
248
253
  if ( idx < 0 || idx >= ca->dim[i] ) {
249
254
  return Qfalse;
250
255
  }
@@ -253,11 +258,10 @@ rb_ca_is_valid_index (int argc, VALUE *argv, VALUE self)
253
258
  return Qtrue;
254
259
  }
255
260
 
256
- /* rdoc:
257
- class CArray
258
- def valid_addr? (addr)
259
- end
260
- end
261
+ /* @overload valid_addr? (*addr)
262
+
263
+ (Inquiry)
264
+ Returns true if the given number is valid as array address for the object
261
265
  */
262
266
 
263
267
  static VALUE
@@ -268,9 +272,11 @@ rb_ca_is_valid_addr (VALUE self, VALUE raddr)
268
272
 
269
273
  Data_Get_Struct(self, CArray, ca);
270
274
  addr = NUM2SIZE(raddr);
275
+ /*
271
276
  if ( addr < 0 ) {
272
277
  addr += ca->elements;
273
278
  }
279
+ */
274
280
  if ( addr < 0 || addr >= ca->elements ) {
275
281
  return Qfalse;
276
282
  }
@@ -279,11 +285,10 @@ rb_ca_is_valid_addr (VALUE self, VALUE raddr)
279
285
  }
280
286
  }
281
287
 
282
- /* rdoc:
283
- class CArray
284
- def has_same_shape? (other)
285
- end
286
- end
288
+ /* @overload has_same_shape?
289
+
290
+ (Inquiry)
291
+ Returns true if the object has the same shape with the given array.
287
292
  */
288
293
 
289
294
  static VALUE
@@ -453,12 +458,10 @@ ca_equal (void *ap, void *bp)
453
458
  return flag;
454
459
  }
455
460
 
456
- /* rdoc:
457
- class CArray
458
- def == (other)
459
- end
460
- alias eql? ==
461
- end
461
+ /* @overload == (other)
462
+
463
+ (Inquiry)
464
+ Returns true if the object equals the given array.
462
465
  */
463
466
 
464
467
  static VALUE
@@ -545,11 +548,10 @@ ca_hash (CArray *ca)
545
548
  return hash;
546
549
  }
547
550
 
548
- /* rdoc:
549
- class CArray
550
- def hash
551
- end
552
- end
551
+ /* @overload hash
552
+
553
+ (Inquiry)
554
+ Returns the hash value of the object.
553
555
  */
554
556
 
555
557
  VALUE
@@ -578,6 +580,12 @@ rb_ca_modify (VALUE self)
578
580
  */
579
581
  }
580
582
 
583
+ /* @overload freeze
584
+
585
+ Freeze the object.
586
+
587
+ */
588
+
581
589
  VALUE
582
590
  rb_ca_freeze (VALUE self)
583
591
  {
@@ -598,6 +606,9 @@ Init_carray_test ()
598
606
  rb_define_method(rb_cCArray, "freeze", rb_ca_freeze, 0);
599
607
 
600
608
  rb_define_method(rb_cCArray, "==", rb_ca_equal, 1);
601
- rb_define_method(rb_cCArray, "eql?", rb_ca_equal, 1);
609
+ rb_define_alias(rb_cCArray, "eql?", "==");
602
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
+
603
614
  }
data/ext/carray_undef.c CHANGED
@@ -3,10 +3,8 @@
3
3
  carray_undef.c
4
4
 
5
5
  This file is part of Ruby/CArray extension library.
6
- You can redistribute it and/or modify it under the terms of
7
- the Ruby Licence.
8
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
@@ -43,12 +41,6 @@ static VALUE rb_ud_equal (VALUE self, VALUE other)
43
41
  return ( self == other ) ? Qtrue : Qfalse;
44
42
  }
45
43
 
46
-
47
- static VALUE rb_obj_is_undef (VALUE self)
48
- {
49
- return ( self == CA_UNDEF ) ? Qtrue : Qfalse;
50
- }
51
-
52
44
  void
53
45
  Init_carray_undef ()
54
46
  {
@@ -63,7 +55,5 @@ Init_carray_undef ()
63
55
  CA_UNDEF = rb_funcall(rb_cUNDEF, rb_intern("new"), 0);
64
56
  rb_undef_method(CLASS_OF(rb_cUNDEF), "new");
65
57
  rb_const_set(rb_cObject, rb_intern("UNDEF"), CA_UNDEF);
66
-
67
- rb_define_method(rb_cObject, "undef?", rb_obj_is_undef, 0);
68
58
  }
69
59
 
data/ext/carray_utils.c CHANGED
@@ -3,10 +3,8 @@
3
3
  carray_utils.c
4
4
 
5
5
  This file is part of Ruby/CArray extension library.
6
- You can redistribute it and/or modify it under the terms of
7
- the Ruby Licence.
8
6
 
9
- Copyright (C) 2005 Hiroki Motoyoshi
7
+ Copyright (C) 2005-2020 Hiroki Motoyoshi
10
8
 
11
9
  ---------------------------------------------------------------------------- */
12
10
 
@@ -20,36 +18,10 @@
20
18
  #include "st.h"
21
19
  #endif
22
20
 
23
- #if RUBY_VERSION_CODE >= 240
24
- #define RSTRUCT_EMBED_LEN_MAX RSTRUCT_EMBED_LEN_MAX
25
- enum {
26
- RSTRUCT_EMBED_LEN_MAX = 3,
27
- RSTRUCT_ENUM_END
28
- };
29
- struct RStruct {
30
- struct RBasic basic;
31
- union {
32
- struct {
33
- long len;
34
- const VALUE *ptr;
35
- } heap;
36
- const VALUE ary[RSTRUCT_EMBED_LEN_MAX];
37
- } as;
38
- };
39
- #define RSTRUCT(obj) (R_CAST(RStruct)(obj))
40
- #endif
41
-
42
- #if RUBY_VERSION_CODE >= 190
43
- #define RANGE_BEG(r) (RSTRUCT(r)->as.ary[0])
44
- #define RANGE_END(r) (RSTRUCT(r)->as.ary[1])
45
- #define RANGE_EXCL(r) (RSTRUCT(r)->as.ary[2])
46
- #else
47
- static ID id_beg, id_end, id_excl;
48
- #define RANGE_BEG(r) (rb_ivar_get(r, id_beg))
49
- #define RANGE_END(r) (rb_ivar_get(r, id_end))
50
- #define RANGE_EXCL(r) (rb_ivar_get(r, id_excl))
51
- #endif
52
-
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))
53
25
 
54
26
  /* ------------------------------------------------------------------- */
55
27
 
@@ -165,7 +137,7 @@ void
165
137
  ca_parse_range (VALUE arg, ca_size_t size,
166
138
  ca_size_t *poffset, ca_size_t *pcount, ca_size_t *pstep)
167
139
  {
168
- ca_size_t first, start, last, count, step, bound, excl;
140
+ ca_size_t start, last, count, step, bound, excl;
169
141
 
170
142
  retry:
171
143
 
@@ -184,24 +156,59 @@ ca_parse_range (VALUE arg, ca_size_t size,
184
156
  }
185
157
  else if ( rb_obj_is_kind_of(arg, rb_cRange) ) {
186
158
  /* i..j */
187
- first = NUM2SIZE(RANGE_BEG(arg));
159
+ start = NUM2SIZE(RANGE_BEG(arg));
188
160
  last = NUM2SIZE(RANGE_END(arg));
189
161
  excl = RTEST(RANGE_EXCL(arg));
190
- CA_CHECK_INDEX(first, size);
162
+ CA_CHECK_INDEX(start, size);
191
163
  if ( last < 0 ) {
192
164
  last += size;
193
165
  }
194
166
  if ( excl ) {
195
- last += ( (last>=first) ? -1 : 1 );
167
+ last += ( (last>=start) ? -1 : 1 );
196
168
  }
197
169
  if ( last < 0 || last >= size ) {
198
170
  rb_raise(rb_eIndexError,
199
171
  "invalid index range");
200
172
  }
201
- *poffset = first;
202
- *pcount = llabs(last - first) + 1;
173
+ *poffset = start;
174
+ *pcount = llabs(last - start) + 1;
203
175
  *pstep = 1;
204
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
205
212
  else if ( TYPE(arg) == T_ARRAY ) {
206
213
  if ( RARRAY_LEN(arg) == 1 ) { /* [nil] or [i..j] or [i] */
207
214
  arg = rb_ary_entry(arg, 0);
@@ -254,6 +261,41 @@ ca_parse_range (VALUE arg, ca_size_t size,
254
261
  *pcount = count;
255
262
  *pstep = step;
256
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
257
299
  else { /* [i,n] */
258
300
  start = NUM2SIZE(arg0);
259
301
  count = NUM2SIZE(arg1);
@@ -292,7 +334,7 @@ void
292
334
  ca_parse_range_without_check (VALUE arg, ca_size_t size,
293
335
  ca_size_t *poffset, ca_size_t *pcount, ca_size_t *pstep)
294
336
  {
295
- ca_size_t first, start, last, count, step, bound, excl;
337
+ ca_size_t start, last, count, step, bound, excl;
296
338
 
297
339
  retry:
298
340
 
@@ -310,16 +352,35 @@ ca_parse_range_without_check (VALUE arg, ca_size_t size,
310
352
  }
311
353
  else if ( rb_obj_is_kind_of(arg, rb_cRange) ) {
312
354
  /* i..j */
313
- first = NUM2SIZE(RANGE_BEG(arg));
355
+ start = NUM2SIZE(RANGE_BEG(arg));
314
356
  last = NUM2SIZE(RANGE_END(arg));
315
357
  excl = RTEST(RANGE_EXCL(arg));
316
358
  if ( excl ) {
317
- last += ( (last>=first) ? -1 : 1 );
359
+ last += ( (last>=start) ? -1 : 1 );
318
360
  }
319
- *poffset = first;
320
- *pcount = last - first + 1;
361
+ *poffset = start;
362
+ *pcount = last - start + 1;
321
363
  *pstep = 1;
322
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
323
384
  else if ( TYPE(arg) == T_ARRAY ) {
324
385
  if ( RARRAY_LEN(arg) == 1 ) { /* [nil] or [i..j] or [i] */
325
386
  arg = rb_ary_entry(arg, 0);
@@ -351,6 +412,25 @@ ca_parse_range_without_check (VALUE arg, ca_size_t size,
351
412
  *pcount = count;
352
413
  *pstep = step;
353
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
354
434
  else { /* [i,n] */
355
435
  start = NUM2SIZE(arg0);
356
436
  count = NUM2SIZE(arg1);
@@ -422,6 +502,11 @@ ca_bounds_normalize_index (int8_t bounds, ca_size_t size0, ca_size_t k)
422
502
  }
423
503
  }
424
504
 
505
+ /* @private
506
+ @overload scan_float (str, fill_value=nil)
507
+
508
+ */
509
+
425
510
  static VALUE
426
511
  rb_ca_s_scan_float (int argc, VALUE *argv, VALUE self)
427
512
  {
@@ -447,6 +532,11 @@ rb_ca_s_scan_float (int argc, VALUE *argv, VALUE self)
447
532
  }
448
533
  }
449
534
 
535
+ /* @private
536
+ @overload scan_int (str, fill_value=nil)
537
+
538
+ */
539
+
450
540
  static VALUE
451
541
  rb_ca_s_scan_int (int argc, VALUE *argv, VALUE self)
452
542
  {
@@ -564,7 +654,7 @@ rb_ca_guess_type_and_bytes (VALUE rtype, VALUE rbytes,
564
654
  }
565
655
  }
566
656
 
567
- /* rdoc:
657
+ /* @private
568
658
  def CArray.guess_type_and_bytes (type, bytes=0)
569
659
  end
570
660
  */
@@ -742,12 +832,9 @@ rb_set_options (VALUE ropt, const char *spec_in, ...)
742
832
  void
743
833
  Init_carray_utils ()
744
834
  {
745
- #if RUBY_VERSION_CODE >= 190
746
- #else
747
- id_beg = rb_intern("begin");
748
- id_end = rb_intern("end");
749
- id_excl = rb_intern("excl");
750
- #endif
835
+ id_begin = rb_intern("begin");
836
+ id_end = rb_intern("end");
837
+ id_excl_end = rb_intern("exclude_end?");
751
838
 
752
839
  rb_define_singleton_method(rb_cCArray, "_scan_float",
753
840
  rb_ca_s_scan_float, -1);