carray 2.0.1 → 3.0.1

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  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 +1244 -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 +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -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 +239 -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 +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -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 +839 -0
  33. data/ext/ca_obj_binop.c +948 -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 +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -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 +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -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 +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  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 +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -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 +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
data/ext/ca_obj_repeat.c CHANGED
@@ -1,498 +1,101 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_repeat.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2025 Hiroki Motoyoshi
3
+ CARepeat: a CAStride view that broadcasts the parent over additional
4
+ axes by giving those axes stride 0 (so multiple output positions
5
+ alias the same parent cell). Pure CAStride typedef; the only extra
6
+ shape rule is the "repeat" vs "data" axis split documented at
7
+ ca_repeat_setup below. Read-only (writes through a stride-0 axis
8
+ are ambiguous).
8
9
 
9
10
  ---------------------------------------------------------------------------- */
10
11
 
11
12
  #include "carray.h"
13
+ #include "carray_internal.h" /* per-obj_type view constructors */
14
+ #include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
12
15
 
13
- const rb_data_type_t carepeat_data_type = {
14
- .parent = &cavirtual_data_type,
15
- .wrap_struct_name = "CARepeat",
16
- .function = {
17
- .dmark = ca_mark,
18
- .dfree = ca_free,
19
- .dsize = NULL,
20
- .dcompact = NULL
21
- },
22
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
23
- };
24
-
25
- const rb_data_type_t carepeat_mask_data_type = {
26
- .parent = &carepeat_data_type,
27
- .wrap_struct_name = "CARepeatMask",
28
- .function = {
29
- .dmark = NULL,
30
- .dfree = ca_free_nop,
31
- .dsize = NULL,
32
- .dcompact = NULL
33
- },
34
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
- };
16
+ extern ca_operation_function_t ca_stride_func;
36
17
 
37
18
  VALUE rb_cCARepeat;
38
19
  VALUE rb_cCARepeatMask;
39
20
 
40
- /* yard:
41
- class CARepeat < CAVirtual # :nodoc:
42
- end
43
- */
21
+ /* CARepeat builds a broadcasting view: for each output axis k,
22
+ count[k] > 0 => "repeat" axis; view dim[k] = count[k], stride = 0
23
+ count[k] == 0 => "data" axis; view dim[k] = parent->dim[j],
24
+ stride = parent_byte_stride[j],
25
+ where j is the running data-axis index.
26
+ The total number of data axes must equal parent->ndim.
44
27
 
28
+ The result is marked CA_FLAG_READ_ONLY: writing through a stride-0
29
+ axis is ambiguous, since several output positions alias the same
30
+ parent element. */
45
31
  int
46
- ca_repeat_setup (CARepeat *ca, CArray *parent, int8_t ndim, ca_size_t *count)
32
+ ca_repeat_setup (CAStride *ca, CArray *parent, int8_t ndim, ca_size_t *count)
47
33
  {
48
- int8_t data_type;
49
- ca_size_t elements, bytes, nrpt, repeat_level, repeat_num,
50
- contig_level, contig_num, data_ndim;
51
- int i, j;
52
-
53
- nrpt = 1;
54
- data_ndim = 0;
55
- for (i=0; i<ndim; i++) {
56
- if ( count[i] < 0 ) {
34
+ ca_size_t parent_byte_stride[CA_RANK_MAX];
35
+ ca_size_t newdim[CA_RANK_MAX];
36
+ ca_size_t strides[CA_RANK_MAX];
37
+ ca_size_t total_elements_d = (double) parent->elements;
38
+ ca_size_t nrpt = 1;
39
+ int8_t data_ndim = 0;
40
+ int8_t i, j;
41
+
42
+ for (i = 0; i < ndim; i++) {
43
+ if (count[i] < 0) {
57
44
  rb_raise(rb_eRuntimeError,
58
45
  "negative size for %i-th dimension specified", i);
59
46
  }
60
-
61
- if ( count[i] ) {
62
- nrpt *= count[i];
63
- }
64
- else {
65
- data_ndim += 1;
66
- }
67
- }
68
-
69
- repeat_level = 0;
70
- repeat_num = 1;
71
- for (i=0; i<ndim && count[i]; i++) {
72
- repeat_level = i+1;
73
- repeat_num *= count[i];
47
+ if (count[i]) nrpt *= count[i];
48
+ else data_ndim += 1;
74
49
  }
75
-
76
- contig_level = ndim-1;
77
- contig_num = 1;
78
- for (i=ndim-1; i >= 0 && count[i]; i--) {
79
- contig_level = i;
80
- contig_num *= count[i];
81
- }
82
-
83
- if ( data_ndim != parent->ndim ) {
50
+ if (data_ndim != parent->ndim) {
84
51
  rb_raise(rb_eRuntimeError,
85
52
  "mismatch in ndim between original array and determined by # of dummies");
86
53
  }
87
-
88
- if ( ((double) parent->elements) * nrpt > CA_LENGTH_MAX ) {
54
+ if (((double) parent->elements) * nrpt > CA_LENGTH_MAX) {
89
55
  rb_raise(rb_eRuntimeError, "too large byte length");
90
56
  }
91
-
92
- data_type = parent->data_type;
93
- elements = parent->elements * nrpt;
94
- bytes = parent->bytes;
95
-
96
- ca->obj_type = CA_OBJ_REPEAT;
97
- ca->data_type = data_type;
98
- ca->flags = 0;
99
- ca->ndim = ndim;
100
- ca->bytes = bytes;
101
- ca->elements = elements;
102
- ca->ptr = NULL;
103
- ca->mask = NULL;
104
- ca->dim = ALLOC_N(ca_size_t, ndim);
105
-
106
- ca->parent = parent;
107
- ca->attach = 0;
108
- ca->nosync = 0;
109
- ca->count = ALLOC_N(ca_size_t, ndim);
110
- ca->repeat_level = repeat_level;
111
- ca->repeat_num = repeat_num;
112
- ca->contig_level = contig_level;
113
- ca->contig_num = contig_num;
57
+ (void) total_elements_d;
58
+
59
+ /* parent_byte_stride[k] = bytes * Π_{i>k} parent->dim[i] */
60
+ {
61
+ ca_size_t s = parent->bytes;
62
+ for (i = parent->ndim - 1; i >= 0; i--) {
63
+ parent_byte_stride[i] = s;
64
+ s *= parent->dim[i];
65
+ }
66
+ }
114
67
 
115
68
  j = 0;
116
- for (i=0; i<ndim; i++) {
117
- if ( count[i] ) {
118
- ca->dim[i] = count[i];
119
- }
120
- else {
121
- ca->dim[i] = parent->dim[j++];
69
+ for (i = 0; i < ndim; i++) {
70
+ if (count[i] > 0) {
71
+ newdim[i] = count[i];
72
+ strides[i] = 0;
73
+ } else {
74
+ newdim[i] = parent->dim[j];
75
+ strides[i] = parent_byte_stride[j];
76
+ j++;
122
77
  }
123
78
  }
124
79
 
125
- memcpy(ca->count, count, ndim * sizeof(ca_size_t));
80
+ ca_stride_setup(ca, CA_OBJ_REPEAT, parent,
81
+ parent->data_type, parent->bytes,
82
+ ndim, newdim, strides, 0);
126
83
 
127
84
  ca_set_flag(ca, CA_FLAG_READ_ONLY);
128
-
129
- if ( ca_has_mask(parent) ) {
130
- ca_create_mask(ca);
85
+ if (ca->mask) {
86
+ ca_set_flag(ca->mask, CA_FLAG_READ_ONLY);
131
87
  }
132
-
133
88
  return 0;
134
89
  }
135
90
 
136
-
137
- CARepeat *
91
+ CAStride *
138
92
  ca_repeat_new (CArray *parent, int8_t ndim, ca_size_t *count)
139
93
  {
140
- CARepeat *ca = ALLOC(CARepeat);
94
+ CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_REPEAT, ndim);
141
95
  ca_repeat_setup(ca, parent, ndim, count);
142
96
  return ca;
143
97
  }
144
98
 
145
- static void
146
- free_ca_repeat (void *ap)
147
- {
148
- CARepeat *ca = (CARepeat *) ap;
149
- if ( ca != NULL ) {
150
- xfree(ca->count);
151
- ca_free(ca->mask);
152
- xfree(ca->dim);
153
- xfree(ca);
154
- }
155
- }
156
-
157
- static void ca_repeat_attach (CARepeat *cb);
158
- static void ca_repeat_sync (CARepeat *cb);
159
- static void ca_repeat_fill (CARepeat *ca, char *ptr);
160
-
161
- /* ------------------------------------------------------------------- */
162
-
163
- static void *
164
- ca_repeat_func_clone (void *ap)
165
- {
166
- CARepeat *ca = (CARepeat *) ap;
167
- return ca_repeat_new(ca->parent, ca->ndim, ca->count);
168
- }
169
-
170
- static char *
171
- ca_repeat_func_ptr_at_addr (void *ap, ca_size_t addr)
172
- {
173
- CARepeat *ca = (CARepeat *) ap;
174
- if ( ca->ptr ) {
175
- return ca->ptr + ca->bytes * addr;
176
- }
177
- else {
178
- ca_size_t idx[CA_RANK_MAX];
179
- ca_addr2index((CArray *)ca, addr, idx);
180
- return ca_ptr_at_index(ca, idx);
181
- }
182
- }
183
-
184
- static char *
185
- ca_repeat_func_ptr_at_index (void *ap, ca_size_t *idx)
186
- {
187
- CARepeat *ca = (CARepeat *) ap;
188
- if ( ca->ptr ) {
189
- return ca_array_func_ptr_at_index(ca, idx);
190
- }
191
- else {
192
- ca_size_t *count = ca->count;
193
- ca_size_t *dim0 = ca->parent->dim;
194
- int8_t i;
195
- ca_size_t n, j;
196
-
197
- j = 0;
198
- n = 0;
199
- for (i=0; i<ca->ndim; i++) {
200
- if ( ! count[i] ) {
201
- n = dim0[j]*n + idx[i];
202
- j++;
203
- }
204
- }
205
-
206
- if ( ca->parent->ptr ) {
207
- return ca->parent->ptr + ca->bytes * n;
208
- }
209
- else {
210
- return ca_ptr_at_addr(ca->parent, n);
211
- }
212
- }
213
- }
214
-
215
- static void
216
- ca_repeat_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
217
- {
218
- CARepeat *ca = (CARepeat *) ap;
219
- ca_size_t *count = ca->count;
220
- ca_size_t idx0[CA_RANK_MAX];
221
- int8_t i;
222
- ca_size_t j;
223
- j = 0;
224
- for (i=0; i<ca->ndim; i++) {
225
- if ( ! count[i] ) {
226
- idx0[j++] = idx[i];
227
- }
228
- }
229
- ca_fetch_index(ca->parent, idx0, ptr);
230
- }
231
-
232
- static void
233
- ca_repeat_func_store_index (void *ap, ca_size_t *idx, void *ptr)
234
- {
235
- CARepeat *ca = (CARepeat *) ap;
236
- ca_size_t *count = ca->count;
237
- ca_size_t idx0[CA_RANK_MAX];
238
- int8_t i;
239
- ca_size_t j;
240
- j = 0;
241
- for (i=0; i<ca->ndim; i++) {
242
- if ( ! count[i] ) {
243
- idx0[j++] = idx[i];
244
- }
245
- }
246
- ca_store_index(ca->parent, idx0, ptr);
247
- }
248
-
249
- static void
250
- ca_repeat_func_allocate (void *ap)
251
- {
252
- CARepeat *ca = (CARepeat *) ap;
253
- ca_attach(ca->parent);
254
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
255
- ca->ptr = malloc_with_check(ca_length(ca));
256
- }
257
-
258
- static void
259
- ca_repeat_func_attach (void *ap)
260
- {
261
- CARepeat *ca = (CARepeat *) ap;
262
- ca_attach(ca->parent);
263
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
264
- ca->ptr = malloc_with_check(ca_length(ca));
265
- ca_repeat_attach(ca);
266
- }
267
-
268
- static void
269
- ca_repeat_func_sync (void *ap)
270
- {
271
- CARepeat *ca = (CARepeat *) ap;
272
- ca_repeat_sync(ca);
273
- ca_sync(ca->parent);
274
- }
275
-
276
- static void
277
- ca_repeat_func_detach (void *ap)
278
- {
279
- CARepeat *ca = (CARepeat *) ap;
280
- free(ca->ptr);
281
- ca->ptr = NULL;
282
- ca_detach(ca->parent);
283
- }
284
-
285
- static void
286
- ca_repeat_func_copy_data (void *ap, void *ptr)
287
- {
288
- CARepeat *ca = (CARepeat *) ap;
289
- char *ptr0 = ca->ptr;
290
- ca_attach(ca->parent);
291
- ca->ptr = ptr;
292
- ca_repeat_attach(ca);
293
- ca->ptr = ptr0;
294
- ca_detach(ca->parent);
295
- }
296
-
297
- static void
298
- ca_repeat_func_sync_data (void *ap, void *ptr)
299
- {
300
- CARepeat *ca = (CARepeat *) ap;
301
- char *ptr0 = ca->ptr;
302
- ca_attach(ca->parent);
303
- ca->ptr = ptr;
304
- ca_repeat_sync(ca);
305
- ca->ptr = ptr0;
306
- ca_sync(ca->parent);
307
- ca_detach(ca->parent);
308
- }
309
-
310
- static void
311
- ca_repeat_func_fill_data (void *ap, void *ptr)
312
- {
313
- CARepeat *ca = (CARepeat *) ap;
314
- ca_attach(ca->parent);
315
- ca_repeat_fill(ca, ptr);
316
- ca_sync(ca->parent);
317
- ca_detach(ca->parent);
318
- }
319
-
320
- static void
321
- ca_repeat_func_create_mask (void *ap)
322
- {
323
- CARepeat *ca = (CARepeat *) ap;
324
- ca_update_mask(ca->parent);
325
- if ( ! ca->parent->mask ) {
326
- ca_create_mask(ca->parent);
327
- }
328
- ca->mask =
329
- (CArray *) ca_repeat_new(ca->parent->mask, ca->ndim, ca->count);
330
- }
331
-
332
- ca_operation_function_t ca_repeat_func = {
333
- -1, /* CA_OBJ_REPEAT */
334
- CA_VIRTUAL_ARRAY,
335
- free_ca_repeat,
336
- ca_repeat_func_clone,
337
- ca_repeat_func_ptr_at_addr,
338
- ca_repeat_func_ptr_at_index,
339
- NULL,
340
- ca_repeat_func_fetch_index,
341
- NULL,
342
- ca_repeat_func_store_index,
343
- ca_repeat_func_allocate,
344
- ca_repeat_func_attach,
345
- ca_repeat_func_sync,
346
- ca_repeat_func_detach,
347
- ca_repeat_func_copy_data,
348
- ca_repeat_func_sync_data,
349
- ca_repeat_func_fill_data,
350
- ca_repeat_func_create_mask,
351
- };
352
-
353
- /* ------------------------------------------------------------------- */
354
-
355
- static void
356
- memfill (void *dp, void *sp, ca_size_t bytes, ca_size_t n)
357
- {
358
- switch ( bytes ) {
359
- case 1:
360
- memset(dp, *(uint8_t*)sp, n);
361
- break;
362
- case 2: {
363
- int16_t *p = (int16_t *) dp, *q = (int16_t *) sp;
364
- while (n--) { *p++ = *q; }
365
- break;
366
- }
367
- case 4: {
368
- int32_t *p = (int32_t *) dp, *q = (int32_t *) sp;
369
- while (n--) { *p++ = *q; }
370
- break;
371
- }
372
- case 8: {
373
- float64_t *p = (float64_t *) dp, *q = (float64_t *) sp;
374
- while (n--) { *p++ = *q; }
375
- break;
376
- }
377
- default: {
378
- ca_size_t i;
379
- char *p = (char *) dp, *q = (char *) sp;
380
- for (i=0; i<n; i++) {
381
- memcpy(p, q, bytes);
382
- p+=bytes;
383
- }
384
- }
385
- }
386
- }
387
-
388
- static void
389
- ca_repeat_attach_loop1 (CARepeat *ca, int8_t level, int8_t level0,
390
- ca_size_t *idx, ca_size_t *idx0)
391
- {
392
- ca_size_t *count = ca->count;
393
- ca_size_t i;
394
-
395
- if ( level == ca->contig_level ) {
396
- if ( ca->contig_num == 1 ) {
397
- for (i=0; i<ca->dim[level]; i++) {
398
- idx[level] = i;
399
- idx0[level0] = i;
400
- memcpy(ca_ptr_at_index(ca, idx),
401
- ca_ptr_at_index(ca->parent, idx0),
402
- ca->bytes);
403
- }
404
- }
405
- else {
406
- char *dp, *sp;
407
- dp = ca_ptr_at_index(ca, idx);
408
- sp = ca_ptr_at_index(ca->parent, idx0);
409
- memfill(dp, sp, ca->bytes, ca->contig_num);
410
- }
411
- }
412
- else {
413
- for (i=0; i<ca->dim[level]; i++) {
414
- idx[level] = i;
415
- if ( ! count[level] ) {
416
- idx0[level0] = i;
417
- ca_repeat_attach_loop1(ca, level+1, level0+1, idx, idx0);
418
- }
419
- else {
420
- ca_repeat_attach_loop1(ca, level+1, level0, idx, idx0);
421
- }
422
- }
423
- }
424
- }
425
-
426
- static void
427
- ca_repeat_attach (CARepeat *ca)
428
- {
429
- ca_size_t idx[CA_RANK_MAX];
430
- ca_size_t idx0[CA_RANK_MAX];
431
- ca_size_t i;
432
- char *dp, *sp;
433
-
434
- for (i=0; i<ca->ndim; i++) {
435
- idx[i] = 0;
436
- idx0[i] = 0;
437
- }
438
- ca_repeat_attach_loop1(ca, ca->repeat_level, 0, idx, idx0);
439
-
440
- sp = ca_ptr_at_addr(ca, 0);
441
- for (i=1; i<ca->repeat_num; i++) {
442
- dp = sp + i * ca->bytes * (ca->elements / ca->repeat_num);
443
- memcpy(dp, sp, ca->bytes * (ca->elements / ca->repeat_num));
444
- }
445
- }
446
-
447
- static void
448
- ca_repeat_sync_loop (CARepeat *ca, int8_t level, int8_t level0,
449
- ca_size_t *idx, ca_size_t *idx0)
450
- {
451
- ca_size_t *count = ca->count;
452
- ca_size_t i;
453
-
454
- if ( level == ca->contig_level ) {
455
- if ( ca->contig_num == 1 ) {
456
- memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx),
457
- ca_length(ca->parent));
458
- }
459
- else {
460
- memcpy(ca_ptr_at_index(ca->parent, idx0), ca_ptr_at_index(ca, idx), ca->bytes);
461
- }
462
- }
463
- else {
464
- for (i=0; i<ca->dim[level]; i++) {
465
- idx[level] = i;
466
- if ( ! count[level] ) {
467
- idx0[level0] = i;
468
- ca_repeat_sync_loop(ca, level+1, level0+1, idx, idx0);
469
- }
470
- else {
471
- ca_repeat_sync_loop(ca, level+1, level0, idx, idx0);
472
- }
473
- }
474
- }
475
- }
476
-
477
- static void
478
- ca_repeat_sync (CARepeat *ca)
479
- {
480
- ca_size_t idx[CA_RANK_MAX];
481
- ca_size_t idx0[CA_RANK_MAX];
482
- int8_t i;
483
- for (i=0; i<ca->ndim; i++) {
484
- idx[i] = 0;
485
- idx0[i] = 0;
486
- }
487
- ca_repeat_sync_loop(ca, ca->repeat_level, 0, idx, idx0);
488
- }
489
-
490
- static void
491
- ca_repeat_fill (CARepeat *ca, char *ptr)
492
- {
493
- ca_fill(ca->parent, ptr);
494
- }
495
-
496
99
  /* ------------------------------------------------------------------- */
497
100
 
498
101
  VALUE
@@ -500,16 +103,31 @@ rb_ca_repeat_new (VALUE cary, int8_t ndim, ca_size_t *count)
500
103
  {
501
104
  volatile VALUE obj;
502
105
  CArray *parent;
503
- CARepeat *ca;
106
+ CAStride *ca;
504
107
  rb_check_carray_object(cary);
505
108
  TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
506
109
  ca = ca_repeat_new(parent, ndim, count);
507
110
  obj = ca_wrap_struct(ca);
508
111
  rb_ca_set_parent(obj, cary);
509
- rb_ca_data_type_inherit(obj, cary);
510
112
  return obj;
511
113
  }
512
114
 
115
+ /* rb_ca_repeat -- build a broadcasting view of self. Each argv[k]
116
+ is either an Integer (= repeat count for that output axis, gets
117
+ stride 0) or the symbol :% (= "data axis", pulls the next
118
+ parent->dim[j] / parent_byte_stride[j] in order). The number of
119
+ :% positions must equal parent->ndim.
120
+
121
+ Two-arg shorthand `repeat(:%, template)` or `repeat(template, :%)`
122
+ matches the receiver's non-singleton axes to `template.shape` and
123
+ fills the rest with explicit repeat counts; used by broadcast
124
+ helpers.
125
+
126
+ Single-call no-op (= repeat == 1, every count is 0 or 1) returns a
127
+ CARefer reshape instead of a CARepeat, keeping the chain flat.
128
+
129
+ Called by carray_access.c indexer dispatch when the index includes
130
+ the :% symbol (e.g. `a[:%, nil, :%, 3]`). */
513
131
  VALUE
514
132
  rb_ca_repeat (int argc, VALUE *argv, VALUE self)
515
133
  {
@@ -521,10 +139,10 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
521
139
 
522
140
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
523
141
 
524
- if ( argc == 2 &&
142
+ if ( argc == 2 &&
525
143
  (
526
144
  ( argv[0] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[1]) ) ||
527
- ( argv[1] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[0]) )
145
+ ( argv[1] == ID2SYM(rb_intern("%")) && rb_obj_is_carray(argv[0]) )
528
146
  ) ) {
529
147
  volatile VALUE args;
530
148
  CArray *ct;
@@ -587,7 +205,7 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
587
205
  self = rb_ca_refer_new(self, ca->data_type, ndim, dim, ca->bytes, 0);
588
206
  }
589
207
  }
590
- return rb_ca_repeat((int)RARRAY_LEN(args), RARRAY_PTR(args), self);
208
+ return rb_ca_repeat((int)RARRAY_LEN(args), (VALUE *)RARRAY_CONST_PTR(args), self);
591
209
  }
592
210
 
593
211
  repeat = 1;
@@ -628,37 +246,34 @@ rb_ca_repeat (int argc, VALUE *argv, VALUE self)
628
246
  obj = rb_ca_repeat_new(self, argc, count);
629
247
  }
630
248
 
249
+ CA_FACE_LIFT_IF_FACE(obj, self, ca);
631
250
  return obj;
632
251
  }
633
252
 
634
- static VALUE
635
- rb_ca_repeat_s_allocate (VALUE klass)
636
- {
637
- CARepeat *ca;
638
- return TypedData_Make_Struct(klass, CARepeat, &carepeat_data_type, ca);
639
- }
640
-
641
253
  static VALUE
642
254
  rb_ca_repeat_initialize_copy (VALUE self, VALUE other)
643
255
  {
644
- CARepeat *ca, *cs;
645
-
646
- TypedData_Get_Struct(self, CARepeat, &carepeat_data_type, ca);
647
- TypedData_Get_Struct(other, CARepeat, &carepeat_data_type, cs);
648
-
649
- ca_repeat_setup(ca, cs->parent, cs->ndim, cs->count);
650
-
256
+ CAStride *ca, *cs;
257
+ TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
258
+ TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
259
+ if ( ca_func[CA_OBJ_REPEAT].pool_init ) {
260
+ ca_array_pool_alloc(ca, CA_OBJ_REPEAT, cs->ndim);
261
+ }
262
+ ca_stride_setup(ca, CA_OBJ_REPEAT, cs->parent,
263
+ cs->data_type, cs->bytes,
264
+ cs->ndim, cs->dim, cs->strides, cs->base_offset);
265
+ ca_set_flag(ca, CA_FLAG_READ_ONLY);
266
+ if (ca->mask) ca_set_flag(ca->mask, CA_FLAG_READ_ONLY);
651
267
  return self;
652
268
  }
653
269
 
654
270
  void
655
- Init_ca_obj_repeat ()
271
+ Init_ca_obj_repeat (void)
656
272
  {
657
- /* rb_cCARepeat, CA_OBJ_REPEAT are defined in rb_carray.c */
273
+ /* rb_cCARepeat, CA_OBJ_REPEAT are defined in ruby_carray.c / carray_core.c */
658
274
 
659
275
  rb_define_const(rb_cObject, "CA_OBJ_REPEAT", INT2NUM(CA_OBJ_REPEAT));
660
276
 
661
- rb_define_alloc_func(rb_cCARepeat, rb_ca_repeat_s_allocate);
662
277
  rb_define_method(rb_cCARepeat, "initialize_copy",
663
278
  rb_ca_repeat_initialize_copy, 1);
664
279
  }