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_face.h ADDED
@@ -0,0 +1,279 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ ca_obj_face.h
4
+
5
+ Face mechanism — shared op helper signatures + lift/strip entry points.
6
+
7
+ Phase 1 (= PROPOSAL_CAFACE_PHASE_1.md): skeleton.
8
+ Phase 2 (= PROPOSAL_CAFACE_PHASE_2.md F.2.1): replace shared op helpers
9
+ with thin-forward to parent.
10
+
11
+ This header provides signatures for (1) shared op helpers (= thin-forward
12
+ for storage ops, alias-based since Face is data-layout identical to
13
+ parent), (2) `rb_ca_face_template` (struct duplicate + parent swap),
14
+ (3) `ca_face_lift` (= wrap hook at the tail of user-facing access
15
+ methods), (4) `ca_strip_face` (= Face-stripping helper at kernel_iterator
16
+ entry).
17
+
18
+ A Face is a "mask of a semantic type" (= identity layered on a storage
19
+ type such as int64, with no value conversion), sibling to CAFake which
20
+ was a "mask of data_type conversion".
21
+
22
+ --------------------------------------------------------------------------- */
23
+
24
+ #ifndef CA_OBJ_FACE_H
25
+ #define CA_OBJ_FACE_H
26
+
27
+ #include "carray.h"
28
+
29
+ /* -- shared op helpers (= thin-forward to parent, alias-based) --
30
+ Face is data-layout identical to parent (= storage type / bytes /
31
+ strides / dim all match), so:
32
+ - attach: parent attach; ptr aliases parent->ptr (= no xmalloc needed)
33
+ - sync: parent sync (= alias path, no copy back needed; propagates
34
+ via parent)
35
+ - detach: release ptr alias, parent detach
36
+ - xfer_*: delegate to parent's xfer_* (= identical shape / index space)
37
+ - fill_data / fill_*: delegate to parent (= identical storage bytes,
38
+ and the identity layout makes the parent's addresses ours)
39
+
40
+ Subclasses may override as needed (= default policy, not an invariant;
41
+ does not preclude a future transform Face). */
42
+
43
+ void ca_face_attach (void *ap);
44
+ void ca_face_sync (void *ap);
45
+ void ca_face_detach (void *ap);
46
+ void ca_face_fill_data (void *ap, void *ptr);
47
+ void ca_face_fill_addrs (void *ap, ca_size_t n, ca_size_t *addrs, void *ptr);
48
+ void ca_face_fill_stride(void *ap, ca_size_t base, int8_t ndim,
49
+ ca_size_t *counts, ca_size_t *steps, void *ptr);
50
+ void ca_face_xfer_index (void *ap, ca_size_t *idx,
51
+ void *data, int dir);
52
+ void ca_face_xfer_addrs (void *ap, ca_size_t n, ca_size_t *addrs,
53
+ void *data, int dir);
54
+ void ca_face_xfer_stride(void *ap, ca_size_t *starts, ca_size_t *counts,
55
+ ca_size_t *strides, void *data, int dir);
56
+ void ca_face_xfer_all (void *ap, void *data, int dir);
57
+
58
+ /* -- lift / strip helpers -- */
59
+
60
+ /* Struct duplicate + parent + shape swap (= MEMO §4.3; consumed by Face
61
+ subclass lift / clone / dup machinery in Phase 2). */
62
+ VALUE rb_ca_face_template (VALUE original_face, CArray *new_parent,
63
+ ca_size_t *new_dim);
64
+
65
+ /* At the tail of user-facing access methods, `if parent is a Face, wrap
66
+ the result as a Face`. Deployed in Phase 1 for `ca[...]`
67
+ (= rb_ca_aref / rb_ca_store); planned for block / refer / reshape /
68
+ transpose / sort etc. in Phase 2. */
69
+ VALUE ca_face_lift (VALUE view, VALUE face_parent);
70
+
71
+ /* Follow the Face flag down to parent, e.g. at kernel_iterator entry.
72
+ No call sites in Phase 1; wired into SRC_* path init_l2 in Phase 2
73
+ (F.2.6). */
74
+ CArray *ca_strip_face (CArray *src);
75
+
76
+ /* VALUE-level counterpart: walks the Face parent ivar chain to the root
77
+ storage VALUE. Used at ordering / search dispatcher entry so both the
78
+ switch (src->data_type) and downstream rb_ca_template* calls see the
79
+ root storage, not the Face surface. */
80
+ VALUE rb_ca_strip_face_value (VALUE v);
81
+
82
+ /* Face gate for the element-wise comparison operators (< <= > >=, eq, ne).
83
+ When self is a Face over numeric storage, descends both operands to
84
+ storage (ORDERABLE required) and reconciles a Face RHS via to_comparable;
85
+ a fixlen-storage Face or a non-Face self is left untouched. Called from
86
+ rb_ca_call_bincmp. See ca_obj_face.c for the full contract. */
87
+ void ca_face_reconcile_comparison (volatile VALUE *pself,
88
+ volatile VALUE *pother);
89
+
90
+ /* CAFace abstract base class init (rev11 2026-06-10).
91
+ Called from ruby_carray.c's Init after rb_cCAView is defined, before
92
+ CATime / CATimedelta Init. */
93
+ void Init_ca_face (void);
94
+
95
+ /* -- R.5: composite Face data_class universal dispatch --
96
+ Extern for direct C access from `rb_ca_data_class` (carray_attribute.c)
97
+ into the CARecord tail. CA_OBJ_RECORD identifies the obj_type (assigned
98
+ at runtime by ca_install_obj_type). To add a future composite Face,
99
+ follow the same pattern: add an extern here and one line of case in the
100
+ switch in carray_attribute.c. */
101
+ extern int8_t CA_OBJ_RECORD;
102
+ VALUE rb_ca_record_get_data_class (CArray *ca);
103
+
104
+ /* -- Convenience macro for view-creating method deployment (F.2.13) --
105
+ Insert at the tail of each view-creating Ruby method (= rb_ca_transpose
106
+ / rb_ca_reshape / etc.) just before return. `ca` is self's CArray *,
107
+ `obj` is the view result, `self` is the calling VALUE. Achieves Face
108
+ transparency in a single C-level line, subclass-agnostic.
109
+
110
+ Macroises the pattern hand-written at the tail of `rb_ca_fetch_method`
111
+ in Phase 1; applied uniformly to view-creating methods from Phase 2
112
+ F.2.13 onward. */
113
+ #define CA_FACE_LIFT_IF_FACE(obj, self, ca) do { \
114
+ if ( ca_is_face(ca) && rb_obj_is_kind_of((obj), rb_cCArray) ) { \
115
+ (obj) = ca_face_lift((obj), (self)); \
116
+ } \
117
+ } while (0)
118
+
119
+ /* -- wrapper lift (Face or CALazyMarker) --
120
+
121
+ A Face and a CALazyMarker are both storage-identical wrappers: they add
122
+ an interpretation over their parent's bytes without changing them. Both
123
+ want the same invariant at a view-creating method -- the wrapper stays on
124
+ top, and the view is built against what the wrapper wraps. For a Face
125
+ that keeps `dt.shift(1)` a CATime; for a marker it keeps a fuse block's
126
+ expression lazy instead of dropping out of the chain.
127
+
128
+ The flag test comes first and covers both bits in one mask, so an
129
+ ordinary array leaves through a single AND. That matters: `[]` is the
130
+ hottest method this is deployed on (see devel/bench_index_percall.rb).
131
+
132
+ NOT interchangeable with CA_FACE_LIFT_IF_FACE. Face is lifted at ~24
133
+ sites, including ones a marker must not follow it through -- `copy` owns
134
+ its data, `sort` reorders values, `value` and `strip_mask` change what
135
+ the mask means. Deploy this only where the result is a view whose shape
136
+ was fixed at construction and which only moves positions
137
+ (PROPOSAL_LAZY_MARKER_LIFT section 4). */
138
+ #define CA_WRAPPER_LIFT(obj, self, ca) do { \
139
+ if ( ca_test_flag((ca), CA_FLAG_IS_FACE | CA_FLAG_IS_LAZY_MARKER) \
140
+ && rb_obj_is_kind_of((obj), rb_cCArray) ) { \
141
+ (obj) = ca_wrapper_lift((obj), (self), (ca)); \
142
+ } \
143
+ } while (0)
144
+
145
+ VALUE ca_wrapper_lift (VALUE view, VALUE wrapper, void *wrapper_ca);
146
+
147
+ /* -- Scalar fetch decode hook (storage -> surface) --
148
+ On the scalar-return path (= tail of rb_ca_fetch_index /
149
+ rb_ca_fetch_addr), if a Face-derived subclass defines a
150
+ `storage_to_scalar(raw_value)` Ruby callback, invoke it. This is a
151
+ decode (copy the storage value out and construct a new value object),
152
+ not a wrap (a zero-copy lens over live memory). Its write-direction
153
+ counterpart is `scalar_to_storage` (below).
154
+
155
+ Use cases:
156
+ - `dt[i]` for CATime / CATimedelta → Scalar decode
157
+ - `ca[i,j,k]` for user-implemented CAObject Face → custom Scalar return
158
+ - Removes the need for Ruby overrides (= alias_method :[] etc.),
159
+ subclass-agnostic
160
+
161
+ Guards:
162
+ - ca_is_face(ca): no-op for non-Face
163
+ - !is_a?(CArray): CArray results go through the lift path
164
+ (= CA_FACE_LIFT_IF_FACE)
165
+ - !UNDEF: don't decode the masked-element sentinel
166
+ - respond_to?(:storage_to_scalar): activates once the subclass adopts
167
+ the convention */
168
+ /* Face-local C-level dispatch table for storage_to_scalar, separate
169
+ from the global ca_operation_function_t (no API change to existing
170
+ subsystems). A Face subclass that wants the per-cell scalar fetch hot
171
+ path to skip rb_funcall registers its C function via
172
+ ca_face_register_storage_to_scalar(obj_type, fn) at Init time.
173
+ Unregistered obj_types (= external gem Faces that only define the Ruby
174
+ method) fall through to the rb_funcall branch. The Ruby
175
+ `storage_to_scalar` method is still defined as a regular method so
176
+ user-facing Ruby code may call it directly. */
177
+ typedef VALUE (*ca_face_storage_to_scalar_fn)(VALUE self, VALUE raw);
178
+
179
+ extern ca_face_storage_to_scalar_fn ca_face_storage_to_scalar_table[];
180
+
181
+ void ca_face_register_storage_to_scalar (int obj_type,
182
+ ca_face_storage_to_scalar_fn fn);
183
+
184
+ /* -- Scalar store encode hook (surface -> storage), mirror of the decode --
185
+ The write-direction counterpart of storage_to_scalar. Given a surface
186
+ value object (a Scalar / Time / DateTime), a Face-owned function returns
187
+ a storage-domain value (for datetime/timedelta: an Integer in self's
188
+ unit) that the storage cast in rb_ca_obj2ptr can consume directly. A
189
+ Face that needs no conversion (surface == storage) simply does not
190
+ register. Faces may either register a C fast-path function here or
191
+ define the Ruby method `scalar_to_storage`; the C table is consulted
192
+ first, then the Ruby fallback. */
193
+ typedef VALUE (*ca_face_scalar_to_storage_fn)(VALUE self, VALUE surface);
194
+
195
+ extern ca_face_scalar_to_storage_fn ca_face_scalar_to_storage_table[];
196
+
197
+ void ca_face_register_scalar_to_storage (int obj_type,
198
+ ca_face_scalar_to_storage_fn fn);
199
+
200
+ /* Single source of truth for the surface -> storage-domain conversion.
201
+ Returns `obj` unchanged when `ca` is not a Face or when no hook is
202
+ registered / defined (so a bare Integer / String passes through to the
203
+ existing storage cast). Otherwise returns the storage-domain value the
204
+ Face produced. Called from rb_ca_obj2ptr (single-cell / fill / masked /
205
+ range stores) and from the Array-of-scalars bulk store branch. */
206
+ VALUE ca_face_scalar_to_storage (VALUE self, CArray *ca, VALUE obj);
207
+
208
+ /* -- F.S0: Face state homogeneity check (= prerequisite for multi-Face APIs
209
+ such as CAStack lift) --
210
+ Per-obj_type C hook returning 1 if `a` and `b` (= both Face instances of
211
+ the same obj_type) have compatible state (= same struct tail fields).
212
+ Caller of `ca_face_state_compatible` guarantees both args are Face and
213
+ have identical obj_type. */
214
+ typedef int (*ca_face_state_compatible_fn)(CArray *a, CArray *b);
215
+
216
+ extern ca_face_state_compatible_fn ca_face_state_compatible_table[];
217
+
218
+ void ca_face_register_state_compatible (int obj_type,
219
+ ca_face_state_compatible_fn fn);
220
+
221
+ /* Dispatch order:
222
+ 1. C hook registered for a->obj_type → call hook, return its result
223
+ 2. Else if the Ruby class of `va` defines `face_state_compatible?`
224
+ on a Face subclass (= overrides CArray's default) → invoke with
225
+ `vb`, return RTEST of result
226
+ 3. Else → 1 (= default compatible, class identity only)
227
+ Caller must pre-check a->obj_type == b->obj_type. `va` / `vb` are
228
+ the Ruby VALUEs of the same instances (used only for the Ruby fallback
229
+ path). */
230
+ int ca_face_state_compatible (VALUE va, CArray *a, VALUE vb, CArray *b);
231
+
232
+ /* -- F.S1: Face state portability (= class-level predicate) --
233
+ Whether a Face class's state can be "moved" from one parent to
234
+ another -- i.e., whether list[0]'s state can stand in for the result
235
+ when a multi-parent operation (CAStack lift, compose family Face
236
+ preservation, etc.) is performed.
237
+
238
+ - portable = 1: state is metadata-only (= CATime unit, CACircular
239
+ @range), can be carried to the lifted view via ca_face_lift.
240
+ - portable = 0: state holds per-parent storage tied to the specific
241
+ parent (= CAConstString buffer); cannot be exchanged across parents.
242
+ Multi-parent operations must reject.
243
+
244
+ Default for unregistered obj_types is 1 (= safe for the common case of
245
+ metadata-only Faces, including Ruby-implemented Faces that don't reach
246
+ a C Init). Faces whose state holds per-parent storage MUST explicitly
247
+ register 0 (= CAConstString). */
248
+ extern int8_t ca_face_state_portable_table[];
249
+
250
+ void ca_face_register_state_portable (int obj_type, int portable);
251
+
252
+ /* Dispatch:
253
+ 1. C table entry registered for obj_type → return that value
254
+ 2. Else if the Ruby class `klass` defines a singleton method
255
+ `face_state_portable?` (= subclass owns it) → invoke and RTEST
256
+ 3. Else → 1 (= default portable)
257
+ `klass` is the Ruby class of the Face instance (used for the Ruby
258
+ fallback path). Pass Qnil when the class is unknown / unavailable
259
+ (= falls through to default). */
260
+ int ca_face_state_portable (int obj_type, VALUE klass);
261
+
262
+ #define CA_FACE_STORAGE_TO_SCALAR_IF_FACE(obj, self, ca) do { \
263
+ if ( ca_is_face(ca) && (obj) != CA_UNDEF && (obj) != Qnil \
264
+ && ! rb_obj_is_kind_of((obj), rb_cCArray) ) { \
265
+ ca_face_storage_to_scalar_fn _decode_fn = ca_face_storage_to_scalar_table[(ca)->obj_type]; \
266
+ if ( _decode_fn != NULL ) { \
267
+ (obj) = _decode_fn((self), (obj)); \
268
+ } \
269
+ else { \
270
+ static ID _id_storage_to_scalar = 0; \
271
+ if ( _id_storage_to_scalar == 0 ) _id_storage_to_scalar = rb_intern("storage_to_scalar"); \
272
+ if ( rb_respond_to((self), _id_storage_to_scalar) ) { \
273
+ (obj) = rb_funcall((self), _id_storage_to_scalar, 1, (obj)); \
274
+ } \
275
+ } \
276
+ } \
277
+ } while (0)
278
+
279
+ #endif /* CA_OBJ_FACE_H */