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_field.c CHANGED
@@ -1,523 +1,77 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_field.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CAField: a CAStride view that exposes one field of a fixlen-record
4
+ parent as an array of that field's type. Pure typedef of CAStride
5
+ (no extra state); shape matches the parent, with:
6
+ - base_offset = field offset in bytes within one record
7
+ - strides[k] = parent->bytes * Π_{i>k} parent->dim[i]
8
+ (row-major stride scaled by record size)
9
+ - data_type = field's element type (independent of parent's)
10
+ - bytes = field's element size
8
11
 
9
12
  ---------------------------------------------------------------------------- */
10
13
 
11
14
  #include "carray.h"
15
+ #include "carray_internal.h" /* per-obj_type view constructors */
16
+
17
+ extern ca_operation_function_t ca_stride_func;
12
18
 
13
- typedef struct {
14
- int16_t obj_type;
15
- int8_t data_type;
16
- int8_t ndim;
17
- int32_t flags;
18
- ca_size_t bytes;
19
- ca_size_t elements;
20
- ca_size_t *dim;
21
- char *ptr;
22
- CArray *mask;
23
- CArray *parent;
24
- uint32_t attach;
25
- uint8_t nosync;
26
- /* -------------*/
27
- ca_size_t offset;
28
- } CAField;
29
-
30
-
31
- const rb_data_type_t cafield_data_type = {
32
- .parent = &cavirtual_data_type,
33
- .wrap_struct_name = "CAField",
34
- .function = {
35
- .dmark = ca_mark,
36
- .dfree = ca_free,
37
- .dsize = NULL,
38
- .dcompact = NULL
39
- },
40
- .flags = RUBY_TYPED_FREE_IMMEDIATELY
41
- };
42
-
43
- static int8_t CA_OBJ_FIELD;
44
-
45
- static VALUE rb_cCAField;
46
-
47
- /* yard:
48
- class CAField < CAVirtual # :nodoc:
49
- end
50
- */
19
+ int8_t CA_OBJ_FIELD;
20
+ VALUE rb_cCAField;
21
+ VALUE rb_cCAFieldMask;
51
22
 
52
23
  /* ------------------------------------------------------------------- */
53
24
 
25
+ /* Build row-major byte-strides over the parent's record layout and
26
+ delegate to ca_stride_setup. `offset` becomes the CAStride
27
+ base_offset (in bytes). */
54
28
  int
55
- ca_field_setup (CAField *ca, CArray *parent,
29
+ ca_field_setup (CAStride *ca, CArray *parent,
56
30
  ca_size_t offset, int8_t data_type, ca_size_t bytes)
57
31
  {
58
- int8_t ndim;
59
- ca_size_t elements;
60
-
61
- /* check arguments */
32
+ ca_size_t strides[CA_RANK_MAX];
33
+ int8_t i;
62
34
 
63
35
  CA_CHECK_DATA_TYPE(data_type);
64
36
  CA_CHECK_BYTES(data_type, bytes);
37
+
65
38
  if ( offset < 0 ) {
66
39
  rb_raise(rb_eRuntimeError, "negative offset");
67
40
  }
68
-
69
41
  if ( data_type == CA_OBJECT ) {
70
42
  rb_raise(rb_eCADataTypeError,
71
- "CA_OBJECT can not to be a data_type for CAField");
43
+ "CA_OBJECT can not to be a data_type for CAField");
72
44
  }
73
-
74
45
  if ( parent->bytes < offset + bytes ) {
75
46
  rb_raise(rb_eRuntimeError, "offset or bytes out of range");
76
47
  }
77
48
 
78
- ndim = parent->ndim;
79
- elements = parent->elements;
80
-
81
- ca->obj_type = CA_OBJ_FIELD;
82
- ca->data_type = data_type;
83
- ca->flags = 0;
84
- ca->ndim = ndim;
85
- ca->bytes = bytes;
86
- ca->elements = elements;
87
- ca->ptr = NULL;
88
- ca->mask = NULL;
89
- ca->dim = ALLOC_N(ca_size_t, ndim);
90
-
91
- ca->parent = parent;
92
- ca->attach = 0;
93
- ca->nosync = 0;
94
- ca->offset = offset;
95
-
96
- memcpy(ca->dim, parent->dim, ndim * sizeof(ca_size_t));
97
-
98
- if ( ca_has_mask(parent) ) {
99
- ca_create_mask(ca);
49
+ /* strides[k] = parent->bytes × Π_{i>k} parent->dim[i]. Same shape
50
+ as parent because each output element corresponds 1:1 to a
51
+ parent record. */
52
+ {
53
+ ca_size_t s = parent->bytes;
54
+ for (i = parent->ndim - 1; i >= 0; i--) {
55
+ strides[i] = s;
56
+ s *= parent->dim[i];
57
+ }
100
58
  }
101
59
 
102
- if ( ca_is_scalar(parent) ) {
103
- ca_set_flag(ca, CA_FLAG_SCALAR);
104
- }
60
+ ca_stride_setup(ca, CA_OBJ_FIELD, parent,
61
+ data_type, bytes,
62
+ parent->ndim, parent->dim, strides, offset);
105
63
 
106
64
  return 0;
107
65
  }
108
66
 
109
- CAField *
67
+ CAStride *
110
68
  ca_field_new (CArray *parent, ca_size_t offset, int8_t data_type, ca_size_t bytes)
111
69
  {
112
- CAField *ca = ALLOC(CAField);
70
+ CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_FIELD, parent->ndim);
113
71
  ca_field_setup(ca, parent, offset, data_type, bytes);
114
72
  return ca;
115
73
  }
116
74
 
117
- static void
118
- free_ca_field (void *ap)
119
- {
120
- CAField *ca = (CAField *) ap;
121
- if ( ca != NULL ) {
122
- ca_free(ca->mask);
123
- xfree(ca->dim);
124
- xfree(ca);
125
- }
126
- }
127
-
128
- static void ca_field_attach (CAField *ca);
129
- static void ca_field_sync (CAField *ca);
130
- static void ca_field_fill (CAField *ca, char *ptr);
131
-
132
- /* ------------------------------------------------------------------- */
133
-
134
- static void *
135
- ca_field_func_clone (void *ap)
136
- {
137
- CAField *ca = (CAField *) ap;
138
- return ca_field_new(ca->parent, ca->offset, ca->data_type, ca->bytes);
139
- }
140
-
141
- static char *
142
- ca_field_func_ptr_at_addr (void *ap, ca_size_t addr)
143
- {
144
- CAField *ca = (CAField *) ap;
145
- if ( ! ca->ptr ) {
146
- ca_size_t idx[CA_RANK_MAX];
147
- ca_addr2index((CArray *)ca, addr, idx);
148
- return ca_ptr_at_index(ca, idx);
149
- }
150
- else {
151
- return ca->ptr + ca->bytes * addr;
152
- }
153
- }
154
-
155
- static char *
156
- ca_field_func_ptr_at_index (void *ap, ca_size_t *idx)
157
- {
158
- CAField *ca = (CAField *) ap;
159
- if ( ! ca->ptr ) {
160
- ca_size_t *dim = ca->dim;
161
- int8_t i;
162
- ca_size_t n;
163
- n = idx[0]; /* n = idx[0]*dim[1]*dim[2]*...*dim[ndim-1] */
164
- for (i=1; i<ca->ndim; i++) { /* + idx[1]*dim[1]*dim[2]*...*dim[ndim-1] */
165
- n = dim[i]*n+idx[i]; /* ... + idx[ndim-2]*dim[1] + idx[ndim-1] */
166
- }
167
-
168
- if ( ca->parent->ptr == NULL ) {
169
- return (void *)((char *) ca_ptr_at_addr(ca->parent, n) + ca->offset);
170
- }
171
- else {
172
- return ca->parent->ptr + ca->parent->bytes * n + ca->offset;
173
- }
174
- }
175
- else {
176
- return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
177
- }
178
- }
179
-
180
- static void
181
- ca_field_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
182
- {
183
- CAField *ca = (CAField *) ap;
184
- if ( ca->parent->bytes <= 32 ) {
185
- char v[32];
186
- ca_fetch_index(ca->parent, idx, v);
187
- memcpy(ptr, v + ca->offset, ca->bytes);
188
- }
189
- else {
190
- char *v = malloc_with_check(ca->parent->bytes);
191
- ca_fetch_index(ca->parent, idx, v);
192
- memcpy(ptr, v + ca->offset, ca->bytes);
193
- free(v);
194
- }
195
- }
196
-
197
- static void
198
- ca_field_func_store_index (void *ap, ca_size_t *idx, void *ptr)
199
- {
200
- CAField *ca = (CAField *) ap;
201
- if ( ca->parent->bytes <= 32 ) {
202
- char v[32];
203
- ca_fetch_index(ca->parent, idx, v);
204
- memcpy(v + ca->offset, ptr, ca->bytes);
205
- ca_store_index(ca->parent, idx, v);
206
- }
207
- else {
208
- char *v = malloc_with_check(ca->parent->bytes);
209
- ca_fetch_index(ca->parent, idx, v);
210
- memcpy(v + ca->offset, ptr, ca->bytes);
211
- ca_store_index(ca->parent, idx, v);
212
- free(v);
213
- }
214
- }
215
-
216
- static void
217
- ca_field_func_allocate (void *ap)
218
- {
219
- CAField *ca = (CAField *) ap;
220
- ca_attach(ca->parent);
221
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
222
- ca->ptr = malloc_with_check(ca_length(ca));
223
- }
224
-
225
- static void
226
- ca_field_func_attach (void *ap)
227
- {
228
- void ca_field_attach (CAField *cb);
229
-
230
- CAField *ca = (CAField *) ap;
231
- ca_attach(ca->parent);
232
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
233
- ca->ptr = malloc_with_check(ca_length(ca));
234
- ca_field_attach(ca);
235
- }
236
-
237
- static void
238
- ca_field_func_sync (void *ap)
239
- {
240
- CAField *ca = (CAField *) ap;
241
- ca_field_sync(ca);
242
- ca_sync(ca->parent);
243
- }
244
-
245
- static void
246
- ca_field_func_detach (void *ap)
247
- {
248
- CAField *ca = (CAField *) ap;
249
- free(ca->ptr);
250
- ca->ptr = NULL;
251
- ca_detach(ca->parent);
252
- }
253
-
254
- static void
255
- ca_field_func_copy_data (void *ap, void *ptr)
256
- {
257
- CAField *ca = (CAField *) ap;
258
- char *ptr0 = ca->ptr;
259
- ca_attach(ca->parent);
260
- ca->ptr = ptr;
261
- ca_field_attach(ca);
262
- ca->ptr = ptr0;
263
- ca_detach(ca->parent);
264
- }
265
-
266
- static void
267
- ca_field_func_sync_data (void *ap, void *ptr)
268
- {
269
- CAField *ca = (CAField *) ap;
270
- char *ptr0 = ca->ptr;
271
- ca_attach(ca->parent);
272
- ca->ptr = ptr;
273
- ca_field_sync(ca);
274
- ca->ptr = ptr0;
275
- ca_sync(ca->parent);
276
- ca_detach(ca->parent);
277
- }
278
-
279
- static void
280
- ca_field_func_fill_data (void *ap, void *ptr)
281
- {
282
- CAField *ca = (CAField *) ap;
283
- ca_attach(ca->parent);
284
- ca_field_fill(ca, ptr);
285
- ca_sync(ca->parent);
286
- ca_detach(ca->parent);
287
- }
288
-
289
- static void
290
- ca_field_func_create_mask (void *ap)
291
- {
292
- CAField *ca = (CAField *) ap;
293
- ca_update_mask(ca->parent);
294
- if ( ! ca->parent->mask ) {
295
- ca_create_mask(ca->parent);
296
- }
297
- ca->mask =
298
- (CArray *) ca_refer_new(ca->parent->mask,
299
- CA_BOOLEAN, ca->ndim, ca->dim, 0, 0);
300
- }
301
-
302
- ca_operation_function_t ca_field_func = {
303
- -1, /* CA_OBJ_FIELD */
304
- CA_VIRTUAL_ARRAY,
305
- free_ca_field,
306
- ca_field_func_clone,
307
- ca_field_func_ptr_at_addr,
308
- ca_field_func_ptr_at_index,
309
- NULL,
310
- ca_field_func_fetch_index,
311
- NULL,
312
- ca_field_func_store_index,
313
- ca_field_func_allocate,
314
- ca_field_func_attach,
315
- ca_field_func_sync,
316
- ca_field_func_detach,
317
- ca_field_func_copy_data,
318
- ca_field_func_sync_data,
319
- ca_field_func_fill_data,
320
- ca_field_func_create_mask,
321
- };
322
-
323
- /* ------------------------------------------------------------------- */
324
-
325
- static void
326
- ca_field_attach (CAField *ca)
327
- {
328
- ca_size_t pbytes = ca->parent->bytes;
329
- ca_size_t bytes = ca->bytes;
330
- ca_size_t n = ca->elements;
331
-
332
- switch ( ca->data_type ) {
333
- case CA_BOOLEAN:
334
- case CA_INT8:
335
- case CA_UINT8:
336
- {
337
- char *p = ca_ptr_at_addr(ca, 0);
338
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
339
- while ( n-- ) {
340
- *p = *q;
341
- p += 1; q += pbytes;
342
- }
343
- }
344
- break;
345
- case CA_INT16:
346
- case CA_UINT16:
347
- {
348
- int16_t *p = (int16_t*) ca_ptr_at_addr(ca, 0);
349
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
350
- while ( n-- ) {
351
- *p = *(int16_t*) q;
352
- p += 1; q += pbytes;
353
- }
354
- }
355
- break;
356
- case CA_INT32:
357
- case CA_UINT32:
358
- case CA_FLOAT32:
359
- {
360
- int32_t *p = (int32_t*) ca_ptr_at_addr(ca, 0);
361
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
362
- while ( n-- ) {
363
- *p = *(int32_t*) q;
364
- p += 1; q += pbytes;
365
- }
366
- }
367
- break;
368
- case CA_INT64:
369
- case CA_UINT64:
370
- case CA_FLOAT64:
371
- {
372
- float64_t *p = (float64_t*) ca_ptr_at_addr(ca, 0);
373
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
374
- while ( n-- ) {
375
- *p = *(float64_t*) q;
376
- p += 1; q += pbytes;
377
- }
378
- }
379
- break;
380
- default:
381
- {
382
- char *p = ca_ptr_at_addr(ca, 0);
383
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
384
- while ( n-- ) {
385
- memcpy(p, q, ca->bytes);
386
- p += bytes; q += pbytes;
387
- }
388
- }
389
- }
390
- }
391
-
392
- static void
393
- ca_field_sync (CAField *ca)
394
- {
395
- ca_size_t pbytes = ca->parent->bytes;
396
- ca_size_t bytes = ca->bytes;
397
- ca_size_t n = ca->elements;
398
-
399
- switch ( ca->data_type ) {
400
- case CA_BOOLEAN:
401
- case CA_INT8:
402
- case CA_UINT8:
403
- {
404
- char *p = ca_ptr_at_addr(ca, 0);
405
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
406
- while ( n-- ) {
407
- *q = *p;
408
- p += 1; q += pbytes;
409
- }
410
- }
411
- break;
412
- case CA_INT16:
413
- case CA_UINT16:
414
- {
415
- int16_t *p = (int16_t*) ca_ptr_at_addr(ca, 0);
416
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
417
- while ( n-- ) {
418
- *(int16_t*) q = *p;
419
- p += 1; q += pbytes;
420
- }
421
- }
422
- break;
423
- case CA_INT32:
424
- case CA_UINT32:
425
- case CA_FLOAT32:
426
- {
427
- int32_t *p = (int32_t*) ca_ptr_at_addr(ca, 0);
428
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
429
- while ( n-- ) {
430
- *(int32_t*) q = *p;
431
- p += 1; q += pbytes;
432
- }
433
- }
434
- break;
435
- case CA_INT64:
436
- case CA_UINT64:
437
- case CA_FLOAT64:
438
- {
439
- float64_t *p = (float64_t*) ca_ptr_at_addr(ca, 0);
440
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
441
- while ( n-- ) {
442
- *(float64_t*) q = *p;
443
- p += 1; q += pbytes;
444
- }
445
- }
446
- break;
447
- default:
448
- {
449
- char *p = ca_ptr_at_addr(ca, 0);
450
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
451
- while ( n-- ) {
452
- memcpy(q, p, ca->bytes);
453
- p += bytes; q += pbytes;
454
- }
455
- }
456
- }
457
- }
458
-
459
- static void
460
- ca_field_fill (CAField *ca, char *ptr)
461
- {
462
- ca_size_t pbytes = ca->parent->bytes;
463
- ca_size_t n = ca->elements;
464
- char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
465
-
466
- switch ( ca->data_type ) {
467
- case CA_BOOLEAN:
468
- case CA_INT8:
469
- case CA_UINT8:
470
- {
471
- char *p = ptr;
472
- while ( n-- ) {
473
- *q = *p;
474
- q += pbytes;
475
- }
476
- }
477
- break;
478
- case CA_INT16:
479
- case CA_UINT16:
480
- {
481
- int16_t *p = (int16_t*) ptr;
482
- while ( n-- ) {
483
- *(int16_t*) q = *p;
484
- q += pbytes;
485
- }
486
- }
487
- break;
488
- case CA_INT32:
489
- case CA_UINT32:
490
- case CA_FLOAT32:
491
- {
492
- int32_t *p = (int32_t*) ptr;
493
- while ( n-- ) {
494
- *(int32_t*) q = *p;
495
- q += pbytes;
496
- }
497
- }
498
- break;
499
- case CA_INT64:
500
- case CA_UINT64:
501
- case CA_FLOAT64:
502
- {
503
- float64_t *p = (float64_t*) ptr;
504
- while ( n-- ) {
505
- *(float64_t*) q = *p;
506
- q += pbytes;
507
- }
508
- }
509
- break;
510
- default:
511
- {
512
- while ( n-- ) {
513
- memcpy(q, ptr, ca->bytes);
514
- q += pbytes;
515
- }
516
- }
517
- }
518
-
519
- }
520
-
521
75
  /* ------------------------------------------------------------------- */
522
76
 
523
77
  VALUE
@@ -525,49 +79,22 @@ rb_ca_field_new (VALUE cary, ca_size_t offset, int8_t data_type, ca_size_t bytes
525
79
  {
526
80
  volatile VALUE obj;
527
81
  CArray *parent;
528
- CAField *ca;
82
+ CAStride *ca;
529
83
  rb_check_carray_object(cary);
530
84
  TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
531
- ca = ca_field_new(parent, offset, data_type, bytes);
85
+ ca = ca_field_new(parent, offset, data_type, bytes);
532
86
  obj = ca_wrap_struct(ca);
533
87
  rb_ca_set_parent(obj, cary);
534
88
  return obj;
535
89
  }
536
90
 
537
- static VALUE
538
- rb_ca_field_s_allocate (VALUE klass)
539
- {
540
- CAField *ca;
541
- return TypedData_Make_Struct(klass, CAField, &cafield_data_type, ca);
542
- }
543
-
544
- static VALUE
545
- rb_ca_field_initialize_copy (VALUE self, VALUE other)
546
- {
547
- CAField *ca, *cs;
548
-
549
- TypedData_Get_Struct(self, CAField, &cafield_data_type, ca);
550
- TypedData_Get_Struct(other, CAField, &cafield_data_type, cs);
551
-
552
- ca_field_setup(ca, cs->parent, cs->offset, cs->data_type, cs->bytes);
553
-
554
- return self;
555
- }
556
-
557
- /* ----------------------------------------------------------------------- */
558
-
559
- /* yard:
560
- class CArray
561
- # call-seq:
562
- # CArray#field(offset, data_type[, :bytes=>bytes])
563
- # CArray#field(offset, data_class)
564
- # CArray#field(offset, template)
565
- #
566
- def field (offset, data_type)
567
- end
568
- end
569
- */
570
-
91
+ /* CArray#field(offset, data_type, bytes: nil) -- returns a CAField view of
92
+ the field at `offset` (in bytes) within each record of `self`. If
93
+ `data_type` is a CArray, the result is wrapped in a CARefer that
94
+ adopts its element type and trailing dimensions (= struct-of-array
95
+ subview). If it is a data_class (e.g. CAStruct subclass), the
96
+ CAField is wrapped in a CARecord so encode/decode dispatch is
97
+ carried. One-arg form delegates to rb_ca_face_field. */
571
98
  VALUE
572
99
  rb_ca_field (int argc, VALUE *argv, VALUE self)
573
100
  {
@@ -577,7 +104,7 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
577
104
  ca_size_t offset, bytes;
578
105
 
579
106
  if ( argc == 1 ) {
580
- return rb_ca_field_as_member(self, argv[0]);
107
+ return rb_ca_face_field(self, argv[0]);
581
108
  }
582
109
 
583
110
  TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
@@ -600,7 +127,6 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
600
127
  data_type = CA_FIXLEN;
601
128
  bytes = ct->bytes * ct->elements;
602
129
  obj = rb_ca_field_new(self, offset, data_type, bytes);
603
- rb_ca_data_type_inherit(obj, rtype);
604
130
  ndim = ca->ndim + ct->ndim;
605
131
  for (i=0; i<ca->ndim; i++) {
606
132
  dim[i] = ca->dim[i];
@@ -613,28 +139,55 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
613
139
  else {
614
140
  rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
615
141
  obj = rb_ca_field_new(self, offset, data_type, bytes);
616
- rb_ca_data_type_import(obj, rtype);
142
+ /* When rtype is a data_class, wrap the CAField in a CARecord so the
143
+ view carries the encode/decode dispatch. */
144
+ if ( rb_obj_is_data_class(rtype) ) {
145
+ obj = rb_funcall(rb_const_get(rb_cObject, rb_intern("CARecord")),
146
+ rb_intern("wrap"), 2, obj, rtype);
147
+ }
617
148
  }
618
149
 
619
150
  return obj;
620
151
  }
621
152
 
153
+ /* Pure CAStride subclasses share castride_data_type, so no custom
154
+ allocator is needed — ALLOC(CAStride) via rb_cs_s_allocate is
155
+ already correct for CAField too. */
156
+
157
+ static VALUE
158
+ rb_ca_field_initialize_copy (VALUE self, VALUE other)
159
+ {
160
+ CAStride *ca, *cs;
161
+
162
+ TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
163
+ TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
164
+
165
+ if ( ca_func[CA_OBJ_FIELD].pool_init ) {
166
+ ca_array_pool_alloc(ca, CA_OBJ_FIELD, cs->parent->ndim);
167
+ }
168
+ /* Reconstruct from the source's base_offset / data_type / bytes;
169
+ ca_field_setup recomputes strides from parent's shape. */
170
+ ca_field_setup(ca, cs->parent, cs->base_offset, cs->data_type, cs->bytes);
171
+
172
+ return self;
173
+ }
622
174
 
623
175
  void
624
- Init_ca_obj_field ()
176
+ Init_ca_obj_field (void)
625
177
  {
626
- rb_cCAField = rb_define_class("CAField", rb_cCAVirtual);
178
+ /* rb_cCAField and rb_cCAFieldMask are declared upfront in
179
+ ruby_carray.c so their inheritance chain (CAField < CAStride <
180
+ CAView < CArray) is established before this Init runs. */
627
181
 
628
- CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField,
629
- &cafield_data_type,
630
- rb_cCArrayMask,
631
- &carray_mask_data_type, ca_field_func);
182
+ CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField,
183
+ &castride_data_type,
184
+ rb_cCAFieldMask,
185
+ &castride_mask_data_type,
186
+ &ca_stride_func, sizeof(ca_stride_func));
632
187
  rb_define_const(rb_cObject, "CA_OBJ_FIELD", INT2NUM(CA_OBJ_FIELD));
633
188
 
634
189
  rb_define_method(rb_cCArray, "field", rb_ca_field, -1);
635
190
 
636
- rb_define_alloc_func(rb_cCAField, rb_ca_field_s_allocate);
637
191
  rb_define_method(rb_cCAField, "initialize_copy",
638
192
  rb_ca_field_initialize_copy, 1);
639
193
  }
640
-