carray 2.0.0 → 3.0.0

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 (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
data/ext/carray_loop.c CHANGED
@@ -1,10 +1,12 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- carray_loop.c
3
+ Block-based iteration entry points: each / each_addr / each_index /
4
+ each_with_addr / each_with_index and their map! / collect! siblings.
5
+ Pure per-cell Ruby callback paths (= no kernel_iterator); used when
6
+ the caller wants Ruby block semantics over flat addresses or
7
+ multi-dim indices. Bound at the bottom by Init_carray_loop.
4
8
 
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
9
+ User-facing docs live in yard-stubs/carray_loop.rb.
8
10
 
9
11
  ---------------------------------------------------------------------------- */
10
12
 
@@ -41,141 +43,136 @@ rb_ca_s_each_index_internal (int ndim, VALUE *dim, uint8_t indim, VALUE ridx)
41
43
  return ret;
42
44
  }
43
45
 
44
- /* @overload each_index (*shape)
45
-
46
- (Iterator) Iterates with the multi-dimensional indeces for the given
47
- dimension numbers.
48
-
49
- CArray.each_index(3,2){|i,j| print "(#{i} #{j}) " }
50
- produces:
51
- (0 0) (0 1) (1 0) (1 1) (2 0) (2 1) (3 0) (3 1)
52
- */
53
-
46
+ /* CArray.each_index(*shape) -- class method. Walks the cartesian
47
+ product of `0...d` for each `d` in `shape` and yields the index
48
+ tuple via rb_yield_splat (= block receives |i, j, ...| individual
49
+ args). Independent of any CArray instance. */
54
50
  static VALUE
55
51
  rb_ca_s_each_index (int ndim, VALUE *dim, VALUE self)
56
52
  {
57
53
  volatile VALUE ridx = rb_ary_new2(ndim);
58
- #if RUBY_VERSION_CODE >= 190
59
54
  RETURN_ENUMERATOR(self, ndim, dim);
60
- #endif
61
55
  return rb_ca_s_each_index_internal(ndim, dim, 0, ridx);
62
56
  }
63
57
 
64
58
  /* ------------------------------------------------------------------- */
65
59
 
66
- /* @overload each () {|elem| ... }
67
-
68
- (Iterator) Iterates all the elements of the object.
69
-
70
- */
71
-
60
+ /* CArray#each {|elem| ... } -- yield each cell value in flat-address
61
+ order via rb_ca_fetch_addr (per-cell Ruby callback). */
72
62
  static VALUE
73
63
  rb_ca_each (VALUE self)
74
64
  {
75
65
  volatile VALUE ret = Qnil;
76
66
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
77
67
  ca_size_t i;
78
- #if RUBY_VERSION_CODE >= 190
79
68
  RETURN_ENUMERATOR(self, 0, 0);
80
- #endif
81
69
  for (i=0; i<elements; i++) {
82
70
  ret = rb_yield(rb_ca_fetch_addr(self, i));
83
71
  }
84
72
  return ret;
85
73
  }
86
74
 
87
- /* @overload each_with_addr () {|elem, addr| ... }
88
-
89
- (Iterator) Iterates all the elements of the object.
90
-
91
- */
92
-
75
+ /* CArray#each_with_addr {|elem, addr| ... } -- yield (value, flat
76
+ address) pairs in flat-address order. */
93
77
  static VALUE
94
78
  rb_ca_each_with_addr (VALUE self)
95
79
  {
96
80
  volatile VALUE ret = Qnil;
97
81
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
98
82
  ca_size_t i;
99
- #if RUBY_VERSION_CODE >= 190
100
83
  RETURN_ENUMERATOR(self, 0, 0);
101
- #endif
102
84
  for (i=0; i<elements; i++) {
103
85
  ret = rb_yield_values(2, rb_ca_fetch_addr(self, i), SIZE2NUM(i));
104
86
  }
105
87
  return ret;
106
88
  }
107
89
 
108
- /* @overload each_addr () {|addr| ... }
109
-
110
- (Iterator) Iterates all address of the object.
111
- */
112
-
90
+ /* CArray#each_addr {|addr| ... } -- yield each flat address
91
+ `0...self.elements` in order; does not fetch the value. */
113
92
  static VALUE
114
93
  rb_ca_each_addr (VALUE self)
115
94
  {
116
95
  volatile VALUE ret = Qnil;
117
96
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
118
97
  ca_size_t i;
119
- #if RUBY_VERSION_CODE >= 190
120
98
  RETURN_ENUMERATOR(self, 0, 0);
121
- #endif
122
99
  for (i=0; i<elements; i++) {
123
100
  ret = rb_yield(SIZE2NUM(i));
124
101
  }
125
102
  return ret;
126
103
  }
127
104
 
128
- static VALUE
129
- rb_ca_each_index_internal (VALUE self, int8_t level, VALUE ridx)
105
+ /* Unified recursive walk over all multi-dimensional indices. mode
106
+ selects the per-cell action, so each_index / each_with_index /
107
+ map_index! / map_with_index! share this single recursion:
108
+ CA_LOOP_WITH_VALUE -- yield the element value alongside the index
109
+ CA_LOOP_STORE -- store the block result back (map! family)
110
+ Construction-block sugar in rb_ca_initialize also reuses this walk
111
+ in CA_LOOP_STORE mode (= map_index! semantics).
112
+
113
+ Called by rb_ca_each_index / _each_with_index / _map_index_bang /
114
+ _map_with_index_bang here, and by rb_ca_initialize in
115
+ ext/ca_obj_array.c. */
116
+ VALUE
117
+ rb_ca_index_walk (VALUE self, CArray *ca, int8_t level,
118
+ ca_size_t *idx, VALUE ridx, int mode)
130
119
  {
131
120
  volatile VALUE ret = Qnil;
132
- CArray *ca;
133
121
  ca_size_t i;
134
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
135
122
  if ( level == ca->ndim - 1 ) {
136
123
  for (i=0; i<ca->dim[level]; i++) {
124
+ volatile VALUE obj;
125
+ idx[level] = i;
137
126
  rb_ary_store(ridx, level, SIZE2NUM(i));
138
- ret = rb_yield_splat(rb_obj_clone(ridx));
127
+ /* CAREFUL: the subscript is yielded as individual arguments
128
+ (rb_yield_values2), not as a single Array. This lets |i, j|
129
+ work uniformly in 1-D and N-D; the single-Array form forced
130
+ 1-D users to write |(i)| or |i,| and silently stored the
131
+ wrapping Array into integer cells when omitted. Block forms
132
+ that want the whole subscript should write |*idx|. */
133
+ if ( mode & CA_LOOP_WITH_VALUE ) {
134
+ int argc = (int)ca->ndim + 1;
135
+ VALUE *argv = ALLOCA_N(VALUE, argc);
136
+ argv[0] = rb_ca_fetch_index(self, idx);
137
+ MEMCPY(argv + 1, RARRAY_CONST_PTR(ridx), VALUE, ca->ndim);
138
+ obj = rb_yield_values2(argc, argv);
139
+ }
140
+ else {
141
+ obj = rb_yield_values2((int)ca->ndim, RARRAY_CONST_PTR(ridx));
142
+ }
143
+ if ( mode & CA_LOOP_STORE ) {
144
+ rb_ca_store_index(self, idx, obj);
145
+ }
146
+ ret = obj;
139
147
  }
140
148
  }
141
149
  else {
142
150
  for (i=0; i<ca->dim[level]; i++) {
151
+ idx[level] = i;
143
152
  rb_ary_store(ridx, level, SIZE2NUM(i));
144
- ret = rb_ca_each_index_internal(self, level+1, ridx);
153
+ ret = rb_ca_index_walk(self, ca, level+1, idx, ridx, mode);
145
154
  }
146
155
  }
147
156
  return ret;
148
157
  }
149
158
 
150
- /* @overload each_index () {|idx| ... }
151
-
152
- (Iterator) Iterates all index of the object.
153
-
154
- CArray.int(3,2).each_index(){|i,j| print "(#{i} #{j}) " }
155
-
156
- <em>produces:</em>
157
-
158
- (0 0) (0 1) (1 0) (1 1) (2 0) (2 1) (3 0) (3 1)
159
-
160
- */
161
-
159
+ /* CArray#each_index {|i, j, ...| ... } -- yield each multi-dim index
160
+ of self in row-major order via rb_ca_index_walk. */
162
161
  static VALUE
163
162
  rb_ca_each_index (VALUE self)
164
163
  {
164
+ CArray *ca;
165
+ ca_size_t idx[CA_RANK_MAX];
165
166
  volatile VALUE ridx;
166
- int8_t ndim = NUM2INT(rb_ca_ndim(self));
167
- ridx = rb_ary_new2(ndim);
168
- #if RUBY_VERSION_CODE >= 190
169
167
  RETURN_ENUMERATOR(self, 0, 0);
170
- #endif
171
- return rb_ca_each_index_internal(self, 0, ridx);
168
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
169
+ ridx = rb_ary_new2(ca->ndim);
170
+ return rb_ca_index_walk(self, ca, 0, idx, ridx, 0);
172
171
  }
173
172
 
174
- /* @overload map! () {|elem| ... }
175
-
176
- (Iterator, Destructive) Iterates all elements of the object and stores the return from the block to the element.
177
- */
178
-
173
+ /* CArray#map! {|elem| ... } -- yield each cell value, store the
174
+ block's return back at the same flat address. Mutates self;
175
+ attach / sync / detach around the loop for view-safety. */
179
176
  static VALUE
180
177
  rb_ca_map_bang (VALUE self)
181
178
  {
@@ -183,9 +180,7 @@ rb_ca_map_bang (VALUE self)
183
180
  CArray *ca;
184
181
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
185
182
  ca_size_t i;
186
- #if RUBY_VERSION_CODE >= 190
187
183
  RETURN_ENUMERATOR(self, 0, 0);
188
- #endif
189
184
  rb_ca_modify(self);
190
185
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
191
186
  ca_attach(ca);
@@ -198,164 +193,65 @@ rb_ca_map_bang (VALUE self)
198
193
  return self;
199
194
  }
200
195
 
201
- static VALUE
202
- rb_ca_each_with_index_internal (VALUE self,
203
- int8_t level, ca_size_t *idx, VALUE ridx)
204
- {
205
- volatile VALUE ret = Qnil;
206
- CArray *ca;
207
- ca_size_t i;
208
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
209
- if ( level == ca->ndim - 1 ) {
210
- for (i=0; i<ca->dim[level]; i++) {
211
- idx[level] = i;
212
- rb_ary_store(ridx, level, SIZE2NUM(i));
213
- ret = rb_yield_values(2, rb_ca_fetch_index(self, idx),
214
- rb_obj_clone(ridx));
215
- }
216
- }
217
- else {
218
- for (i=0; i<ca->dim[level]; i++) {
219
- idx[level] = i;
220
- rb_ary_store(ridx, level, SIZE2NUM(i));
221
- ret = rb_ca_each_with_index_internal(self, level+1, idx, ridx);
222
- }
223
- }
224
- return ret;
225
- }
226
-
227
- /* @overload each_with_index () {|elem, idx| ... }
228
-
229
- [TBD]
230
-
231
- */
232
-
196
+ /* CArray#each_with_index {|elem, i, j, ...| ... } -- yield each cell
197
+ value followed by its multi-dim index components (individual args;
198
+ see rb_ca_index_walk header). */
233
199
  static VALUE
234
200
  rb_ca_each_with_index (VALUE self)
235
201
  {
236
- volatile VALUE ridx, ret;
202
+ CArray *ca;
237
203
  ca_size_t idx[CA_RANK_MAX];
238
- int8_t ndim = NUM2INT(rb_ca_ndim(self));
239
- #if RUBY_VERSION_CODE >= 190
204
+ volatile VALUE ridx;
240
205
  RETURN_ENUMERATOR(self, 0, 0);
241
- #endif
242
- rb_ca_modify(self);
243
- ridx = rb_ary_new2(ndim);
244
- ret = rb_ca_each_with_index_internal(self, 0, idx, ridx);
245
- return ret;
246
- }
247
-
248
-
249
- static void
250
- rb_ca_map_with_index_bang_internal (VALUE self,
251
- int8_t level, ca_size_t *idx, VALUE ridx)
252
- {
253
- CArray *ca;
254
- ca_size_t i;
255
206
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
256
- if ( level == ca->ndim - 1 ) {
257
- volatile VALUE obj;
258
- for (i=0; i<ca->dim[level]; i++) {
259
- idx[level] = i;
260
- rb_ary_store(ridx, level, SIZE2NUM(i));
261
- obj = rb_yield_values(2, rb_ca_fetch_index(self, idx),
262
- rb_obj_clone(ridx));
263
- rb_ca_store_index(self, idx, obj);
264
- }
265
- }
266
- else {
267
- for (i=0; i<ca->dim[level]; i++) {
268
- idx[level] = i;
269
- rb_ary_store(ridx, level, SIZE2NUM(i));
270
- rb_ca_map_with_index_bang_internal(self, level+1, idx, ridx);
271
- }
272
- }
207
+ ridx = rb_ary_new2(ca->ndim);
208
+ return rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE);
273
209
  }
274
210
 
275
- /* @overload map_with_index () {|elem, idx| ... }
276
-
277
- [TBD]
278
-
279
- */
280
211
 
212
+ /* CArray#map_with_index! {|elem, i, j, ...| ... } -- yield each cell
213
+ value with its multi-dim index components, store the block's
214
+ return back. Mutates self. */
281
215
  static VALUE
282
216
  rb_ca_map_with_index_bang (VALUE self)
283
217
  {
284
- volatile VALUE ridx;
285
218
  CArray *ca;
286
219
  ca_size_t idx[CA_RANK_MAX];
287
- int8_t ndim = NUM2INT(rb_ca_ndim(self));
288
- #if RUBY_VERSION_CODE >= 190
220
+ volatile VALUE ridx;
289
221
  RETURN_ENUMERATOR(self, 0, 0);
290
- #endif
291
222
  rb_ca_modify(self);
292
223
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
293
224
  ca_attach(ca);
294
- ridx = rb_ary_new2(ndim);
295
- rb_ca_map_with_index_bang_internal(self, 0, idx, ridx);
225
+ ridx = rb_ary_new2(ca->ndim);
226
+ rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
296
227
  ca_sync(ca);
297
228
  ca_detach(ca);
298
229
  return self;
299
230
  }
300
231
 
301
232
 
302
- static void
303
- rb_ca_map_index_bang_internal (VALUE self,
304
- int8_t level, ca_size_t *idx, VALUE ridx)
305
- {
306
- CArray *ca;
307
- ca_size_t i;
308
- TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
309
- if ( level == ca->ndim - 1 ) {
310
- volatile VALUE obj;
311
- for (i=0; i<ca->dim[level]; i++) {
312
- idx[level] = i;
313
- rb_ary_store(ridx, level, SIZE2NUM(i));
314
- obj = rb_yield_splat(rb_obj_clone(ridx));
315
- rb_ca_store_index(self, idx, obj);
316
- }
317
- }
318
- else {
319
- for (i=0; i<ca->dim[level]; i++) {
320
- idx[level] = i;
321
- rb_ary_store(ridx, level, SIZE2NUM(i));
322
- rb_ca_map_index_bang_internal(self, level+1, idx, ridx);
323
- }
324
- }
325
- }
326
-
327
- /* @overload map_index! () {|idx| ... }
328
-
329
- [TBD]
330
-
331
- */
332
-
233
+ /* CArray#map_index! {|i, j, ...| ... } -- yield each multi-dim index
234
+ (no value), store the block's return back at that cell. Used by
235
+ the construction-block sugar in CArray.new (rb_ca_initialize). */
333
236
  static VALUE
334
237
  rb_ca_map_index_bang (VALUE self)
335
238
  {
336
- volatile VALUE ridx;
337
239
  CArray *ca;
338
240
  ca_size_t idx[CA_RANK_MAX];
339
- int8_t ndim = NUM2INT(rb_ca_ndim(self));
340
- #if RUBY_VERSION_CODE >= 190
241
+ volatile VALUE ridx;
341
242
  RETURN_ENUMERATOR(self, 0, 0);
342
- #endif
343
243
  rb_ca_modify(self);
344
244
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
345
245
  ca_attach(ca);
346
- ridx = rb_ary_new2(ndim);
347
- rb_ca_map_index_bang_internal(self, 0, idx, ridx);
246
+ ridx = rb_ary_new2(ca->ndim);
247
+ rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_STORE);
348
248
  ca_sync(ca);
349
249
  ca_detach(ca);
350
250
  return self;
351
251
  }
352
252
 
353
- /* @overload map_with_addr! () {|elem, addr| ... }
354
-
355
- [TBD]
356
-
357
- */
358
-
253
+ /* CArray#map_with_addr! {|elem, addr| ... } -- yield (value, flat
254
+ address), store the block's return at that address. */
359
255
  static VALUE
360
256
  rb_ca_map_with_addr_bang (VALUE self)
361
257
  {
@@ -363,9 +259,7 @@ rb_ca_map_with_addr_bang (VALUE self)
363
259
  CArray *ca;
364
260
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
365
261
  ca_size_t i;
366
- #if RUBY_VERSION_CODE >= 190
367
262
  RETURN_ENUMERATOR(self, 0, 0);
368
- #endif
369
263
  rb_ca_modify(self);
370
264
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
371
265
  ca_attach(ca);
@@ -379,12 +273,8 @@ rb_ca_map_with_addr_bang (VALUE self)
379
273
  }
380
274
 
381
275
 
382
- /* @overload map_addr! () {|addr| ... }
383
-
384
- [TBD]
385
-
386
- */
387
-
276
+ /* CArray#map_addr! {|addr| ... } -- yield each flat address (no
277
+ value), store the block's return at that address. */
388
278
  static VALUE
389
279
  rb_ca_map_addr_bang (VALUE self)
390
280
  {
@@ -392,9 +282,7 @@ rb_ca_map_addr_bang (VALUE self)
392
282
  CArray *ca;
393
283
  ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
394
284
  ca_size_t i;
395
- #if RUBY_VERSION_CODE >= 190
396
285
  RETURN_ENUMERATOR(self, 0, 0);
397
- #endif
398
286
  rb_ca_modify(self);
399
287
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
400
288
  ca_attach(ca);
@@ -409,7 +297,7 @@ rb_ca_map_addr_bang (VALUE self)
409
297
 
410
298
 
411
299
  void
412
- Init_carray_loop ()
300
+ Init_carray_loop (void)
413
301
  {
414
302
  rb_define_singleton_method(rb_cCArray, "each_index", rb_ca_s_each_index, -1);
415
303