carray 3.0.2 → 3.0.4

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
@@ -67,31 +67,5 @@ class CArray
67
67
  def guess_type_and_bytes(type_spec, bytes = nil); end
68
68
 
69
69
  # @!endgroup
70
-
71
- # @!group String scanning (internal)
72
-
73
- # @overload _scan_float(str, fill_value = nil)
74
- # Parses `str` as a single double-precision float. Returns
75
- # `fill_value` (or `NaN` if `fill_value` is nil) when `str` is
76
- # `nil` or unparseable. Internal helper used by text-format I/O
77
- # readers; end users should prefer Ruby's `Float()` /
78
- # `String#to_f`.
79
- # @param str [String, nil]
80
- # @param fill_value [Float, nil]
81
- # @return [Float]
82
- # @api private
83
- def _scan_float(str, fill_value = nil); end
84
-
85
- # @overload _scan_int(str, fill_value = nil)
86
- # Parses `str` as a single integer. Returns `fill_value`
87
- # (or `0` if `fill_value` is nil) when `str` is `nil` or
88
- # unparseable. Internal helper used by text-format I/O readers.
89
- # @param str [String, nil]
90
- # @param fill_value [Integer, nil]
91
- # @return [Integer]
92
- # @api private
93
- def _scan_int(str, fill_value = nil); end
94
-
95
- # @!endgroup
96
70
  end
97
71
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carray
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.2
4
+ version: 3.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - himotoyoshi
@@ -45,7 +45,6 @@ files:
45
45
  - ext/ca_composite_dispatch.c
46
46
  - ext/ca_composite_dispatch.h
47
47
  - ext/ca_for_buffer.h
48
- - ext/ca_for_each_element.h
49
48
  - ext/ca_group_iter.c
50
49
  - ext/ca_iter_substrate.h
51
50
  - ext/ca_kernel_iterator.c
@@ -96,6 +95,7 @@ files:
96
95
  - ext/ca_op_cmplx64.h
97
96
  - ext/ca_op_ipower.c
98
97
  - ext/ca_op_powi.h
98
+ - ext/ca_pow5_table.h
99
99
  - ext/ca_rng_normal.h
100
100
  - ext/ca_rng_xoshiro256pp.h
101
101
  - ext/ca_sort_kernels.h
@@ -104,6 +104,7 @@ files:
104
104
  - ext/ca_transform_common.c
105
105
  - ext/ca_triop_dispatch.c
106
106
  - ext/ca_triop_dispatch.h
107
+ - ext/caframe_csv_reader.c
107
108
  - ext/carray.h
108
109
  - ext/carray_access.c
109
110
  - ext/carray_address_basis.c
@@ -133,7 +134,6 @@ files:
133
134
  - ext/carray_kernels_bincmp.c
134
135
  - ext/carray_kernels_binop.c
135
136
  - ext/carray_kernels_init.c
136
- - ext/carray_kernels_map.c
137
137
  - ext/carray_kernels_moncmp.c
138
138
  - ext/carray_kernels_monop.c
139
139
  - ext/carray_kernels_reduce_aggregate.c
@@ -145,6 +145,7 @@ files:
145
145
  - ext/carray_kernels_search.c
146
146
  - ext/carray_kernels_sort.c
147
147
  - ext/carray_kernels_triop.c
148
+ - ext/carray_key_windows.c
148
149
  - ext/carray_lazy.c
149
150
  - ext/carray_loop.c
150
151
  - ext/carray_mask.c
@@ -156,23 +157,26 @@ files:
156
157
  - ext/carray_order.c
157
158
  - ext/carray_partition.c
158
159
  - ext/carray_random.c
160
+ - ext/carray_round.c
159
161
  - ext/carray_scatter.c
162
+ - ext/carray_segment.c
160
163
  - ext/carray_slab.c
161
164
  - ext/carray_slab.h
162
165
  - ext/carray_sort.c
163
166
  - ext/carray_sort_kernel.c
164
167
  - ext/carray_struct.c
165
168
  - ext/carray_test.c
169
+ - ext/carray_time_text.c
166
170
  - ext/carray_undef.c
167
171
  - ext/carray_utils.c
168
172
  - ext/extconf.rb
169
173
  - ext/mk_call_cfunc.rb
174
+ - ext/mk_pow5_table.rb
170
175
  - ext/mkkernel.rb
171
176
  - ext/ruby_carray.c
172
177
  - ext/version.h
173
178
  - ext/version.rb
174
179
  - lib/carray.rb
175
- - lib/carray/arrow_tensor.rb
176
180
  - lib/carray/attribute.rb
177
181
  - lib/carray/autoload_carray.rb
178
182
  - lib/carray/autoload_method_extension.rb
@@ -190,23 +194,29 @@ files:
190
194
  - lib/carray/core_extensions.rb
191
195
  - lib/carray/data_type_extension.rb
192
196
  - lib/carray/data_type_limits.rb
197
+ - lib/carray/distance_limit.rb
193
198
  - lib/carray/fixlen_string.rb
194
199
  - lib/carray/frame.rb
200
+ - lib/carray/frame/column_verbs.rb
195
201
  - lib/carray/frame/concat.rb
196
202
  - lib/carray/frame/convert.rb
197
203
  - lib/carray/frame/csv_parser.rb
204
+ - lib/carray/frame/describe.rb
198
205
  - lib/carray/frame/frame.rb
199
206
  - lib/carray/frame/group.rb
200
207
  - lib/carray/frame/io.rb
201
208
  - lib/carray/frame/join.rb
202
209
  - lib/carray/frame/records.rb
210
+ - lib/carray/frame/reshape.rb
203
211
  - lib/carray/frame/sort.rb
204
212
  - lib/carray/frame/verbs.rb
213
+ - lib/carray/frame/windows.rb
205
214
  - lib/carray/fuse_source.rb
206
215
  - lib/carray/fusion.rb
207
216
  - lib/carray/histogram.rb
208
217
  - lib/carray/inspect.rb
209
218
  - lib/carray/iterator.rb
219
+ - lib/carray/key_windows.rb
210
220
  - lib/carray/lazy.rb
211
221
  - lib/carray/mask_gap_fill.rb
212
222
  - lib/carray/math.rb
@@ -223,8 +233,10 @@ files:
223
233
  - lib/carray/methods/gather_nd.rb
224
234
  - lib/carray/methods/index.rb
225
235
  - lib/carray/methods/insert_block.rb
236
+ - lib/carray/methods/is_between.rb
226
237
  - lib/carray/methods/is_in.rb
227
238
  - lib/carray/methods/join.rb
239
+ - lib/carray/methods/lag.rb
228
240
  - lib/carray/methods/locate_addr.rb
229
241
  - lib/carray/methods/mask_duplicates.rb
230
242
  - lib/carray/methods/meshgrid.rb
@@ -237,8 +249,10 @@ files:
237
249
  - lib/carray/methods/unique.rb
238
250
  - lib/carray/methods/value_counts.rb
239
251
  - lib/carray/mkmf.rb
252
+ - lib/carray/record_order.rb
240
253
  - lib/carray/rng.rb
241
254
  - lib/carray/runtime.rb
255
+ - lib/carray/segment_iterator.rb
242
256
  - lib/carray/serialize.rb
243
257
  - lib/carray/slab_iterator.rb
244
258
  - lib/carray/stack.rb
@@ -246,7 +260,6 @@ files:
246
260
  - lib/carray/string_operation_extension.rb
247
261
  - lib/carray/struct.rb
248
262
  - lib/carray/struct_builder.rb
249
- - lib/carray/table.rb
250
263
  - lib/carray/time.rb
251
264
  - lib/carray/window_iterator.rb
252
265
  - yard-stubs/ca_obj_array.rb
@@ -286,6 +299,7 @@ files:
286
299
  - yard-stubs/carray_order.rb
287
300
  - yard-stubs/carray_random.rb
288
301
  - yard-stubs/carray_scatter.rb
302
+ - yard-stubs/carray_segment.rb
289
303
  - yard-stubs/carray_slab.rb
290
304
  - yard-stubs/carray_sort.rb
291
305
  - yard-stubs/carray_test.rb
@@ -1,239 +0,0 @@
1
- /* ---------------------------------------------------------------------------
2
- *
3
- * ca_for_each_element.h -- sweep ELEMENT macro family (single-array, lexical
4
- * scope body) for ext authors.
5
- *
6
- * PROPOSAL_L0_AUTHOR_SURFACE L0.2a (2026-06-11). Builds on the sweep engine
7
- * helper (ca_sweep_engine.{c,h}, L0.1) for the xfer_all-aware acquire/release
8
- * lifecycle. Provides 5 macro forms for single-array element-wise loops
9
- * with author-inline body and lexical-scope state capture.
10
- *
11
- * Forms (Q2 = gamma: READ by-value, INOUT / OUT by-lvalue):
12
- *
13
- * CA_FOR_EACH_ELEMENT(st1, ca, T, x)
14
- * Read-only loop; per-iter x = cell value (T rvalue convention but
15
- * declared lvalue for assignment). Mask policy: NO_MASK (raises if
16
- * INPUT has mask; use _MASKED form to handle).
17
- *
18
- * CA_FOR_EACH_ELEMENT_MASKED(st1, ca, T, x, m)
19
- * Read-only with mask byte m (1 = masked). Author inspects m and
20
- * decides; m == 0 if source has no mask.
21
- *
22
- * CA_FOR_EACH_ELEMENT_INOUT(st2, ca_in, ca_out, T_IN, T_OUT, in, out)
23
- * Map kernel; per-iter in = read input, body assigns to out (lvalue),
24
- * out is written back to ca_out. Strict same-shape check on init
25
- * (raises on mismatch). NO_MASK on input.
26
- *
27
- * CA_FOR_EACH_ELEMENT_INOUT_MASKED(st2, ca_in, ca_out, T_IN, T_OUT,
28
- * in, out, m_in, m_out)
29
- * Map kernel with mask; per-iter m_in = input mask byte (or 0 if no
30
- * input mask), author writes m_out (1 = mark output cell masked) and
31
- * out. m_out written back to ca_out's mask.
32
- *
33
- * CA_FOR_EACH_ELEMENT_OUT(st1, ca_out, T, out)
34
- * Write-only; body assigns to out (lvalue). Use for init / iota /
35
- * fill patterns. NO_MASK (output mask cleared).
36
- *
37
- * Usage pattern:
38
- *
39
- * ca_each_state_t st;
40
- * double x;
41
- * CA_FOR_EACH_ELEMENT(st, ca, double, x) {
42
- * accumulator += x;
43
- * }
44
- *
45
- * Constraints (same as CA_FOR_EACH_FIBER family):
46
- * - State (st1 / st2) is author-declared on the stack.
47
- * - `break;` from body exits cleanly (release runs in outer for's
48
- * teardown clause).
49
- * - `return;` from body LEAKS scratch buffers / attached views — do
50
- * not return early from the macro body; restructure to break.
51
- * - Macros are NOT statement-equivalent (expand to nested for); no
52
- * trailing `else`.
53
- * - `T` must be the data_type of `ca` (matched via ca->data_type and
54
- * ca->bytes — engine does not auto-cast; use rb_ca_wrap_readonly /
55
- * rb_ca_template_with_type at the call site if cast needed).
56
- *
57
- * --------------------------------------------------------------------------- */
58
-
59
- #ifndef CA_FOR_EACH_ELEMENT_H
60
- #define CA_FOR_EACH_ELEMENT_H
61
-
62
- #include "carray.h"
63
- #include "ca_sweep_engine.h"
64
-
65
- /* Stack-allocated state holders for 1- and 2-operand sweep ELEMENT macros.
66
- * Embeds the per-op bookkeeping arrays + the core ca_sweep_state_t in one
67
- * struct so authors declare just one variable. */
68
-
69
- typedef struct {
70
- CArray *cx[1];
71
- char *base[1];
72
- ca_size_t stride[1];
73
- char *owned_buf[1];
74
- int attached[1];
75
- char *base_orig[1];
76
- ca_sweep_state_t core;
77
- } ca_each_state_t;
78
-
79
- typedef struct {
80
- CArray *cx[2];
81
- char *base[2];
82
- ca_size_t stride[2];
83
- char *owned_buf[2];
84
- int attached[2];
85
- char *base_orig[2];
86
- ca_sweep_state_t core;
87
- } ca_each_map_state_t;
88
-
89
- /* Internal init helpers: wire the embedded arrays into core, set fsync /
90
- * no_mask / src_label. Called via comma-expression inside the macro
91
- * for-loop init clause. */
92
-
93
- #define CA_SWEEP_WIRE_1_(_st1, _ca0, _fsync, _no_mask, _label) ( \
94
- (_st1).cx[0] = (CArray *)(_ca0), \
95
- (_st1).core.n_ops = 1, \
96
- (_st1).core.fsync = (_fsync), \
97
- (_st1).core.cx = (_st1).cx, \
98
- (_st1).core.base = (_st1).base, \
99
- (_st1).core.stride = (_st1).stride, \
100
- (_st1).core.owned_buf = (_st1).owned_buf, \
101
- (_st1).core.attached = (_st1).attached, \
102
- (_st1).core.base_orig = (_st1).base_orig, \
103
- (_st1).core.no_mask = (_no_mask), \
104
- (_st1).core.src_label = (_label))
105
-
106
- #define CA_SWEEP_WIRE_2_(_st2, _ca0, _ca1, _fsync, _no_mask, _label) ( \
107
- (_st2).cx[0] = (CArray *)(_ca0), \
108
- (_st2).cx[1] = (CArray *)(_ca1), \
109
- (_st2).core.n_ops = 2, \
110
- (_st2).core.fsync = (_fsync), \
111
- (_st2).core.cx = (_st2).cx, \
112
- (_st2).core.base = (_st2).base, \
113
- (_st2).core.stride = (_st2).stride, \
114
- (_st2).core.owned_buf = (_st2).owned_buf, \
115
- (_st2).core.attached = (_st2).attached, \
116
- (_st2).core.base_orig = (_st2).base_orig, \
117
- (_st2).core.no_mask = (_no_mask), \
118
- (_st2).core.src_label = (_label))
119
-
120
- /* ---------- 5 author-facing macro forms ----------
121
- *
122
- * All 5 forms expand to a 3-level nested for:
123
- * outer : acquire_chunked / release_chunked (= lifecycle scope)
124
- * middle : ca_sweep_next_chunk loop (= chunk iteration)
125
- * inner : per-cell loop within chunk_n
126
- *
127
- * Memory peak per AC2: INPUT non-alias views materialise into a single
128
- * chunk scratch (~32KB at f64). m0 (= masked form) is chunk-sized too and
129
- * re-gathered per chunk, so the macro reads at m0[k] -- indexed within the
130
- * chunk, not by the flat cell index.
131
- *
132
- * For MASKED forms (m / m_in / m_out): when source has no mask, m0 is
133
- * NULL and m / m_in == 0 always. m_out writes during INOUT_MASKED are
134
- * silently dropped if no INPUT mask exists (= AC4 mask-creation on
135
- * INOUT MASKED with no source mask is a future enhancement; current
136
- * convention follows the FIBER family's MASKED form).
137
- */
138
-
139
- /* (1) READ-only, NO_MASK */
140
- #define CA_FOR_EACH_ELEMENT(_st1, _ca, T, x) \
141
- for ( int __cfe_init = (CA_SWEEP_WIRE_1_((_st1), (_ca), "0", 1, \
142
- "CA_FOR_EACH_ELEMENT"), \
143
- ca_sweep_acquire_chunked(&(_st1).core), 1); \
144
- __cfe_init; \
145
- __cfe_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
146
- for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
147
- for ( ca_size_t __cfe_k = 0; \
148
- __cfe_k < (_st1).core.chunk_n \
149
- && (((x) = *(T *)((_st1).core.base[0] \
150
- + __cfe_k * (_st1).core.stride[0])), 1); \
151
- __cfe_k++ )
152
-
153
- /* (2) READ-only, MASKED (m is 1 if masked, 0 otherwise; 0 if no source mask) */
154
- #define CA_FOR_EACH_ELEMENT_MASKED(_st1, _ca, T, x, m) \
155
- for ( int __cfem_init = (CA_SWEEP_WIRE_1_((_st1), (_ca), "0", 0, \
156
- "CA_FOR_EACH_ELEMENT_MASKED"), \
157
- ca_sweep_acquire_chunked(&(_st1).core), 1); \
158
- __cfem_init; \
159
- __cfem_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
160
- for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
161
- for ( ca_size_t __cfem_k = 0; \
162
- __cfem_k < (_st1).core.chunk_n \
163
- && (((x) = *(T *)((_st1).core.base[0] \
164
- + __cfem_k * (_st1).core.stride[0])), \
165
- ((m) = (_st1).core.m0 \
166
- ? (_st1).core.m0[__cfem_k] \
167
- : (boolean8_t)0), \
168
- 1); \
169
- __cfem_k++ )
170
-
171
- /* (3) INOUT map (NO_MASK). Strict same-shape check pre-acquire. */
172
- #define CA_FOR_EACH_ELEMENT_INOUT(_st2, _ca_in, _ca_out, \
173
- T_IN, T_OUT, in, out) \
174
- for ( int __cfei_init = ( \
175
- ca_sweep_check_same_shape((CArray *)(_ca_in), \
176
- (CArray *)(_ca_out), \
177
- "CA_FOR_EACH_ELEMENT_INOUT"), \
178
- CA_SWEEP_WIRE_2_((_st2), (_ca_in), (_ca_out), "01", 1, \
179
- "CA_FOR_EACH_ELEMENT_INOUT"), \
180
- ca_sweep_acquire_chunked(&(_st2).core), \
181
- 1); \
182
- __cfei_init; \
183
- __cfei_init = 0, ca_sweep_release_chunked(&(_st2).core) ) \
184
- for ( ; ca_sweep_next_chunk(&(_st2).core); ) \
185
- for ( ca_size_t __cfei_k = 0; \
186
- __cfei_k < (_st2).core.chunk_n \
187
- && (((in) = *(T_IN *)((_st2).core.base[0] \
188
- + __cfei_k * (_st2).core.stride[0])), \
189
- 1); \
190
- (*(T_OUT *)((_st2).core.base[1] \
191
- + __cfei_k * (_st2).core.stride[1]) = (out)), \
192
- __cfei_k++ )
193
-
194
- /* (4) INOUT map (MASKED). Author writes m_out per cell. */
195
- #define CA_FOR_EACH_ELEMENT_INOUT_MASKED(_st2, _ca_in, _ca_out, \
196
- T_IN, T_OUT, \
197
- in, out, m_in, m_out) \
198
- for ( int __cfeim_init = ( \
199
- ca_sweep_check_same_shape((CArray *)(_ca_in), \
200
- (CArray *)(_ca_out), \
201
- "CA_FOR_EACH_ELEMENT_INOUT_MASKED"), \
202
- CA_SWEEP_WIRE_2_((_st2), (_ca_in), (_ca_out), "01", 0, \
203
- "CA_FOR_EACH_ELEMENT_INOUT_MASKED"), \
204
- ca_sweep_acquire_chunked(&(_st2).core), \
205
- 1); \
206
- __cfeim_init; \
207
- __cfeim_init = 0, ca_sweep_release_chunked(&(_st2).core) ) \
208
- for ( ; ca_sweep_next_chunk(&(_st2).core); ) \
209
- for ( ca_size_t __cfeim_k = 0; \
210
- __cfeim_k < (_st2).core.chunk_n \
211
- && (((in) = *(T_IN *)((_st2).core.base[0] \
212
- + __cfeim_k * (_st2).core.stride[0])), \
213
- ((m_in) = (_st2).core.m0 \
214
- ? (_st2).core.m0[__cfeim_k] \
215
- : (boolean8_t)0), \
216
- ((m_out) = (m_in)), \
217
- 1); \
218
- (*(T_OUT *)((_st2).core.base[1] \
219
- + __cfeim_k * (_st2).core.stride[1]) = (out)), \
220
- (((_st2).core.m0) \
221
- ? ((_st2).core.m0[__cfeim_k] = (m_out)) \
222
- : (boolean8_t)0), \
223
- __cfeim_k++ )
224
-
225
- /* (5) WRITE-only (init / iota / fill). */
226
- #define CA_FOR_EACH_ELEMENT_OUT(_st1, _ca_out, T, out) \
227
- for ( int __cfeo_init = (CA_SWEEP_WIRE_1_((_st1), (_ca_out), "1", 0, \
228
- "CA_FOR_EACH_ELEMENT_OUT"), \
229
- ca_sweep_acquire_chunked(&(_st1).core), 1); \
230
- __cfeo_init; \
231
- __cfeo_init = 0, ca_sweep_release_chunked(&(_st1).core) ) \
232
- for ( ; ca_sweep_next_chunk(&(_st1).core); ) \
233
- for ( ca_size_t __cfeo_k = 0; \
234
- __cfeo_k < (_st1).core.chunk_n; \
235
- (*(T *)((_st1).core.base[0] \
236
- + __cfeo_k * (_st1).core.stride[0]) = (out)), \
237
- __cfeo_k++ )
238
-
239
- #endif /* CA_FOR_EACH_ELEMENT_H */