carray 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -25
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +1 -1
  5. data/NEWS.md +3 -0
  6. data/README.md +128 -44
  7. data/carray.gemspec +22 -24
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1208 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +125 -0
  15. data/ext/ca_binop_dispatch.h +159 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +241 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4321 -0
  26. data/ext/ca_kernel_iterator.h +2603 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +809 -0
  33. data/ext/ca_obj_binop.c +892 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +965 -0
  39. data/ext/ca_obj_face.c +670 -0
  40. data/ext/ca_obj_face.h +247 -0
  41. data/ext/ca_obj_fake.c +228 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +306 -0
  45. data/ext/ca_obj_grid.c +858 -440
  46. data/ext/ca_obj_meld.c +1034 -0
  47. data/ext/ca_obj_moncmp.c +569 -0
  48. data/ext/ca_obj_monop.c +1111 -0
  49. data/ext/ca_obj_object.c +774 -298
  50. data/ext/ca_obj_record.c +468 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +569 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +616 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1296 -0
  58. data/ext/ca_obj_shift.c +230 -792
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2501 -0
  62. data/ext/ca_obj_string.c +268 -0
  63. data/ext/ca_obj_tile.c +614 -0
  64. data/ext/ca_obj_time.c +546 -0
  65. data/ext/ca_obj_timedelta.c +435 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +746 -0
  68. data/ext/ca_obj_unbound_repeat.c +208 -241
  69. data/ext/ca_obj_window.c +1131 -563
  70. data/ext/ca_op_byte_swap.c +175 -0
  71. data/ext/ca_op_ipower.c +319 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +430 -0
  75. data/ext/ca_sweep_engine.h +157 -0
  76. data/ext/ca_transform_common.c +228 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +795 -402
  80. data/ext/carray_access.c +831 -711
  81. data/ext/carray_attribute.c +98 -330
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +283 -0
  84. data/ext/carray_call_cfunc.c +1360 -828
  85. data/ext/carray_call_cfunc.h +160 -0
  86. data/ext/carray_cast.c +1212 -301
  87. data/ext/carray_cast_func.rb +81 -40
  88. data/ext/carray_class.c +53 -63
  89. data/ext/carray_config.h +28 -0
  90. data/ext/carray_conversion.c +350 -346
  91. data/ext/carray_copy.c +156 -268
  92. data/ext/carray_core.c +1342 -199
  93. data/ext/carray_count.c +312 -0
  94. data/ext/carray_data_type.c +43 -19
  95. data/ext/carray_element.c +585 -213
  96. data/ext/carray_factorize.c +2542 -0
  97. data/ext/carray_generate.c +230 -559
  98. data/ext/carray_histogram.c +490 -0
  99. data/ext/carray_hold.c +228 -0
  100. data/ext/carray_index_classifier.c +1035 -0
  101. data/ext/carray_index_classifier.h +27 -0
  102. data/ext/carray_internal.h +120 -0
  103. data/ext/carray_kernels_bincmp.c +4445 -0
  104. data/ext/carray_kernels_binop.c +10979 -0
  105. data/ext/carray_kernels_init.c +36 -0
  106. data/ext/carray_kernels_map.c +3466 -0
  107. data/ext/carray_kernels_moncmp.c +2096 -0
  108. data/ext/carray_kernels_monop.c +18312 -0
  109. data/ext/carray_kernels_reduce_aggregate.c +25836 -0
  110. data/ext/carray_kernels_reduce_boolean.c +329 -0
  111. data/ext/carray_kernels_reduce_cumulative.c +14592 -0
  112. data/ext/carray_kernels_reduce_extreme.c +16947 -0
  113. data/ext/carray_kernels_reduce_variance.c +3909 -0
  114. data/ext/carray_kernels_scan.c +3692 -0
  115. data/ext/carray_kernels_search.c +32137 -0
  116. data/ext/carray_kernels_sort.c +10625 -0
  117. data/ext/carray_kernels_triop.c +1391 -0
  118. data/ext/carray_lazy.c +567 -0
  119. data/ext/carray_loop.c +88 -200
  120. data/ext/carray_mask.c +848 -154
  121. data/ext/carray_math_kernel.h +120 -0
  122. data/ext/carray_mathfunc.c +10 -241
  123. data/ext/carray_median_percentile.c +1257 -0
  124. data/ext/carray_memory_view.c +1625 -0
  125. data/ext/carray_operator.c +1526 -318
  126. data/ext/carray_order.c +664 -1394
  127. data/ext/carray_partition.c +416 -0
  128. data/ext/carray_random.c +518 -0
  129. data/ext/carray_scatter.c +357 -0
  130. data/ext/carray_slab.c +1219 -0
  131. data/ext/carray_slab.h +84 -0
  132. data/ext/carray_sort.c +829 -0
  133. data/ext/carray_sort_kernel.c +620 -0
  134. data/ext/carray_struct.c +695 -0
  135. data/ext/carray_test.c +343 -229
  136. data/ext/carray_undef.c +34 -17
  137. data/ext/carray_utils.c +175 -74
  138. data/ext/extconf.rb +216 -55
  139. data/ext/mk_call_cfunc.rb +480 -0
  140. data/ext/mkkernel.rb +8842 -0
  141. data/ext/ruby_carray.c +202 -101
  142. data/ext/version.h +4 -14
  143. data/ext/version.rb +5 -13
  144. data/lib/carray/arrow_tensor.rb +401 -0
  145. data/lib/carray/attribute.rb +166 -0
  146. data/lib/carray/autoload_carray.rb +220 -0
  147. data/lib/carray/autoload_method_extension.rb +44 -0
  148. data/lib/carray/axis_group.rb +711 -0
  149. data/lib/carray/basics.rb +481 -0
  150. data/lib/carray/bincount_nd.rb +358 -0
  151. data/lib/carray/block_iterator.rb +604 -0
  152. data/lib/carray/boolean_reduce.rb +109 -0
  153. data/lib/carray/categorical.rb +561 -0
  154. data/lib/carray/categorical_iterator.rb +1062 -0
  155. data/lib/carray/complex.rb +150 -0
  156. data/lib/carray/conditional.rb +216 -0
  157. data/lib/carray/const_string.rb +228 -0
  158. data/lib/carray/construct.rb +139 -328
  159. data/lib/carray/core_extensions.rb +240 -0
  160. data/lib/carray/data_type_extension.rb +233 -0
  161. data/lib/carray/fixlen_string.rb +95 -0
  162. data/lib/carray/frame/concat.rb +132 -0
  163. data/lib/carray/frame/convert.rb +95 -0
  164. data/lib/carray/frame/csv_parser.rb +211 -0
  165. data/lib/carray/frame/frame.rb +649 -0
  166. data/lib/carray/frame/group.rb +186 -0
  167. data/lib/carray/frame/io.rb +164 -0
  168. data/lib/carray/frame/join.rb +248 -0
  169. data/lib/carray/frame/records.rb +99 -0
  170. data/lib/carray/frame/sort.rb +113 -0
  171. data/lib/carray/frame/verbs.rb +299 -0
  172. data/lib/carray/frame.rb +16 -0
  173. data/lib/carray/histogram.rb +512 -0
  174. data/lib/carray/inspect.rb +37 -20
  175. data/lib/carray/iterator.rb +57 -349
  176. data/lib/carray/lazy.rb +889 -0
  177. data/lib/carray/mask_gap_fill.rb +200 -0
  178. data/lib/carray/math.rb +78 -342
  179. data/lib/carray/meld_reduce.rb +289 -0
  180. data/lib/carray/methods/align_addr.rb +116 -0
  181. data/lib/carray/methods/bin.rb +128 -0
  182. data/lib/carray/methods/bincount.rb +87 -0
  183. data/lib/carray/methods/bit_string.rb +92 -0
  184. data/lib/carray/methods/broadcast.rb +63 -0
  185. data/lib/carray/methods/choose.rb +39 -0
  186. data/lib/carray/methods/composition.rb +280 -0
  187. data/lib/carray/methods/gather_nd.rb +206 -0
  188. data/lib/carray/methods/index.rb +39 -0
  189. data/lib/carray/methods/insert_block.rb +99 -0
  190. data/lib/carray/methods/is_in.rb +141 -0
  191. data/lib/carray/methods/join.rb +90 -0
  192. data/lib/carray/methods/locate_addr.rb +47 -0
  193. data/lib/carray/methods/mask_duplicates.rb +41 -0
  194. data/lib/carray/methods/meshgrid.rb +91 -0
  195. data/lib/carray/methods/mode.rb +126 -0
  196. data/lib/carray/methods/nunique.rb +46 -0
  197. data/lib/carray/methods/resize.rb +56 -0
  198. data/lib/carray/methods/snap.rb +156 -0
  199. data/lib/carray/methods/string_format.rb +57 -0
  200. data/lib/carray/methods/unique.rb +47 -0
  201. data/lib/carray/methods/value_counts.rb +71 -0
  202. data/lib/carray/mkmf.rb +124 -101
  203. data/lib/carray/runtime.rb +108 -0
  204. data/lib/carray/serialize.rb +478 -167
  205. data/lib/carray/slab_iterator.rb +292 -0
  206. data/lib/carray/stack.rb +291 -0
  207. data/lib/carray/string.rb +56 -180
  208. data/lib/carray/string_operation_extension.rb +289 -0
  209. data/lib/carray/struct.rb +335 -323
  210. data/lib/carray/struct_builder.rb +697 -0
  211. data/lib/carray/table.rb +41 -2
  212. data/lib/carray/time.rb +2255 -38
  213. data/lib/carray/window_iterator.rb +655 -0
  214. data/lib/carray.rb +55 -57
  215. metadata +163 -130
  216. data/Rakefile +0 -51
  217. data/TODO.md +0 -18
  218. data/ext/ca_iter_block.c +0 -257
  219. data/ext/ca_iter_dimension.c +0 -299
  220. data/ext/ca_iter_window.c +0 -214
  221. data/ext/ca_obj_mapping.c +0 -644
  222. data/ext/carray_iterator.c +0 -641
  223. data/ext/carray_math.rb +0 -850
  224. data/ext/carray_numeric.c +0 -259
  225. data/ext/carray_sort_addr.c +0 -254
  226. data/ext/carray_stat.c +0 -2100
  227. data/ext/carray_stat_proc.rb +0 -1999
  228. data/ext/mkmath.rb +0 -741
  229. data/ext/ruby_ccomplex.c +0 -509
  230. data/ext/ruby_float_func.c +0 -86
  231. data/lib/carray/array.rb +0 -8
  232. data/lib/carray/autoload/autoload_base.rb +0 -19
  233. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  234. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  235. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  236. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  237. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  238. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  239. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  240. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  241. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  242. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  243. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  244. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  245. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  246. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  247. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  248. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  249. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  250. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  251. data/lib/carray/autoload.rb +0 -141
  252. data/lib/carray/basic.rb +0 -191
  253. data/lib/carray/broadcast.rb +0 -101
  254. data/lib/carray/compose.rb +0 -315
  255. data/lib/carray/convert.rb +0 -115
  256. data/lib/carray/info.rb +0 -110
  257. data/lib/carray/io/imagemagick.rb +0 -235
  258. data/lib/carray/mask.rb +0 -102
  259. data/lib/carray/math/histogram.rb +0 -177
  260. data/lib/carray/math/recurrence.rb +0 -93
  261. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  262. data/lib/carray/object/ca_obj_link.rb +0 -50
  263. data/lib/carray/object/ca_obj_pack.rb +0 -99
  264. data/lib/carray/obsolete.rb +0 -256
  265. data/lib/carray/ordering.rb +0 -181
  266. data/lib/carray/testing.rb +0 -51
  267. data/lib/carray/transform.rb +0 -109
  268. data/misc/Methods.ja.md +0 -182
  269. data/misc/NOTE +0 -51
  270. data/spec/Classes/CABitfield_spec.rb +0 -58
  271. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  272. data/spec/Classes/CABlock_spec.rb +0 -205
  273. data/spec/Classes/CAField_spec.rb +0 -39
  274. data/spec/Classes/CAGrid_spec.rb +0 -75
  275. data/spec/Classes/CAMap_spec.rb +0 -0
  276. data/spec/Classes/CAMapping_spec.rb +0 -105
  277. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  278. data/spec/Classes/CAObject_spec.rb +0 -33
  279. data/spec/Classes/CARefer_spec.rb +0 -93
  280. data/spec/Classes/CARepeat_spec.rb +0 -65
  281. data/spec/Classes/CASelect_spec.rb +0 -22
  282. data/spec/Classes/CAShift_spec.rb +0 -16
  283. data/spec/Classes/CAStruct_spec.rb +0 -71
  284. data/spec/Classes/CATranspose_spec.rb +0 -60
  285. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  286. data/spec/Classes/CAWindow_spec.rb +0 -54
  287. data/spec/Classes/CAWrap_spec.rb +0 -8
  288. data/spec/Classes/CArray_spec.rb +0 -184
  289. data/spec/Classes/CScalar_spec.rb +0 -55
  290. data/spec/Classes/ex1.rb +0 -46
  291. data/spec/Features/feature_130_spec.rb +0 -19
  292. data/spec/Features/feature_attributes_spec.rb +0 -280
  293. data/spec/Features/feature_boolean_spec.rb +0 -98
  294. data/spec/Features/feature_broadcast.rb +0 -116
  295. data/spec/Features/feature_cast_function.rb +0 -19
  296. data/spec/Features/feature_cast_spec.rb +0 -33
  297. data/spec/Features/feature_class_spec.rb +0 -84
  298. data/spec/Features/feature_complex_spec.rb +0 -42
  299. data/spec/Features/feature_composite_spec.rb +0 -124
  300. data/spec/Features/feature_convert_spec.rb +0 -46
  301. data/spec/Features/feature_copy_spec.rb +0 -123
  302. data/spec/Features/feature_creation_spec.rb +0 -84
  303. data/spec/Features/feature_element_spec.rb +0 -144
  304. data/spec/Features/feature_extream_spec.rb +0 -54
  305. data/spec/Features/feature_generate_spec.rb +0 -74
  306. data/spec/Features/feature_index_spec.rb +0 -69
  307. data/spec/Features/feature_mask_spec.rb +0 -580
  308. data/spec/Features/feature_math_spec.rb +0 -97
  309. data/spec/Features/feature_order_spec.rb +0 -146
  310. data/spec/Features/feature_ref_store_spec.rb +0 -209
  311. data/spec/Features/feature_serialization_spec.rb +0 -125
  312. data/spec/Features/feature_stat_spec.rb +0 -397
  313. data/spec/Features/feature_virtual_spec.rb +0 -48
  314. data/spec/Features/method_eq_spec.rb +0 -81
  315. data/spec/Features/method_is_nan_spec.rb +0 -12
  316. data/spec/Features/method_map_spec.rb +0 -54
  317. data/spec/Features/method_max_with.rb +0 -20
  318. data/spec/Features/method_min_with.rb +0 -19
  319. data/spec/Features/method_ne_spec.rb +0 -18
  320. data/spec/Features/method_project_spec.rb +0 -188
  321. data/spec/Features/method_ref_spec.rb +0 -27
  322. data/spec/Features/method_round_spec.rb +0 -11
  323. data/spec/Features/method_s_linspace_spec.rb +0 -48
  324. data/spec/Features/method_s_span_spec.rb +0 -14
  325. data/spec/Features/method_seq_spec.rb +0 -47
  326. data/spec/Features/method_sort_with.rb +0 -43
  327. data/spec/Features/method_sorted_with.rb +0 -29
  328. data/spec/Features/method_span_spec.rb +0 -42
  329. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  330. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  331. data/spec/spec_all.rb +0 -10
  332. data/utils/ca_ase.rb +0 -21
  333. data/utils/ca_methods.rb +0 -15
  334. data/utils/cast_checker.rb +0 -30
  335. data/utils/convert_test.rb +0 -73
  336. data/utils/extract_yard.rb +0 -22
  337. data/utils/guess_shape.rb +0 -76
  338. data/utils/monkey_patch_methods.rb +0 -62
  339. data/utils/remove_resource_fork.sh +0 -5
data/ext/ca_obj_block.c CHANGED
@@ -1,22 +1,76 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ca_obj_block.c
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
3
+ CABlock: a CAStride view that exposes a rectangular sub-array of the
4
+ parent with per-axis start / step / count. Layout is the CAStride
5
+ prefix (dim, strides) plus a CABlock-specific tail (start, step,
6
+ count, size0) that captures the unstrided "what we slice from"
7
+ geometry needed so iterators can mutate start[] in place and so
8
+ create_mask can reconstruct an aligned mask block.
9
+
10
+ Storage owns 6 * ndim ca_size_t cells (dim + strides + start + step
11
+ + count + size0), allocated either through the pool framework
12
+ (single buffer via _pool) or, when the pool is not wired, through
13
+ six ALLOC_N calls in ca_block_setup. Both layouts give the same
14
+ byte total; the pool path is preferred and the ALLOC_N fallback
15
+ remains until all callsites are migrated.
8
16
 
9
17
  ---------------------------------------------------------------------------- */
10
18
 
11
19
  #include "carray.h"
20
+ #include "carray_internal.h" /* per-obj_type view constructors */
21
+
22
+ extern ca_operation_function_t ca_stride_func;
23
+
24
+ VALUE rb_cCABlock;
25
+ VALUE rb_cCABlockMask;
26
+
27
+ static ca_operation_function_t ca_block_func; /* filled at Init time */
28
+
29
+ static size_t
30
+ ca_block_dsize (const void *ap)
31
+ {
32
+ const CABlock *ca = (const CABlock *) ap;
33
+ return sizeof(CABlock) + 6 * ca->ndim * sizeof(ca_size_t);
34
+ }
35
+
36
+ /* Pool framework hooks for CABlock. Overrides the CAStride base
37
+ hooks: where CAStride owns 2*ndim cells (dim + strides), CABlock
38
+ owns 6*ndim (dim + strides + start + step + count + size0).
39
+ CAREFUL: the first 2*ndim slots must stay layout-compatible with
40
+ ca_stride_pool_init so the base ca_stride_setup pool branch finds
41
+ dim / strides at the same offsets. See
42
+ devel/PROPOSAL_CARRAY_POOL_STANDARDIZATION.md. */
43
+ static size_t
44
+ ca_block_pool_bytes (int8_t ndim)
45
+ {
46
+ ca_size_t n = (ndim > 0) ? ndim : 1;
47
+ return 6 * (size_t) n * sizeof(ca_size_t);
48
+ }
49
+
50
+ static void
51
+ ca_block_pool_init (void *ap, int8_t ndim)
52
+ {
53
+ CABlock *ca = (CABlock *) ap;
54
+ ca_size_t n = (ndim > 0) ? ndim : 1;
55
+ ca_size_t *base = (ca_size_t *) ca->_pool;
56
+ /* CAStride prefix (dim, strides) at offsets 0, n -- the offsets must
57
+ match ca_stride_pool_init exactly. */
58
+ ca->dim = base + 0 * n;
59
+ ca->strides = base + 1 * n;
60
+ /* CABlock tail (start, step, count, size0). */
61
+ ca->start = base + 2 * n;
62
+ ca->step = base + 3 * n;
63
+ ca->count = base + 4 * n;
64
+ ca->size0 = base + 5 * n;
65
+ }
12
66
 
13
67
  const rb_data_type_t cablock_data_type = {
14
- .parent = &cavirtual_data_type,
68
+ .parent = &castride_data_type,
15
69
  .wrap_struct_name = "CABlock",
16
70
  .function = {
17
71
  .dmark = ca_mark,
18
72
  .dfree = ca_free,
19
- .dsize = NULL,
73
+ .dsize = ca_block_dsize,
20
74
  .dcompact = NULL
21
75
  },
22
76
  .flags = RUBY_TYPED_FREE_IMMEDIATELY
@@ -28,281 +82,134 @@ const rb_data_type_t cablock_mask_data_type = {
28
82
  .function = {
29
83
  .dmark = NULL,
30
84
  .dfree = ca_free_nop,
31
- .dsize = NULL,
85
+ .dsize = ca_block_dsize,
32
86
  .dcompact = NULL
33
87
  },
34
88
  .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
89
  };
36
90
 
37
- VALUE rb_cCABlock;
38
- VALUE rb_cCABlockMask;
91
+ /* ------------------------------------------------------------------- */
92
+
93
+ /* Recompute base_offset from offset / start[] / size0[] / bytes.
94
+ Public because the per-cell iterators (CABlockIterator in
95
+ ext/ca_iter_block.c) mutate start[] in place between yields and
96
+ need to keep the CAStride prefix consistent with the new origin. */
97
+ void
98
+ ca_block_sync_base_offset (CABlock *cb)
99
+ {
100
+ ca_size_t n = cb->offset;
101
+ ca_size_t suffix = 1;
102
+ int8_t k;
103
+ for (k = cb->ndim - 1; k >= 0; k--) {
104
+ n += cb->start[k] * suffix;
105
+ suffix *= cb->size0[k];
106
+ }
107
+ cb->base_offset = n * cb->bytes;
108
+ }
39
109
 
40
- static int
110
+ int
41
111
  ca_block_setup (CABlock *ca, CArray *parent, int8_t ndim, ca_size_t *dim,
42
- ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
112
+ ca_size_t *start, ca_size_t *step, ca_size_t *count,
113
+ ca_size_t offset)
43
114
  {
44
- int8_t data_type;
45
- int8_t maxdim_index;
46
- ca_size_t maxdim_step, maxdim_step0;
47
- ca_size_t elements, bytes;
48
- int i;
49
-
50
- data_type = parent->data_type;
51
- bytes = parent->bytes;
52
-
53
- elements = 1;
54
- for (i=0; i<ndim; i++) {
55
- if ( count[i] < 0 ) {
115
+ ca_size_t strides[CA_RANK_MAX];
116
+ ca_size_t base_offset_elements;
117
+ ca_size_t suffix;
118
+ int8_t i;
119
+
120
+ for (i = 0; i < ndim; i++) {
121
+ if (count[i] < 0) {
56
122
  rb_raise(rb_eIndexError,
57
123
  "invalid size for %i-th dimension (negative)", i);
58
124
  }
59
- elements *= count[i];
60
125
  }
61
126
 
62
- maxdim_index = ndim-1;
63
- for (i=ndim-2; i>=0; i--) {
64
- if ( count[i] > count[maxdim_index] ) {
65
- maxdim_index = i;
66
- }
127
+ /* strides[k] = step[k] * Pi_{j>k} size0[j] * parent->bytes */
128
+ suffix = parent->bytes;
129
+ for (i = ndim - 1; i >= 0; i--) {
130
+ strides[i] = step[i] * suffix;
131
+ suffix *= dim[i]; /* dim is parent->dim here (= the block's size0) */
67
132
  }
68
133
 
69
- maxdim_step = 1;
70
- maxdim_step0 = step[maxdim_index];
71
- for (i=maxdim_index+1; i<ndim; i++) {
72
- maxdim_step *= count[i];
73
- maxdim_step0 *= dim[i];
134
+ /* base_offset (in parent elements) = offset + Sigma start[k] * Pi_{j>k} dim[j] */
135
+ base_offset_elements = offset;
136
+ {
137
+ ca_size_t s = 1;
138
+ for (i = ndim - 1; i >= 0; i--) {
139
+ base_offset_elements += start[i] * s;
140
+ s *= dim[i];
141
+ }
74
142
  }
75
143
 
76
- ca->obj_type = CA_OBJ_BLOCK;
77
- ca->data_type = data_type;
78
- ca->flags = 0;
79
- ca->ndim = ndim;
80
- ca->bytes = bytes;
81
- ca->elements = elements;
82
- ca->ptr = NULL;
83
- ca->mask = NULL;
84
- ca->parent = parent;
85
- ca->attach = 0;
86
- ca->nosync = 0;
87
- ca->offset = offset;
88
- ca->start = ALLOC_N(ca_size_t, ndim);
89
- ca->step = ALLOC_N(ca_size_t, ndim);
90
- ca->count = ALLOC_N(ca_size_t, ndim);
91
- ca->size0 = ALLOC_N(ca_size_t, ndim);
92
-
93
- ca->maxdim_index = maxdim_index;
94
- ca->maxdim_step = maxdim_step;
95
- ca->maxdim_step0 = maxdim_step0;
96
-
97
- /* printf("maxdim: %i %i %i\n", maxdim_index, maxdim_step, maxdim_step0); */
98
-
99
- ca->dim = ca->count; /* ca->dim should not be free */
144
+ /* CAREFUL: the CABlock tail (offset / start / step / count / size0)
145
+ must be filled BEFORE ca_stride_setup. ca_stride_setup may auto-
146
+ dispatch ca_create_mask when the parent has a mask, and
147
+ ca_block_func_create_mask reads those tail fields.
100
148
 
149
+ Pool path: start/step/count/size0 already point into _pool (wired
150
+ by ca_block_pool_init); only memcpy the values. Non-pool path:
151
+ ALLOC_N each first, then memcpy. */
152
+ ca->offset = offset;
153
+ if ( ! ca->_pool ) {
154
+ ca->start = ALLOC_N(ca_size_t, ndim);
155
+ ca->step = ALLOC_N(ca_size_t, ndim);
156
+ ca->count = ALLOC_N(ca_size_t, ndim);
157
+ ca->size0 = ALLOC_N(ca_size_t, ndim);
158
+ }
101
159
  memcpy(ca->start, start, ndim * sizeof(ca_size_t));
102
160
  memcpy(ca->step, step, ndim * sizeof(ca_size_t));
103
161
  memcpy(ca->count, count, ndim * sizeof(ca_size_t));
104
- memcpy(ca->size0, dim, ndim * sizeof(ca_size_t));
162
+ memcpy(ca->size0, dim, ndim * sizeof(ca_size_t));
105
163
 
106
- if ( ca_has_mask(parent) ) {
107
- ca_create_mask(ca);
108
- }
164
+ ca_stride_setup((CAStride *) ca, CA_OBJ_BLOCK, parent,
165
+ parent->data_type, parent->bytes,
166
+ ndim, count, strides,
167
+ base_offset_elements * parent->bytes);
109
168
 
110
169
  return 0;
111
170
  }
112
171
 
113
172
  CABlock *
114
173
  ca_block_new (CArray *parent, int8_t ndim, ca_size_t *dim,
115
- ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
174
+ ca_size_t *start, ca_size_t *step, ca_size_t *count,
175
+ ca_size_t offset)
116
176
  {
117
- CABlock *ca = ALLOC(CABlock);
177
+ CABlock *ca = (CABlock *) ca_array_alloc(CA_OBJ_BLOCK, ndim);
118
178
  ca_block_setup(ca, parent, ndim, dim, start, step, count, offset);
119
179
  return ca;
120
180
  }
121
181
 
182
+ /* CABlock-specific free_object: cleans up the mask, then frees all
183
+ six per-axis arrays. Pool path consolidates them into one
184
+ ca_array_free; non-pool path xfrees each individually. Wired into
185
+ ca_block_func at Init_ca_obj_block. */
122
186
  static void
123
187
  free_ca_block (void *ap)
124
188
  {
125
189
  CABlock *ca = (CABlock *) ap;
126
- if ( ca != NULL ) {
190
+ if (ca == NULL) return;
191
+ ca_free(ca->mask);
192
+ if (ca->_pool) {
193
+ ca_array_free(ca);
194
+ } else {
127
195
  xfree(ca->start);
128
196
  xfree(ca->step);
129
197
  xfree(ca->count);
130
198
  xfree(ca->size0);
131
- ca_free(ca->mask);
132
- /* free(ca->dim); */
199
+ xfree(ca->strides);
200
+ xfree(ca->dim);
133
201
  xfree(ca);
134
202
  }
135
203
  }
136
204
 
137
- static void ca_block_attach (CABlock *cb);
138
- static void ca_block_sync (CABlock *cb);
139
-
140
- /* ------------------------------------------------------------------- */
141
-
142
205
  static void *
143
206
  ca_block_func_clone (void *ap)
144
207
  {
145
208
  CABlock *ca = (CABlock *) ap;
146
- return ca_block_new(ca->parent,
147
- ca->ndim, ca->size0,
209
+ return ca_block_new(ca->parent, ca->ndim, ca->size0,
148
210
  ca->start, ca->step, ca->count, ca->offset);
149
211
  }
150
212
 
151
- static char *
152
- ca_block_func_ptr_at_index (void *ap, ca_size_t *idx) ;
153
-
154
- static char *
155
- ca_block_func_ptr_at_addr (void *ap, ca_size_t addr)
156
- {
157
- CABlock *ca = (CABlock *) ap;
158
- if ( ca->ptr ) {
159
- return ca->ptr + ca->bytes * addr;
160
- }
161
- else {
162
- ca_size_t idx[CA_RANK_MAX];
163
- ca_addr2index(ca, addr, idx);
164
- return ca_block_func_ptr_at_index(ca, idx);
165
- }
166
- }
167
-
168
- static char *
169
- ca_block_func_ptr_at_index (void *ap, ca_size_t *idx)
170
- {
171
- CABlock *ca = (CABlock *) ap;
172
-
173
- if ( ca->ptr ) {
174
- return ca_array_func_ptr_at_index(ca, idx);
175
- }
176
- else {
177
- ca_size_t *start = ca->start;
178
- ca_size_t *step = ca->step;
179
- ca_size_t *size0 = ca->size0;
180
- int8_t i;
181
- ca_size_t n;
182
- n = start[0] + idx[0]*step[0];
183
- for (i=1; i<ca->ndim; i++) {
184
- n *= size0[i];
185
- n += start[i] + idx[i]*step[i];
186
- }
187
- n += ca->offset;
188
- if ( ca->parent->ptr ) {
189
- return ca->parent->ptr + ca->bytes * n;
190
- }
191
- else {
192
- return ca_ptr_at_addr(ca->parent, n);
193
- }
194
- }
195
- }
196
-
197
- static void
198
- ca_block_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
199
- {
200
- CABlock *ca = (CABlock *) ap;
201
- ca_size_t *start = ca->start;
202
- ca_size_t *step = ca->step;
203
- ca_size_t *size0 = ca->size0;
204
- int8_t i;
205
- ca_size_t n;
206
- n = start[0] + idx[0]*step[0];
207
- for (i=1; i<ca->ndim; i++) {
208
- n *= size0[i];
209
- n += start[i] + idx[i]*step[i];
210
- }
211
- n += ca->offset;
212
- ca_fetch_addr(ca->parent, n, ptr);
213
- }
214
-
215
- static void
216
- ca_block_func_store_index (void *ap, ca_size_t *idx, void *ptr)
217
- {
218
- CABlock *ca = (CABlock *) ap;
219
- ca_size_t *start = ca->start;
220
- ca_size_t *step = ca->step;
221
- ca_size_t *size0 = ca->size0;
222
- int8_t i;
223
- ca_size_t n;
224
- n = start[0] + idx[0]*step[0];
225
- for (i=1; i<ca->ndim; i++) {
226
- n *= size0[i];
227
- n += start[i] + idx[i]*step[i];
228
- }
229
- n += ca->offset;
230
- ca_store_addr(ca->parent, n, ptr);
231
- }
232
-
233
- static void
234
- ca_block_func_allocate (void *ap)
235
- {
236
- CABlock *ca = (CABlock *) ap;
237
- ca_attach(ca->parent);
238
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
239
- ca->ptr = malloc_with_check(ca_length(ca));
240
- }
241
-
242
- static void
243
- ca_block_func_attach (void *ap)
244
- {
245
- CABlock *ca = (CABlock *) ap;
246
- ca_attach(ca->parent);
247
- /* ca->ptr = ALLOC_N(char, ca_length(ca)); */
248
- ca->ptr = malloc_with_check(ca_length(ca));
249
- ca_block_attach(ca);
250
- }
251
-
252
- static void
253
- ca_block_func_sync (void *ap)
254
- {
255
- CABlock *ca = (CABlock *) ap;
256
- ca_block_sync(ca);
257
- ca_sync(ca->parent);
258
- }
259
-
260
- static void
261
- ca_block_func_detach (void *ap)
262
- {
263
- CABlock *ca = (CABlock *) ap;
264
- free(ca->ptr);
265
- ca->ptr = NULL;
266
- ca_detach(ca->parent);
267
- }
268
-
269
- static void
270
- ca_block_func_copy_data (void *ap, void *ptr)
271
- {
272
- CABlock *ca = (CABlock *) ap;
273
- char *ptr0 = ca->ptr;
274
- ca_attach(ca->parent);
275
- ca->ptr = ptr;
276
- ca_block_attach(ca);
277
- ca->ptr = ptr0;
278
- ca_detach(ca->parent);
279
- }
280
-
281
- static void
282
- ca_block_func_sync_data (void *ap, void *ptr)
283
- {
284
- CABlock *ca = (CABlock *) ap;
285
- char *ptr0 = ca->ptr;
286
- ca_attach(ca->parent);
287
- ca->ptr = ptr;
288
- ca_block_sync(ca);
289
- ca->ptr = ptr0;
290
- ca_sync(ca->parent);
291
- ca_detach(ca->parent);
292
- }
293
-
294
- static void ca_block_fill (CABlock *ca, char *val);
295
-
296
- static void
297
- ca_block_func_fill_data (void *ap, void *ptr)
298
- {
299
- CABlock *ca = (CABlock *) ap;
300
- ca_attach(ca->parent);
301
- ca_block_fill(ca, ptr);
302
- ca_sync(ca->parent);
303
- ca_detach(ca->parent);
304
- }
305
-
306
213
  static void
307
214
  ca_block_func_create_mask (void *ap)
308
215
  {
@@ -314,32 +221,12 @@ ca_block_func_create_mask (void *ap)
314
221
  ca->start, ca->step, ca->count, ca->offset);
315
222
  }
316
223
 
317
- ca_operation_function_t ca_block_func = {
318
- CA_OBJ_BLOCK,
319
- CA_VIRTUAL_ARRAY,
320
- free_ca_block,
321
- ca_block_func_clone,
322
- ca_block_func_ptr_at_addr,
323
- ca_block_func_ptr_at_index,
324
- NULL,
325
- ca_block_func_fetch_index,
326
- NULL,
327
- ca_block_func_store_index,
328
- ca_block_func_allocate,
329
- ca_block_func_attach,
330
- ca_block_func_sync,
331
- ca_block_func_detach,
332
- ca_block_func_copy_data,
333
- ca_block_func_sync_data,
334
- ca_block_func_fill_data,
335
- ca_block_func_create_mask,
336
- };
337
-
338
224
  /* ------------------------------------------------------------------- */
339
225
 
340
226
  VALUE
341
227
  rb_ca_block_new (VALUE cary, int8_t ndim, ca_size_t *dim,
342
- ca_size_t *start, ca_size_t *step, ca_size_t *count, ca_size_t offset)
228
+ ca_size_t *start, ca_size_t *step, ca_size_t *count,
229
+ ca_size_t offset)
343
230
  {
344
231
  volatile VALUE obj;
345
232
  CArray *parent;
@@ -347,366 +234,14 @@ rb_ca_block_new (VALUE cary, int8_t ndim, ca_size_t *dim,
347
234
 
348
235
  rb_check_carray_object(cary);
349
236
  TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
237
+
350
238
  ca = ca_block_new(parent, ndim, dim, start, step, count, offset);
351
239
  obj = ca_wrap_struct(ca);
352
240
  rb_ca_set_parent(obj, cary);
353
- rb_ca_data_type_inherit(obj, cary);
354
- return obj;
355
- }
356
-
357
- /* ---------------------------------------------------------------------- */
358
-
359
- static void *mcopy_step (void *dest, const void *src,
360
- size_t bytes, size_t n, size_t dstep, size_t sstep);
361
-
362
- static void *mfill_step(void *dest,
363
- size_t bytes, size_t n, size_t dstep, const void *src);
364
-
365
- static void
366
- ca_block_attach_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
367
- {
368
- ca_size_t count = ca->count[level];
369
- ca_size_t addr, addr0, i;
370
-
371
- if ( level == ca->ndim - 1 ) {
372
- if ( ca->parent->ptr ) {
373
- addr = saddr * ca->dim[level];
374
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
375
- mcopy_step(ca_ptr_at_addr(ca, addr),
376
- ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
377
- ca->bytes, count, 1, ca->step[level]);
378
- }
379
- else {
380
- for (i=0; i<count; i++) {
381
- addr = saddr * ca->dim[level] + i;
382
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
383
- + i * ca->step[level];
384
- memcpy(ca_ptr_at_addr(ca, addr),
385
- ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
386
- ca->bytes);
387
- }
388
- }
389
- }
390
- else {
391
- for (i=0; i<count; i++) {
392
- addr = saddr * ca->dim[level] + i;
393
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
394
- + i * ca->step[level];
395
- ca_block_attach_loop2(ca, level+1, addr, addr0);
396
- }
397
- }
398
- }
399
241
 
400
- static void
401
- ca_block_attach_loop (CABlock *ca, ca_size_t level, ca_size_t saddr, ca_size_t saddr0)
402
- {
403
- ca_size_t count = ca->count[level];
404
- ca_size_t addr, addr0, i;
405
-
406
- if ( level == ca->ndim - 1 ) {
407
- if ( level == ca->maxdim_index ) {
408
- addr = saddr * ca->dim[level];
409
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
410
- mcopy_step(ca_ptr_at_addr(ca, addr),
411
- ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
412
- ca->bytes, count, 1, ca->step[level]);
413
- }
414
- else {
415
- char *p = ca_ptr_at_addr(ca, saddr* ca->dim[level]);
416
- char *q = ca_ptr_at_addr(ca->parent,
417
- saddr0*ca->size0[level]+ca->start[level]+ca->offset);
418
- ca_size_t pstep = ca->bytes;
419
- ca_size_t qstep = ca->bytes*ca->step[level];
420
- for (i=0; i<count; i++) {
421
- mcopy_step(p,
422
- q,
423
- ca->bytes, ca->count[ca->maxdim_index],
424
- ca->maxdim_step, ca->maxdim_step0);
425
- p += pstep;
426
- q += qstep;
427
- }
428
- }
429
- }
430
- else {
431
- if ( level == ca->maxdim_index ) {
432
- addr = saddr * ca->dim[level];
433
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
434
- ca_block_attach_loop(ca, level+1, addr, addr0);
435
- }
436
- else {
437
- for (i=0; i<count; i++) {
438
- addr = saddr * ca->dim[level] + i;
439
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
440
- + i * ca->step[level];
441
- ca_block_attach_loop(ca, level+1, addr, addr0);
442
- }
443
- }
444
- }
445
- }
446
-
447
- static void
448
- ca_block_attach (CABlock *ca)
449
- {
450
- ca_size_t addr = 0, addr0 = 0;
451
- if ( ca->ndim <= 2 ) {
452
- ca_block_attach_loop2(ca, 0, addr, addr0);
453
- }
454
- else {
455
- ca_block_attach_loop(ca, 0, addr, addr0);
456
- }
457
- }
458
-
459
- static void
460
- ca_block_sync_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
461
- {
462
- ca_size_t count = ca->count[level];
463
- ca_size_t addr, addr0, i;
464
-
465
- if ( level == ca->ndim - 1 ) {
466
- if ( ca->parent->ptr ) {
467
- addr = saddr * ca->dim[level];
468
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
469
- mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
470
- ca_ptr_at_addr(ca, addr),
471
- ca->bytes, count, ca->step[level], 1);
472
- }
473
- else {
474
- for (i=0; i<count; i++) {
475
- addr = saddr * ca->dim[level] + i;
476
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
477
- + i * ca->step[level];
478
- memcpy(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
479
- ca_ptr_at_addr(ca, addr),
480
- ca->bytes);
481
- }
482
- }
483
- }
484
- else {
485
- for (i=0; i<count; i++) {
486
- addr = saddr * ca->dim[level] + i;
487
- addr0 = saddr0 * ca->size0[level] + ca->start[level] + i * ca->step[level];
488
- ca_block_sync_loop2(ca, level+1, addr, addr0);
489
- }
490
- }
491
- }
492
-
493
- static void
494
- ca_block_sync_loop (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
495
- {
496
- ca_size_t count = ca->count[level];
497
- ca_size_t addr, addr0, i;
498
-
499
- if ( level == ca->ndim - 1 ) {
500
- if ( level == ca->maxdim_index ) {
501
- addr = saddr * ca->dim[level];
502
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
503
- mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
504
- ca_ptr_at_addr(ca, addr),
505
- ca->bytes, count, ca->step[level], 1);
506
- }
507
- else {
508
- for (i=0; i<count; i++) {
509
- addr = saddr * ca->dim[level] + i;
510
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
511
- + i * ca->step[level];
512
- mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
513
- ca_ptr_at_addr(ca, addr),
514
- ca->bytes, ca->count[ca->maxdim_index],
515
- ca->maxdim_step0, ca->maxdim_step);
516
- }
517
- }
518
- }
519
- else {
520
- if ( level == ca->maxdim_index ) {
521
- addr = saddr * ca->dim[level];
522
- addr0 = saddr0 * ca->size0[level] + ca->start[level];
523
- ca_block_sync_loop(ca, level+1, addr, addr0);
524
- }
525
- else {
526
- for (i=0; i<count; i++) {
527
- addr = saddr * ca->dim[level] + i;
528
- addr0 = saddr0 * ca->size0[level] + ca->start[level]
529
- + i * ca->step[level];
530
- ca_block_sync_loop(ca, level+1, addr, addr0);
531
- }
532
- }
533
- }
534
- }
535
-
536
- static void
537
- ca_block_sync (CABlock *cb)
538
- {
539
- ca_size_t addr = 0, addr0 = 0;
540
- if ( cb->ndim <= 2 ) {
541
- ca_block_sync_loop2(cb, 0, addr, addr0);
542
- }
543
- else {
544
- ca_block_sync_loop(cb, 0, addr, addr0);
545
- }
546
- }
547
-
548
- static void
549
- ca_block_fill_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
550
- {
551
- ca_size_t count = ca->count[level];
552
- ca_size_t addr, i;
553
- if ( level == ca->ndim - 1 ) {
554
- addr = saddr * ca->dim[level];
555
- mfill_step(ca_ptr_at_addr(ca, addr),
556
- ca->bytes, count, ca->step[level], val);
557
- }
558
- else {
559
- for (i=0; i<count; i++) {
560
- addr = saddr * ca->dim[level] + i;
561
- ca_block_fill_loop2(ca, level+1, addr, val);
562
- }
563
- }
564
- }
565
-
566
- static void
567
- ca_block_fill_loop (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
568
- {
569
- ca_size_t count = ca->count[level];
570
- ca_size_t addr, i;
571
- if ( level == ca->ndim - 1 ) {
572
- if ( level == ca->maxdim_index ) {
573
- addr = saddr * ca->dim[level];
574
- mfill_step(ca_ptr_at_addr(ca, addr),
575
- ca->bytes, count, ca->step[level], val);
576
- }
577
- else {
578
- for (i=0; i<count; i++) {
579
- addr = saddr * ca->dim[level] + i;
580
- mfill_step(ca_ptr_at_addr(ca, addr),
581
- ca->bytes, ca->count[ca->maxdim_index],
582
- ca->maxdim_step0, val);
583
- }
584
- }
585
-
586
- }
587
- else {
588
- if ( level == ca->maxdim_index ) {
589
- addr = saddr * ca->dim[level];
590
- ca_block_fill_loop(ca, level+1, addr, val);
591
- }
592
- else {
593
- for (i=0; i<count; i++) {
594
- addr = saddr * ca->dim[level] + i;
595
- ca_block_fill_loop(ca, level+1, addr, val);
596
- }
597
- }
598
-
599
- }
600
- }
601
-
602
- static void
603
- ca_block_fill (CABlock *ca, char *val)
604
- {
605
- ca_size_t addr = 0;
606
- if ( ca->ndim <= 2 ) {
607
- ca_block_fill_loop2(ca, 0, addr, val);
608
- }
609
- else {
610
- ca_block_fill_loop(ca, 0, addr, val);
611
- }
612
- }
613
-
614
- /* -------------------------------------------------------------------- */
615
-
616
- static void *
617
- mcopy_step (void *dest, const void *src,
618
- size_t bytes, size_t n, size_t dstep, size_t sstep)
619
- {
620
- if ( dstep == 1 && sstep == 1 ) {
621
- size_t bytelen = bytes * n;
622
- size_t words = bytelen / sizeof(int);
623
- size_t rests = bytelen % sizeof(int);
624
- int *sp = (int*) src;
625
- int *dp = (int*) dest;
626
- char *scp;
627
- char *dcp;
628
- ca_size_t i;
629
- for (i=words; i; i--) {
630
- *dp++ = *sp++;
631
- }
632
- scp = (char*)sp; dcp = (char*)dp;
633
- for (i=rests; i; i--) {
634
- *dcp++ = *scp++;
635
- }
636
- }
637
- else if ( dstep >= 1 || sstep >= 1 ) {
638
- switch ( bytes ) {
639
- case 1: {
640
- int8_t *sp = (int8_t*) src, *dp = (int8_t*) dest;
641
- while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
642
- break;
643
- }
644
- case 2: {
645
- int16_t *sp = (int16_t*) src, *dp = (int16_t*) dest;
646
- while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
647
- break;
648
- }
649
- case 4: {
650
- int32_t *sp = (int32_t*) src, *dp = (int32_t*) dest;
651
- while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
652
- break;
653
- }
654
- case 8: {
655
- double *sp = (double*) src, *dp = (double*) dest;
656
- while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
657
- break;
658
- }
659
- default: {
660
- char *sp = (char*) src, *dp = (char*) dest;
661
- while (n--) { memcpy(dp,sp,bytes); dp+=bytes*dstep; sp+=bytes*sstep; }
662
- break;
663
- }
664
- }
665
- }
666
-
667
- return dest;
668
- }
669
-
670
- static void *
671
- mfill_step(void *dest, size_t bytes, size_t n, size_t dstep, const void *src)
672
- {
673
- switch ( bytes ) {
674
- case 1: {
675
- int8_t *dp = (int8_t*) dest;
676
- int8_t v = *(int8_t*) src;
677
- while (n--) { *dp = v; dp+=dstep; }
678
- break;
679
- }
680
- case 2: {
681
- int16_t *dp = (int16_t*) dest;
682
- int16_t v = *(int16_t*) src;
683
- while (n--) { *dp = v; dp+=dstep; }
684
- break;
685
- }
686
- case 4: {
687
- int32_t *dp = (int32_t*) dest;
688
- int32_t v = *(int32_t*) src;
689
- while (n--) { *dp = v; dp+=dstep; }
690
- break;
691
- }
692
- case 8: {
693
- double *dp = (double*) dest;
694
- double v = *(double*) src;
695
- while (n--) { *dp = v; dp+=dstep; }
696
- break;
697
- }
698
- default: {
699
- char *sp = (char*) src, *dp = (char*) dest;
700
- while (n--) { memcpy(dp,sp,bytes); dp+=bytes*dstep; }
701
- break;
702
- }
703
- }
704
-
705
- return dest;
242
+ return obj;
706
243
  }
707
244
 
708
- /* ---------------------------------------------------------------------- */
709
-
710
245
  static VALUE
711
246
  rb_cb_s_allocate (VALUE klass)
712
247
  {
@@ -718,59 +253,42 @@ static VALUE
718
253
  rb_cb_initialize_copy (VALUE self, VALUE other)
719
254
  {
720
255
  CABlock *ca, *cs;
721
- ca_size_t shrink[CA_RANK_MAX];
722
- int8_t i;
723
-
724
256
  TypedData_Get_Struct(self, CABlock, &cablock_data_type, ca);
725
257
  TypedData_Get_Struct(other, CABlock, &cablock_data_type, cs);
726
-
727
- for (i=0; i<cs->ndim; i++) {
728
- shrink[i] = 0;
729
- }
730
-
731
- ca_block_setup(ca, cs->parent,
732
- cs->ndim, cs->size0, cs->start, cs->step, cs->count, cs->offset);
733
-
734
- /* CHECK ME : other.parent instead of other ? */
258
+ /* `self` was created by rb_cb_s_allocate (TypedData_Make_Struct) with
259
+ ca->_pool == NULL. Wire up the pool before ca_block_setup so the
260
+ tail-and-prefix branches in ca_block_setup / ca_stride_setup both
261
+ skip ALLOC_N. */
262
+ if ( ca_func[CA_OBJ_BLOCK].pool_init ) {
263
+ ca_array_pool_alloc(ca, CA_OBJ_BLOCK, cs->ndim);
264
+ }
265
+ ca_block_setup(ca, cs->parent, cs->ndim, cs->size0,
266
+ cs->start, cs->step, cs->count, cs->offset);
735
267
  rb_ca_set_parent(self, rb_ca_parent(other));
736
- rb_ca_data_type_inherit(self, rb_ca_parent(other));
737
-
738
268
  return self;
739
269
  }
740
270
 
741
- #define rb_cb_get_attr_ary(name) \
742
- rb_cb_## name (VALUE self) \
743
- { \
744
- volatile VALUE ary; \
745
- CABlock *cb; \
746
- int8_t i; \
747
- TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb); \
748
- ary = rb_ary_new2(cb->ndim); \
271
+ /* Per-axis accessor macro: defines a method that returns the named
272
+ CABlock tail array (size0 / start / step / count) as a Ruby Array.
273
+ `offset` is a single Integer and uses its own accessor below. */
274
+ #define rb_cb_get_attr_ary(name) \
275
+ rb_cb_ ## name (VALUE self) \
276
+ { \
277
+ volatile VALUE ary; \
278
+ CABlock *cb; \
279
+ int8_t i; \
280
+ TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb); \
281
+ ary = rb_ary_new2(cb->ndim); \
749
282
  for (i=0; i<cb->ndim; i++) { \
750
283
  rb_ary_store(ary, i, LONG2NUM(cb->name[i])); \
751
284
  } \
752
285
  return ary; \
753
286
  }
754
287
 
755
- /* @overload size0:
756
- class CABlock
757
- def size0
758
- end
759
- def start
760
- end
761
- def step
762
- end
763
- def count
764
- end
765
- def offset
766
- end
767
- end
768
- */
769
-
770
- static VALUE rb_cb_get_attr_ary(size0);
771
- static VALUE rb_cb_get_attr_ary(start);
772
- static VALUE rb_cb_get_attr_ary(step);
773
- static VALUE rb_cb_get_attr_ary(count);
288
+ static VALUE rb_cb_get_attr_ary(size0)
289
+ static VALUE rb_cb_get_attr_ary(start)
290
+ static VALUE rb_cb_get_attr_ary(step)
291
+ static VALUE rb_cb_get_attr_ary(count)
774
292
 
775
293
  static VALUE
776
294
  rb_cb_offset (VALUE self)
@@ -780,13 +298,10 @@ rb_cb_offset (VALUE self)
780
298
  return SIZE2NUM(cb->offset);
781
299
  }
782
300
 
783
- /* yard:
784
- class CABlock
785
- def idx2addr0 (idx)
786
- end
787
- end
788
- */
789
-
301
+ /* CABlock#idx2addr0(*idx) -- map a per-axis view index tuple to the
302
+ corresponding flat address into the parent (= "addr0").
303
+ Equivalent to following the start[] + step[] geometry; used to
304
+ project a view-local coordinate back onto the underlying buffer. */
790
305
  static VALUE
791
306
  rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
792
307
  {
@@ -797,7 +312,7 @@ rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
797
312
 
798
313
  TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
799
314
 
800
- if ( argc != cb->ndim ) {
315
+ if (argc != cb->ndim) {
801
316
  rb_raise(rb_eArgError,
802
317
  "invalid # of arguments (should be <%i>)", cb->ndim);
803
318
  }
@@ -812,13 +327,9 @@ rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
812
327
  return SIZE2NUM(addr + cb->offset);
813
328
  }
814
329
 
815
- /* yard:
816
- class CABlock
817
- def addr2addr0 (addr)
818
- end
819
- end
820
- */
821
-
330
+ /* CABlock#addr2addr0(addr) -- flat-address variant of idx2addr0: take
331
+ a view-local flat address, unravel it via ca_addr2index, and walk
332
+ start[]/step[] to the corresponding parent flat address. */
822
333
  static VALUE
823
334
  rb_cb_addr2addr0 (VALUE self, VALUE raddr)
824
335
  {
@@ -829,7 +340,7 @@ rb_cb_addr2addr0 (VALUE self, VALUE raddr)
829
340
 
830
341
  TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
831
342
 
832
- ca_addr2index((CArray*)cb, addr, idx);
343
+ ca_addr2index((CArray *) cb, addr, idx);
833
344
 
834
345
  addr = 0;
835
346
  for (i=0; i<cb->ndim; i++) {
@@ -840,53 +351,22 @@ rb_cb_addr2addr0 (VALUE self, VALUE raddr)
840
351
  return SIZE2NUM(addr + cb->offset);
841
352
  }
842
353
 
843
-
844
- /* yard:
845
- class CABlock
846
- def move (*index)
847
- end
848
- end
849
- */
850
-
851
- static VALUE
852
- rb_cb_move (int argc, VALUE *argv, VALUE self)
853
- {
854
- CABlock *cb;
855
- ca_size_t start;
856
- int8_t i;
857
-
858
- TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
859
-
860
- if ( argc != cb->ndim ) {
861
- rb_raise(rb_eArgError, "invalid # of arguments");
862
- }
863
-
864
- ca_update_mask(cb);
865
-
866
- for (i=0; i<cb->ndim; i++) {
867
- start = NUM2SIZE(argv[i]);
868
- if ( start < 0 ) {
869
- start += cb->size0[i];
870
- }
871
-
872
- if ( start < 0 || start + (cb->dim[i]-1) * cb->step[i] >= cb->size0[i] ) {
873
- rb_raise(rb_eArgError, "%i-th index out of range", i);
874
- }
875
-
876
- cb->start[i] = start;
877
-
878
- if ( cb->mask ) {
879
- ((CABlock*)(cb->mask))->start[i] = start;
880
- }
881
- }
882
-
883
- return self;
884
- }
885
-
886
354
  void
887
- Init_ca_obj_block ()
888
- {
889
- /* rb_cCABlock, CA_OBJ_BLOCK are defined in rb_carray.c */
355
+ Init_ca_obj_block (void)
356
+ {
357
+ /* rb_cCABlock and CA_OBJ_BLOCK are defined in ruby_carray.c /
358
+ carray_core.c; here we override the baseline ca_stride_func entry
359
+ with CABlock-specific free_object / clone / create_mask, plus the
360
+ pool hooks (6*ndim, sizeof(CABlock)) so ca_array_alloc reserves
361
+ room for the tail fields too. */
362
+ ca_block_func = ca_stride_func;
363
+ ca_block_func.free_object = free_ca_block;
364
+ ca_block_func.clone = ca_block_func_clone;
365
+ ca_block_func.create_mask = ca_block_func_create_mask;
366
+ ca_block_func.struct_size = sizeof(CABlock);
367
+ ca_block_func.pool_bytes = ca_block_pool_bytes;
368
+ ca_block_func.pool_init = ca_block_pool_init;
369
+ ca_func[CA_OBJ_BLOCK] = ca_block_func;
890
370
 
891
371
  rb_define_const(rb_cObject, "CA_OBJ_BLOCK", INT2NUM(CA_OBJ_BLOCK));
892
372
 
@@ -899,8 +379,6 @@ Init_ca_obj_block ()
899
379
  rb_define_method(rb_cCABlock, "count", rb_cb_count, 0);
900
380
  rb_define_method(rb_cCABlock, "offset", rb_cb_offset, 0);
901
381
 
902
- rb_define_method(rb_cCABlock, "move", rb_cb_move, -1);
903
-
904
382
  rb_define_method(rb_cCABlock, "idx2addr0", rb_cb_idx2addr0, -1);
905
383
  rb_define_method(rb_cCABlock, "index2addr0", rb_cb_idx2addr0, -1);
906
384
  rb_define_method(rb_cCABlock, "addr2addr0", rb_cb_addr2addr0, 1);