carray 1.5.1 → 1.5.6

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.
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);