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/ruby_carray.c CHANGED
@@ -1,10 +1,15 @@
1
1
  /* ---------------------------------------------------------------------------
2
2
 
3
- ruby_carray.c
3
+ Single entry point Init_carray_ext: declares the CArray class
4
+ hierarchy + exception class + CA module, populates top-level
5
+ constants (CA_RANK_MAX / CA_NIL / CA_* data_type Symbols / alignment
6
+ values), then drives the per-module Init_* sequence in load order.
4
7
 
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
8
+ CAREFUL: the Init_* call order below carries real ordering
9
+ invariants in several places (e.g. CAStride before its subclasses,
10
+ ca_op_ipower before mask_fast_paths, ca_face before its concrete
11
+ Faces, lazy before monop). Each load-bearing edge is annotated at
12
+ the callsite; do not reorder without reading those notes.
8
13
 
9
14
  ---------------------------------------------------------------------------- */
10
15
 
@@ -14,15 +19,15 @@
14
19
  #ifdef HAVE_RB_ARITHMETIC_SEQUENCE_EXTRACT
15
20
  VALUE rb_cArithSeq;
16
21
  #endif
22
+
23
+ /* Form-only base of the 3.0 iterator family (defined in Init_carray_ext). */
24
+ VALUE rb_cCAIterator;
17
25
 
18
26
  VALUE rb_eCADataTypeError;
19
27
  VALUE rb_mCA;
20
28
 
21
29
  VALUE CA_NIL;
22
30
 
23
- void Init_ccomplex ();
24
- void Init_numeric_float_function ();
25
-
26
31
  void Init_carray_core ();
27
32
  void Init_carray_undef ();
28
33
  void Init_carray_class ();
@@ -31,51 +36,93 @@ void Init_carray_test ();
31
36
  void Init_carray_attribute ();
32
37
  void Init_carray_loop ();
33
38
  void Init_carray_mask ();
39
+ void Init_carray_hold ();
40
+ void Init_carray_mask_fast_paths (); /* patches generated bit-op tables;
41
+ must run AFTER Init_ca_op_ipower */
34
42
  void Init_carray_access ();
43
+ void Init_carray_index_classifier ();
35
44
  void Init_carray_element ();
36
- void Init_carray_iterator ();
45
+ void Init_carray_scatter (); /* scatter_*! family */
46
+ void Init_ca_axis_group (); /* devel/MEMO_AXIS_GROUP.md — axis-group reduction kernel */
47
+ void Init_ca_group_iter (); /* devel/MEMO_AXIS_GROUP.md — axis-group [] surface */
48
+ void Init_carray_bincount (); /* bincount dedicated kernel */
49
+ void Init_carray_factorize (); /* single-pass integer factorization for categorize */
50
+ void Init_carray_histogram (); /* histogram + histbin_ki */
51
+ void Init_ca_categorical_iterator (); /* CACategoricalIterator counting-sort scatter */
37
52
  void Init_carray_operator ();
38
- void Init_carray_numeric ();
39
- void Init_carray_math ();
53
+ void Init_ca_op_ipower ();
40
54
  void Init_carray_utils ();
41
55
  void Init_carray_order ();
42
- void Init_carray_sort_addr ();
43
- void Init_carray_stat ();
44
- void Init_carray_stat_proc ();
56
+ void Init_carray_partition (); /* partition / partition_copy */
57
+ void Init_carray_median_percentile (); /* median / percentile / quantile */
58
+ void Init_carray_sort (); /* sort / sort_copy / sort_addr / axis2addr */
59
+ void Init_carray_count ();
60
+ void Init_carray_kernels (); /* mkkernel-generated: reductions + maps */
45
61
  void Init_carray_utils ();
46
62
  void Init_carray_generate ();
47
63
  void Init_carray_copy ();
48
64
  void Init_carray_conversion ();
49
65
  void Init_carray_cast ();
66
+ void Init_carray_broadcast ();
50
67
 
51
68
  void Init_ca_obj_array ();
52
69
  void Init_ca_obj_refer ();
53
70
  void Init_ca_obj_farray ();
54
71
  void Init_ca_obj_block ();
55
72
  void Init_ca_obj_select ();
73
+ void Init_ca_obj_select_axis ();
56
74
  void Init_ca_obj_object ();
57
75
  void Init_ca_obj_grid ();
58
76
  void Init_ca_obj_window ();
59
77
  void Init_ca_obj_shift ();
78
+ void Init_ca_obj_tile ();
79
+ void Init_ca_obj_roll ();
80
+ void Init_ca_obj_stack (); /* multi-parent outer-axis stack */
81
+ void Init_ca_obj_meld (); /* multi-parent ragged concat along existing axis */
60
82
  void Init_ca_obj_transpose ();
61
- void Init_ca_obj_mapping ();
62
83
  void Init_ca_obj_repeat ();
63
84
  void Init_ca_obj_unbound_repeat ();
64
85
  void Init_ca_obj_reduce ();
65
86
  void Init_ca_obj_field ();
66
87
  void Init_ca_obj_fake ();
88
+ void Init_ca_obj_byte_swap ();
89
+ void Init_ca_face (); /* CAFace abstract base; must precede CATime / CATimedelta / CARecord / CAConstString */
90
+ void Init_ca_source (); /* CASource abstract base; concrete sources live in C extensions */
91
+ void Init_ca_obj_time (); /* first numeric Face */
92
+ void Init_ca_obj_timedelta (); /* CATime sibling */
93
+ void Init_ca_obj_record (); /* composite Face for CAStruct backing */
94
+ void Init_ca_obj_const_string ();/* read-only variable-length string Face */
95
+ void Init_ca_obj_string (); /* mutable string Face over CA_OBJECT storage */
96
+ void Init_ca_obj_fixlen_string ();/* string Face over CA_FIXLEN storage */
67
97
  void Init_ca_obj_bitarray ();
68
98
  void Init_ca_obj_bitfield ();
69
-
70
- void Init_carray_iterator ();
71
- void Init_ca_iter_dimension ();
72
- void Init_ca_iter_block ();
73
- void Init_ca_iter_window ();
99
+ void Init_ca_obj_stride ();
100
+ void Init_ca_obj_remap (); /* internal-only (no Ruby surface) */
101
+ void Init_carray_lazy (); /* CALazyMarker; must precede Init_ca_obj_monop / _binop / _moncmp / _bincmp */
102
+ void Init_ca_obj_monop (); /* CAMonOp + lazy elementwise monadic dispatch */
103
+ void Init_ca_obj_binop (); /* CABinOp + lazy elementwise binary dispatch */
104
+ void Init_ca_obj_triop (); /* CATriOp + lazy elementwise triadic dispatch */
105
+ void Init_ca_obj_bincmp (); /* CABinCmp + lazy elementwise comparison dispatch */
106
+ void Init_ca_obj_moncmp (); /* CAMonCmp + lazy elementwise predicate dispatch */
107
+
108
+ /* Init_carray_iterator retired; CAIterator is a form-only base defined inline
109
+ in Init_carray_ext (accessors in lib/carray/iterator.rb). The 2.0 C engines
110
+ (dimension / window / block iterators) live at samples/caiterator/. */
74
111
 
75
112
  void Init_carray_mathfunc ();
76
113
 
114
+ void Init_carray_memory_view ();
115
+
116
+ void Init_carray_struct ();
117
+
118
+ void Init_carray_random ();
119
+
120
+ void Init_ca_kernel_iterator ();
121
+
122
+ void Init_carray_slab ();
123
+
77
124
  void
78
- Init_carray_ext ()
125
+ Init_carray_ext (void)
79
126
  {
80
127
 
81
128
  #ifdef HAVE_RB_EXT_RACTOR_SAFE
@@ -93,17 +140,26 @@ Init_carray_ext ()
93
140
  rb_cCArray = rb_define_class("CArray", rb_cObject);
94
141
  rb_cCAWrap = rb_define_class("CAWrap", rb_cCArray);
95
142
  rb_cCScalar = rb_define_class("CScalar", rb_cCArray);
96
- rb_cCAVirtual = rb_define_class("CAVirtual", rb_cCArray);
97
- rb_cCARefer = rb_define_class("CARefer", rb_cCAVirtual);
98
- rb_cCABlock = rb_define_class("CABlock", rb_cCAVirtual);
99
- rb_cCASelect = rb_define_class("CASelect", rb_cCAVirtual);
100
- rb_cCAObject = rb_define_class("CAObject", rb_cCAVirtual);
101
- rb_cCARepeat = rb_define_class("CARepeat", rb_cCAVirtual);
102
- rb_cCAUnboundRepeat = rb_define_class("CAUnboundRepeat", rb_cCAVirtual);
143
+ rb_cCAView = rb_define_class("CAView", rb_cCArray);
144
+ /* CAREFUL: CAStride must exist before its subclasses (CARefer /
145
+ CABlock / CAField / CARepeat / CAUnboundRepeat / CATranspose /
146
+ CAFarray) are defined or registered. See devel/CAStride.md. */
147
+ rb_cCAStride = rb_define_class("CAStride", rb_cCAView);
148
+ rb_cCARefer = rb_define_class("CARefer", rb_cCAStride);
149
+ rb_cCABlock = rb_define_class("CABlock", rb_cCAStride);
150
+ rb_cCAField = rb_define_class("CAField", rb_cCAStride);
151
+ rb_cCASelect = rb_define_class("CASelect", rb_cCAView);
152
+ rb_cCAObject = rb_define_class("CAObject", rb_cCAView);
153
+ rb_cCARepeat = rb_define_class("CARepeat", rb_cCAStride);
154
+ /* CAUnboundRepeat: a CAStride with stride-0 axes on each `*` position
155
+ and sized (matching parent) on each nil position. */
156
+ rb_cCAUnboundRepeat = rb_define_class("CAUnboundRepeat", rb_cCAStride);
103
157
 
104
158
  rb_cCArrayMask = rb_define_class("CArrayMask", rb_cCArray);
159
+ rb_cCAStrideMask = rb_define_class("CAStrideMask", rb_cCAStride);
105
160
  rb_cCAReferMask = rb_define_class("CAReferMask", rb_cCARefer);
106
161
  rb_cCABlockMask = rb_define_class("CABlockMask", rb_cCABlock);
162
+ rb_cCAFieldMask = rb_define_class("CAFieldMask", rb_cCAField);
107
163
  rb_cCASelectMask = rb_define_class("CASelectMask", rb_cCASelect);
108
164
  rb_cCARepeatMask = rb_define_class("CARepeatMask", rb_cCARepeat);
109
165
  rb_cCAUnboundRepeatMask = rb_define_class("CAUnboundRepeatMask", rb_cCAUnboundRepeat);
@@ -113,43 +169,18 @@ Init_carray_ext ()
113
169
  rb_eCADataTypeError =
114
170
  rb_define_class_under(rb_cCArray, "DataTypeError", rb_eStandardError);
115
171
 
116
- /* yard:
117
- class CArray::DataTypeError # :nodoc:
118
- end
119
- */
120
-
121
- /* -- CA module -- */
122
- /* a namespace for misc utilities related with CArray */
172
+ /* -- CA module -- namespace for misc utilities related to CArray */
123
173
 
124
174
  rb_mCA = rb_define_module("CA");
125
175
 
126
- /* CArray constants */
127
-
128
176
  /* -- version -- */
129
177
 
130
- /* yard:
131
- class CArray
132
- VERSION = nil # :nodoc:
133
- VERSION_CODE = nil # :nodoc:
134
- VERSION_MAJOR = nil # :nodoc:
135
- VERSION_MINOR = nil # :nodoc:
136
- VERSION_TEENY = nil # :nodoc:
137
- VERSION_DATE = nil # :nodoc:
138
- end
139
- */
140
-
141
- /* @private */
142
- rb_define_const(rb_cCArray, "VERSION", rb_str_new2(CA_VERSION));
143
- /* @private */
144
- rb_define_const(rb_cCArray, "VERSION_CODE", INT2NUM(CA_VERSION_CODE));
145
- /* @private */
178
+ rb_define_const(rb_cCArray, "VERSION", rb_str_new2(CA_VERSION));
179
+ rb_define_const(rb_cCArray, "VERSION_CODE", INT2NUM(CA_VERSION_CODE));
146
180
  rb_define_const(rb_cCArray, "VERSION_MAJOR", INT2NUM(CA_VERSION_MAJOR));
147
- /* @private */
148
181
  rb_define_const(rb_cCArray, "VERSION_MINOR", INT2NUM(CA_VERSION_MINOR));
149
- /* @private */
150
182
  rb_define_const(rb_cCArray, "VERSION_TEENY", INT2NUM(CA_VERSION_TEENY));
151
- /* @private */
152
- rb_define_const(rb_cCArray, "VERSION_DATE", rb_str_new2(CA_VERSION_DATE));
183
+ rb_define_const(rb_cCArray, "VERSION_DATE", rb_str_new2(CA_VERSION_DATE));
153
184
 
154
185
  /* -- system -- */
155
186
  rb_define_const(rb_cObject, "CA_RANK_MAX", INT2NUM(CA_RANK_MAX));
@@ -166,32 +197,53 @@ Init_carray_ext ()
166
197
 
167
198
  /* -- data types -- */
168
199
 
169
- rb_define_const(rb_cObject, "CA_FIXLEN", INT2NUM(CA_FIXLEN));
170
- rb_define_const(rb_cObject, "CA_BOOLEAN", INT2NUM(CA_BOOLEAN));
171
- rb_define_const(rb_cObject, "CA_INT8", INT2NUM(CA_INT8));
172
- rb_define_const(rb_cObject, "CA_UINT8", INT2NUM(CA_UINT8));
173
- rb_define_const(rb_cObject, "CA_INT16", INT2NUM(CA_INT16));
174
- rb_define_const(rb_cObject, "CA_UINT16", INT2NUM(CA_UINT16));
175
- rb_define_const(rb_cObject, "CA_INT32", INT2NUM(CA_INT32));
176
- rb_define_const(rb_cObject, "CA_UINT32", INT2NUM(CA_UINT32));
177
- rb_define_const(rb_cObject, "CA_INT64", INT2NUM(CA_INT64));
178
- rb_define_const(rb_cObject, "CA_UINT64", INT2NUM(CA_UINT64));
179
- rb_define_const(rb_cObject, "CA_FLOAT32", INT2NUM(CA_FLOAT32));
180
- rb_define_const(rb_cObject, "CA_FLOAT64", INT2NUM(CA_FLOAT64));
181
- rb_define_const(rb_cObject, "CA_FLOAT128", INT2NUM(CA_FLOAT128));
182
- rb_define_const(rb_cObject, "CA_CMPLX64", INT2NUM(CA_CMPLX64));
183
- rb_define_const(rb_cObject, "CA_CMPLX128", INT2NUM(CA_CMPLX128));
184
- rb_define_const(rb_cObject, "CA_CMPLX256", INT2NUM(CA_CMPLX256));
185
- rb_define_const(rb_cObject, "CA_OBJECT", INT2NUM(CA_OBJECT));
186
-
187
- rb_define_const(rb_cObject, "CA_BYTE", INT2NUM(CA_BYTE));
188
- rb_define_const(rb_cObject, "CA_SHORT", INT2NUM(CA_INT16));
189
- rb_define_const(rb_cObject, "CA_INT", INT2NUM(CA_INT32));
190
- rb_define_const(rb_cObject, "CA_FLOAT", INT2NUM(CA_FLOAT));
191
- rb_define_const(rb_cObject, "CA_DOUBLE", INT2NUM(CA_DOUBLE));
192
- rb_define_const(rb_cObject, "CA_COMPLEX", INT2NUM(CA_COMPLEX));
193
- rb_define_const(rb_cObject, "CA_DCOMPLEX", INT2NUM(CA_DCOMPLEX));
194
- rb_define_const(rb_cObject, "CA_SIZE", INT2NUM(CA_SIZE));
200
+ /* CAREFUL: precompute the Symbol ID cache for the ca.data_type
201
+ accessor BEFORE the CA_* data_type constants below are defined —
202
+ they read from ca_data_type_sym[]. */
203
+ {
204
+ int i;
205
+ for ( i = 0; i < CA_NTYPE; i++ ) {
206
+ if ( ca_type_name[i] != NULL ) {
207
+ ca_data_type_sym[i] = rb_intern(ca_type_name[i]);
208
+ }
209
+ else {
210
+ ca_data_type_sym[i] = rb_intern("");
211
+ }
212
+ }
213
+ }
214
+
215
+ /* The Ruby-surface CA_* data_type constants are Symbols (the C
216
+ internal `#define CA_INT64 8` etc. is unchanged); both sides flip
217
+ to Symbol together so `case when CA_INT64` over `ca.data_type`
218
+ stays transparent. Alias constants (CA_DOUBLE etc.) share the
219
+ canonical Symbol via Symbol identity, so `CA_DOUBLE ==
220
+ CA_FLOAT64` evaluates true. */
221
+
222
+ rb_define_const(rb_cObject, "CA_FIXLEN", ID2SYM(ca_data_type_sym[CA_FIXLEN]));
223
+ rb_define_const(rb_cObject, "CA_BOOLEAN", ID2SYM(ca_data_type_sym[CA_BOOLEAN]));
224
+ rb_define_const(rb_cObject, "CA_INT8", ID2SYM(ca_data_type_sym[CA_INT8]));
225
+ rb_define_const(rb_cObject, "CA_UINT8", ID2SYM(ca_data_type_sym[CA_UINT8]));
226
+ rb_define_const(rb_cObject, "CA_INT16", ID2SYM(ca_data_type_sym[CA_INT16]));
227
+ rb_define_const(rb_cObject, "CA_UINT16", ID2SYM(ca_data_type_sym[CA_UINT16]));
228
+ rb_define_const(rb_cObject, "CA_INT32", ID2SYM(ca_data_type_sym[CA_INT32]));
229
+ rb_define_const(rb_cObject, "CA_UINT32", ID2SYM(ca_data_type_sym[CA_UINT32]));
230
+ rb_define_const(rb_cObject, "CA_INT64", ID2SYM(ca_data_type_sym[CA_INT64]));
231
+ rb_define_const(rb_cObject, "CA_UINT64", ID2SYM(ca_data_type_sym[CA_UINT64]));
232
+ rb_define_const(rb_cObject, "CA_FLOAT32", ID2SYM(ca_data_type_sym[CA_FLOAT32]));
233
+ rb_define_const(rb_cObject, "CA_FLOAT64", ID2SYM(ca_data_type_sym[CA_FLOAT64]));
234
+ rb_define_const(rb_cObject, "CA_CMPLX64", ID2SYM(ca_data_type_sym[CA_CMPLX64]));
235
+ rb_define_const(rb_cObject, "CA_CMPLX128", ID2SYM(ca_data_type_sym[CA_CMPLX128]));
236
+ rb_define_const(rb_cObject, "CA_OBJECT", ID2SYM(ca_data_type_sym[CA_OBJECT]));
237
+
238
+ /* Aliases share the canonical Symbol: CA_BYTE == CA_UINT8, etc. */
239
+ rb_define_const(rb_cObject, "CA_BYTE", ID2SYM(ca_data_type_sym[CA_BYTE]));
240
+ rb_define_const(rb_cObject, "CA_SHORT", ID2SYM(ca_data_type_sym[CA_INT16]));
241
+ rb_define_const(rb_cObject, "CA_INT", ID2SYM(ca_data_type_sym[CA_INT32]));
242
+ rb_define_const(rb_cObject, "CA_FLOAT", ID2SYM(ca_data_type_sym[CA_FLOAT]));
243
+ rb_define_const(rb_cObject, "CA_DOUBLE", ID2SYM(ca_data_type_sym[CA_DOUBLE]));
244
+ rb_define_const(rb_cObject, "CA_COMPLEX", ID2SYM(ca_data_type_sym[CA_COMPLEX]));
245
+ rb_define_const(rb_cObject, "CA_DCOMPLEX", ID2SYM(ca_data_type_sym[CA_DCOMPLEX]));
246
+ rb_define_const(rb_cObject, "CA_SIZE", ID2SYM(ca_data_type_sym[CA_SIZE]));
195
247
 
196
248
  rb_define_const(rb_cObject, "CA_ALIGN_VOIDP", INT2NUM(CA_ALIGN_VOIDP));
197
249
  rb_define_const(rb_cObject, "CA_ALIGN_FIXLEN", INT2NUM(CA_ALIGN_INT8));
@@ -202,38 +254,44 @@ Init_carray_ext ()
202
254
  rb_define_const(rb_cObject, "CA_ALIGN_INT64", INT2NUM(CA_ALIGN_INT64));
203
255
  rb_define_const(rb_cObject, "CA_ALIGN_FLOAT32", INT2NUM(CA_ALIGN_FLOAT32));
204
256
  rb_define_const(rb_cObject, "CA_ALIGN_FLOAT64", INT2NUM(CA_ALIGN_FLOAT64));
205
- rb_define_const(rb_cObject, "CA_ALIGN_FLOAT128", INT2NUM(CA_ALIGN_FLOAT128));
206
257
  rb_define_const(rb_cObject, "CA_ALIGN_CMPLX64", INT2NUM(CA_ALIGN_CMPLX64));
207
258
  rb_define_const(rb_cObject, "CA_ALIGN_CMPLX128", INT2NUM(CA_ALIGN_CMPLX128));
208
- rb_define_const(rb_cObject, "CA_ALIGN_CMPLX256", INT2NUM(CA_ALIGN_CMPLX256));
209
259
  rb_define_const(rb_cObject, "CA_ALIGN_OBJECT", INT2NUM(CA_ALIGN_OBJECT));
210
260
 
211
261
  /* load modules in external files */
212
262
 
213
263
  Init_carray_core(); /* Init_carray_core should be called first*/
214
264
 
215
- #ifdef HAVE_COMPLEX_H
216
- Init_ccomplex();
217
- #endif
218
-
219
- Init_numeric_float_function();
220
-
221
265
  Init_carray_class();
222
266
  Init_carray_data_type();
223
267
  Init_carray_test();
224
268
  Init_carray_attribute();
225
269
  Init_carray_undef();
226
270
  Init_carray_mask();
271
+ Init_carray_hold();
227
272
  Init_carray_loop();
228
273
  Init_carray_access();
274
+ Init_carray_index_classifier();
229
275
  Init_carray_element();
276
+ Init_carray_scatter();
277
+ Init_ca_axis_group(); /* devel/MEMO_AXIS_GROUP.md — axis-group reduction kernel */
278
+ Init_carray_bincount();
279
+ Init_carray_factorize();
280
+ Init_carray_histogram();
281
+ Init_ca_categorical_iterator();
230
282
  Init_carray_operator();
231
- Init_carray_math(); /* order of math, numeric should not be changed */
232
- Init_carray_numeric(); /* order of math, numeric should not be changed */
283
+ Init_ca_op_ipower(); /* CArray#pow / pow! + ipower fast path.
284
+ CAREFUL: must precede the numeric init
285
+ block that follows. */
286
+ Init_carray_mask_fast_paths(); /* patches bit-op tables for boolean8_t;
287
+ must run AFTER Init_ca_op_ipower
288
+ (which sets up the tables). */
233
289
  Init_carray_order();
234
- Init_carray_sort_addr();
235
- Init_carray_stat();
236
- Init_carray_stat_proc();
290
+ Init_carray_partition(); /* partition / partition_copy */
291
+ Init_carray_median_percentile(); /* needs partition_copy_c from carray_partition */
292
+ Init_carray_sort(); /* sort / sort_copy / sort_addr / axis2addr */
293
+ Init_carray_count();
294
+ Init_carray_kernels(); /* mkkernel-generated: reductions + maps */
237
295
 
238
296
  Init_carray_utils();
239
297
 
@@ -241,34 +299,77 @@ Init_carray_ext ()
241
299
  Init_carray_copy();
242
300
  Init_carray_conversion();
243
301
  Init_carray_cast();
302
+ Init_carray_broadcast();
244
303
 
245
304
  Init_ca_obj_array();
246
305
  Init_ca_obj_refer();
306
+ Init_ca_obj_stride(); /* CAREFUL: must precede CAStride subclasses
307
+ (farray / block / transpose / repeat /
308
+ unbound_repeat / field). */
247
309
  Init_ca_obj_farray();
248
310
  Init_ca_obj_block();
249
311
  Init_ca_obj_select();
312
+ Init_ca_obj_select_axis();
250
313
  Init_ca_obj_object();
251
314
  Init_ca_obj_grid();
252
315
  Init_ca_obj_window();
253
316
  Init_ca_obj_shift();
317
+ Init_ca_obj_tile();
318
+ Init_ca_obj_roll(); /* depends on tile */
319
+ Init_ca_obj_stack();
320
+ Init_ca_obj_meld();
254
321
  Init_ca_obj_transpose();
255
- Init_ca_obj_mapping();
256
322
  Init_ca_obj_repeat();
257
323
  Init_ca_obj_unbound_repeat();
258
324
  Init_ca_obj_reduce();
259
325
  Init_ca_obj_field();
260
326
  Init_ca_obj_fake();
327
+ Init_ca_obj_byte_swap();
328
+ Init_ca_source(); /* CASource: abstract, no obj_type of its own.
329
+ Concrete sources are registered by C
330
+ extensions via ca_install_obj_type. */
331
+ Init_ca_face(); /* CAREFUL: must precede every concrete Face
332
+ (datetime / timedelta / record /
333
+ const_string). */
334
+ Init_ca_obj_time();
335
+ Init_ca_obj_timedelta();
336
+ Init_ca_obj_record();
337
+ Init_ca_obj_const_string();
338
+ Init_ca_obj_string();
339
+ Init_ca_obj_fixlen_string();
261
340
  Init_ca_obj_bitarray();
262
341
  Init_ca_obj_bitfield();
342
+ Init_ca_obj_remap(); /* internal-only (no Ruby surface) */
343
+ Init_carray_lazy(); /* CALazyMarker; CAREFUL: must precede the
344
+ four lazy elementwise inits below. */
345
+ Init_ca_obj_monop();
346
+ Init_ca_obj_binop();
347
+ Init_ca_obj_triop();
348
+ Init_ca_obj_bincmp();
349
+ Init_ca_obj_moncmp();
350
+
351
+ /* CAIterator is the form-only base of the 3.0 iterator family; its shared
352
+ accessors are plain Ruby attr_readers (lib/carray/iterator.rb). The C
353
+ reduction iterators subclass it and carray_access.c constructs
354
+ CASlabIterator by name, so the class object must exist here. The retired
355
+ 2.0 dispatch engines (dimension / window / block C iterators + the
356
+ kernel_at_addr base) are preserved at samples/caiterator/. */
357
+ rb_cCAIterator = rb_define_class("CAIterator", rb_cObject);
358
+
359
+ Init_ca_group_iter(); /* devel/MEMO_AXIS_GROUP.md — axis-group [] surface
360
+ (CAGroupIterator); after CAIterator is defined
361
+ (CAGroupIterator subclasses it). */
263
362
 
264
- Init_carray_iterator();
363
+ Init_carray_mathfunc();
265
364
 
266
- Init_ca_iter_dimension();
267
- Init_ca_iter_block();
268
- Init_ca_iter_window();
365
+ Init_carray_memory_view();
269
366
 
270
- Init_carray_mathfunc();
367
+ Init_carray_struct();
368
+
369
+ Init_carray_random();
271
370
 
371
+ Init_ca_kernel_iterator();
272
372
 
373
+ Init_carray_slab();
273
374
  }
274
375
 
data/ext/version.h CHANGED
@@ -1,16 +1,6 @@
1
- /* ---------------------------------------------------------------------------
2
-
3
- version.h
4
-
5
- This file is part of Ruby/CArray extension library.
6
-
7
- Copyright (C) 2005-2020 Hiroki Motoyoshi
8
-
9
- ---------------------------------------------------------------------------- */
10
-
11
- #define CA_VERSION "2.0.0"
12
- #define CA_VERSION_CODE 200
13
- #define CA_VERSION_MAJOR 2
1
+ #define CA_VERSION "3.0.0"
2
+ #define CA_VERSION_CODE 300
3
+ #define CA_VERSION_MAJOR 3
14
4
  #define CA_VERSION_MINOR 0
15
5
  #define CA_VERSION_TEENY 0
16
- #define CA_VERSION_DATE "2025/06/03"
6
+ #define CA_VERSION_DATE "2026/08/25"
data/ext/version.rb CHANGED
@@ -1,15 +1,3 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # version.rb
4
- #
5
- # This file is part of Ruby/CArray extension library.
6
- # You can redistribute it and/or modify it under the terms of
7
- # the Ruby Licence.
8
- #
9
- # Copyright (C) 2005 Hiroki Motoyoshi
10
- #
11
- # ----------------------------------------------------------------------------
12
-
13
1
  def carray_version
14
2
 
15
3
  io = open(File.join(File.dirname(__FILE__), "version.h"))
@@ -36,7 +24,11 @@ def carray_version
36
24
  ca_version_code2 =
37
25
  100 * ca_version_major + 10*ca_version_minor + ca_version_teeny
38
26
 
39
- if ca_version != ca_version2 or ca_version_code != ca_version_code2
27
+ # Allow pre-release suffix like "3.0.0.dev" / "3.0.0.alpha1" while still
28
+ # validating the numeric MAJOR.MINOR.TEENY prefix.
29
+ ca_version_numeric = ca_version.split(".")[0, 3].join(".")
30
+
31
+ if ca_version_numeric != ca_version2 or ca_version_code != ca_version_code2
40
32
  raise "invalid version.h"
41
33
  end
42
34