carray 3.0.1 → 3.0.3

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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +824 -0
  3. data/README.md +5 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +258 -4
  6. data/ext/ca_axis_group.c +368 -184
  7. data/ext/ca_binop_dispatch.c +54 -32
  8. data/ext/ca_binop_dispatch.h +1 -0
  9. data/ext/ca_categorical_iterator.c +90 -41
  10. data/ext/ca_compare.c +8 -2
  11. data/ext/ca_for_buffer.h +21 -68
  12. data/ext/ca_group_iter.c +27 -11
  13. data/ext/ca_kernel_iterator.c +960 -245
  14. data/ext/ca_kernel_iterator.h +352 -181
  15. data/ext/ca_monop_dispatch.c +4 -4
  16. data/ext/ca_monop_dispatch.h +4 -0
  17. data/ext/ca_obj_array.c +194 -42
  18. data/ext/ca_obj_bincmp.c +152 -121
  19. data/ext/ca_obj_binop.c +107 -210
  20. data/ext/ca_obj_bitarray.c +37 -24
  21. data/ext/ca_obj_bitfield.c +95 -62
  22. data/ext/ca_obj_block.c +5 -4
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +180 -50
  25. data/ext/ca_obj_face.c +428 -62
  26. data/ext/ca_obj_face.h +107 -47
  27. data/ext/ca_obj_fake.c +21 -50
  28. data/ext/ca_obj_farray.c +1 -0
  29. data/ext/ca_obj_field.c +16 -3
  30. data/ext/ca_obj_fixlen_string.c +39 -26
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +235 -55
  33. data/ext/ca_obj_moncmp.c +61 -61
  34. data/ext/ca_obj_monop.c +125 -107
  35. data/ext/ca_obj_object.c +551 -233
  36. data/ext/ca_obj_record.c +51 -16
  37. data/ext/ca_obj_reduce.c +5 -8
  38. data/ext/ca_obj_refer.c +117 -33
  39. data/ext/ca_obj_remap.c +57 -17
  40. data/ext/ca_obj_repeat.c +21 -5
  41. data/ext/ca_obj_roll.c +115 -11
  42. data/ext/ca_obj_select.c +88 -75
  43. data/ext/ca_obj_select_axis.c +58 -60
  44. data/ext/ca_obj_shift.c +22 -102
  45. data/ext/ca_obj_stack.c +223 -123
  46. data/ext/ca_obj_stride.c +267 -35
  47. data/ext/ca_obj_string.c +25 -22
  48. data/ext/ca_obj_tile.c +32 -16
  49. data/ext/ca_obj_time.c +23 -25
  50. data/ext/ca_obj_timedelta.c +21 -23
  51. data/ext/ca_obj_transpose.c +12 -3
  52. data/ext/ca_obj_triop.c +110 -117
  53. data/ext/ca_obj_window.c +157 -29
  54. data/ext/ca_op_ipower.c +25 -13
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_rng_normal.h +42 -0
  58. data/ext/ca_rng_xoshiro256pp.h +105 -0
  59. data/ext/ca_sort_kernels.h +70 -0
  60. data/ext/ca_sweep_engine.c +385 -198
  61. data/ext/ca_sweep_engine.h +31 -23
  62. data/ext/ca_triop_dispatch.c +4 -1
  63. data/ext/ca_triop_dispatch.h +5 -2
  64. data/ext/caframe_csv_reader.c +463 -0
  65. data/ext/carray.h +90 -28
  66. data/ext/carray_access.c +487 -231
  67. data/ext/carray_address_basis.c +731 -0
  68. data/ext/carray_attribute.c +45 -3
  69. data/ext/carray_bincount.c +32 -2
  70. data/ext/carray_broadcast.c +49 -17
  71. data/ext/carray_call_cfunc.c +667 -511
  72. data/ext/carray_cast.c +1556 -247
  73. data/ext/carray_cast_func.rb +34 -21
  74. data/ext/carray_conversion.c +197 -73
  75. data/ext/carray_copy.c +84 -38
  76. data/ext/carray_core.c +591 -119
  77. data/ext/carray_count.c +148 -96
  78. data/ext/carray_element.c +18 -27
  79. data/ext/carray_factorize.c +604 -291
  80. data/ext/carray_generate.c +76 -40
  81. data/ext/carray_histogram.c +152 -94
  82. data/ext/carray_hold.c +2 -1
  83. data/ext/carray_index_classifier.c +63 -96
  84. data/ext/carray_internal.h +400 -1
  85. data/ext/carray_lazy.c +834 -79
  86. data/ext/carray_loop.c +88 -66
  87. data/ext/carray_mask.c +705 -324
  88. data/ext/carray_math_kernel.h +1 -0
  89. data/ext/carray_median_percentile.c +263 -63
  90. data/ext/carray_memory_view.c +254 -248
  91. data/ext/carray_operator.c +1093 -363
  92. data/ext/carray_order.c +133 -69
  93. data/ext/carray_partition.c +102 -56
  94. data/ext/carray_random.c +582 -204
  95. data/ext/carray_scatter.c +308 -65
  96. data/ext/carray_segment.c +257 -0
  97. data/ext/carray_slab.c +183 -70
  98. data/ext/carray_sort.c +235 -240
  99. data/ext/carray_sort_kernel.c +8 -1
  100. data/ext/carray_struct.c +99 -21
  101. data/ext/carray_test.c +167 -64
  102. data/ext/carray_time_text.c +1182 -0
  103. data/ext/carray_utils.c +363 -98
  104. data/ext/extconf.rb +27 -2
  105. data/ext/mk_call_cfunc.rb +103 -118
  106. data/ext/mk_pow5_table.rb +35 -0
  107. data/ext/mkkernel.rb +1349 -851
  108. data/ext/ruby_carray.c +17 -2
  109. data/ext/version.h +4 -4
  110. data/ext/version.rb +4 -2
  111. data/lib/carray/attribute.rb +39 -0
  112. data/lib/carray/autoload_carray.rb +24 -3
  113. data/lib/carray/autoload_method_extension.rb +18 -0
  114. data/lib/carray/axis_group.rb +245 -20
  115. data/lib/carray/basics.rb +95 -25
  116. data/lib/carray/bincount_nd.rb +6 -0
  117. data/lib/carray/block_iterator.rb +200 -54
  118. data/lib/carray/boolean_reduce.rb +21 -29
  119. data/lib/carray/categorical.rb +244 -59
  120. data/lib/carray/categorical_iterator.rb +391 -757
  121. data/lib/carray/complex.rb +36 -29
  122. data/lib/carray/conditional.rb +94 -7
  123. data/lib/carray/const_string.rb +177 -27
  124. data/lib/carray/construct.rb +40 -0
  125. data/lib/carray/data_type_extension.rb +3 -0
  126. data/lib/carray/data_type_limits.rb +91 -0
  127. data/lib/carray/fixlen_string.rb +1 -1
  128. data/lib/carray/frame/concat.rb +157 -6
  129. data/lib/carray/frame/convert.rb +13 -7
  130. data/lib/carray/frame/csv_parser.rb +590 -76
  131. data/lib/carray/frame/describe.rb +79 -0
  132. data/lib/carray/frame/frame.rb +205 -35
  133. data/lib/carray/frame/group.rb +199 -40
  134. data/lib/carray/frame/io.rb +452 -60
  135. data/lib/carray/frame/join.rb +134 -46
  136. data/lib/carray/frame/records.rb +54 -19
  137. data/lib/carray/frame/reshape.rb +448 -0
  138. data/lib/carray/frame/sort.rb +26 -2
  139. data/lib/carray/frame/verbs.rb +726 -56
  140. data/lib/carray/frame.rb +2 -0
  141. data/lib/carray/fuse_source.rb +111 -2
  142. data/lib/carray/fusion.rb +229 -38
  143. data/lib/carray/inspect.rb +71 -20
  144. data/lib/carray/iterator.rb +157 -2
  145. data/lib/carray/lazy.rb +54 -67
  146. data/lib/carray/mask_gap_fill.rb +66 -50
  147. data/lib/carray/math.rb +32 -19
  148. data/lib/carray/meld_reduce.rb +40 -7
  149. data/lib/carray/methods/align_addr.rb +8 -4
  150. data/lib/carray/methods/bincount.rb +2 -2
  151. data/lib/carray/methods/bit_string.rb +14 -3
  152. data/lib/carray/methods/composition.rb +16 -10
  153. data/lib/carray/methods/discovery_along.rb +74 -0
  154. data/lib/carray/methods/factorize.rb +50 -0
  155. data/lib/carray/methods/gather_nd.rb +13 -2
  156. data/lib/carray/methods/insert_block.rb +9 -14
  157. data/lib/carray/methods/is_in.rb +130 -6
  158. data/lib/carray/methods/join.rb +1 -1
  159. data/lib/carray/methods/locate_addr.rb +235 -21
  160. data/lib/carray/methods/mask_duplicates.rb +35 -1
  161. data/lib/carray/methods/mode.rb +18 -1
  162. data/lib/carray/methods/nunique.rb +22 -1
  163. data/lib/carray/methods/repeat.rb +91 -0
  164. data/lib/carray/methods/resize.rb +21 -23
  165. data/lib/carray/methods/snap.rb +34 -12
  166. data/lib/carray/methods/unique.rb +52 -3
  167. data/lib/carray/record_order.rb +208 -0
  168. data/lib/carray/rng.rb +86 -0
  169. data/lib/carray/runtime.rb +14 -11
  170. data/lib/carray/segment_iterator.rb +990 -0
  171. data/lib/carray/serialize.rb +197 -27
  172. data/lib/carray/slab_iterator.rb +109 -40
  173. data/lib/carray/stack.rb +10 -4
  174. data/lib/carray/string_operation_extension.rb +9 -4
  175. data/lib/carray/struct.rb +142 -51
  176. data/lib/carray/struct_builder.rb +110 -14
  177. data/lib/carray/table.rb +2 -2
  178. data/lib/carray/time.rb +535 -105
  179. data/lib/carray/window_iterator.rb +259 -82
  180. data/lib/carray.rb +4 -2
  181. data/yard-stubs/ca_obj_array.rb +4 -4
  182. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  183. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  184. data/yard-stubs/ca_obj_block.rb +2 -7
  185. data/yard-stubs/ca_obj_fake.rb +1 -1
  186. data/yard-stubs/ca_obj_field.rb +1 -1
  187. data/yard-stubs/ca_obj_refer.rb +3 -3
  188. data/yard-stubs/ca_obj_roll.rb +0 -1
  189. data/yard-stubs/ca_obj_stride.rb +10 -7
  190. data/yard-stubs/ca_obj_transpose.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +11 -4
  192. data/yard-stubs/carray_access.rb +6 -5
  193. data/yard-stubs/carray_broadcast.rb +2 -2
  194. data/yard-stubs/carray_cast.rb +78 -43
  195. data/yard-stubs/carray_conversion.rb +13 -1
  196. data/yard-stubs/carray_copy.rb +8 -3
  197. data/yard-stubs/carray_core.rb +3 -83
  198. data/yard-stubs/carray_count.rb +16 -2
  199. data/yard-stubs/carray_lazy.rb +210 -1
  200. data/yard-stubs/carray_loop.rb +4 -1
  201. data/yard-stubs/carray_mask.rb +34 -10
  202. data/yard-stubs/carray_math.rb +1499 -4
  203. data/yard-stubs/carray_median_percentile.rb +26 -8
  204. data/yard-stubs/carray_order.rb +43 -82
  205. data/yard-stubs/carray_scatter.rb +10 -3
  206. data/yard-stubs/carray_segment.rb +72 -0
  207. data/yard-stubs/carray_slab.rb +11 -8
  208. data/yard-stubs/carray_sort.rb +50 -8
  209. data/yard-stubs/carray_test.rb +10 -0
  210. data/yard-stubs/carray_utils.rb +0 -26
  211. metadata +19 -19
  212. data/ext/ca_for_each_element.h +0 -239
  213. data/ext/carray_build_flags.h +0 -3
  214. data/ext/carray_config.h +0 -28
  215. data/ext/carray_kernels_bincmp.c +0 -4446
  216. data/ext/carray_kernels_binop.c +0 -11001
  217. data/ext/carray_kernels_init.c +0 -1131
  218. data/ext/carray_kernels_map.c +0 -3467
  219. data/ext/carray_kernels_moncmp.c +0 -2097
  220. data/ext/carray_kernels_monop.c +0 -18313
  221. data/ext/carray_kernels_reduce_aggregate.c +0 -25837
  222. data/ext/carray_kernels_reduce_boolean.c +0 -330
  223. data/ext/carray_kernels_reduce_cumulative.c +0 -14593
  224. data/ext/carray_kernels_reduce_extreme.c +0 -16948
  225. data/ext/carray_kernels_reduce_variance.c +0 -3910
  226. data/ext/carray_kernels_scan.c +0 -3693
  227. data/ext/carray_kernels_search.c +0 -32138
  228. data/ext/carray_kernels_sort.c +0 -10626
  229. data/ext/carray_kernels_triop.c +0 -1392
data/ext/carray.h CHANGED
@@ -716,6 +716,12 @@ typedef struct {
716
716
  0 = outer-axis stack (legacy default).
717
717
  parent_ndim = K innermost (= old merge at=-1).
718
718
  Set by ca_stack_setup_with_axis / preserved on clone. */
719
+ CArray **mask_standins; /* NULL, or ALLOC_N(CArray*, n_parents) once the mask is
720
+ built: the all-false masks standing in for parents that
721
+ have none (owned, freed with the view) */
722
+ CArray *mask_owner; /* on the mask of a CAStack: that CAStack, whose stand-ins
723
+ this mask reads until they give way to the parents'
724
+ own masks (ca_multi_parent_mask_refresh); else NULL */
719
725
  } CAStack;
720
726
 
721
727
  /* CAMeld (ragged concatenate view along an existing axis). Unlike CAStack
@@ -749,6 +755,8 @@ typedef struct {
749
755
  ca_size_t *seg_offset; /* ALLOC_N(ca_size_t, K+1); prefix sum along meld_axis.
750
756
  seg_offset[0]=0, seg_offset[k+1]=seg_offset[k]+parents[k]->dim[meld_axis],
751
757
  seg_offset[K]=dim[meld_axis]. */
758
+ CArray **mask_standins; /* as CAStack's: stand-in masks this view owns, or NULL */
759
+ CArray *mask_owner; /* as CAStack's */
752
760
  } CAMeld;
753
761
 
754
762
  /* Multi-parent view layout convention (CA_FLAG_MULTI_PARENTS). A view that
@@ -786,9 +794,14 @@ typedef struct {
786
794
  VALUE self;
787
795
  } CAObject; /* 48 + 4*(ndim) (bytes) */
788
796
 
789
- /*
790
- CAObjectMask is an internal class
791
- used only as mask array of CAObject.
797
+ /*
798
+ CAObjectMask is an internal class used only as the mask array of a
799
+ CAObject. Its bits live in the CAObject's mask hooks (mask_copy_data,
800
+ mask_fetch_addr, ...) when it has them, and in `cache` -- the mask
801
+ buffer of the CAObject's internal data array -- always. Like the mask
802
+ of any view it is cold at rest: ptr is NULL, and every read and write
803
+ goes through its slots to the hooks. An attach publishes the cache in
804
+ ptr, and `holds` counts the attaches not yet detached.
792
805
  */
793
806
 
794
807
  typedef struct {
@@ -807,6 +820,8 @@ typedef struct {
807
820
  ext/ca_array_pool.c. */
808
821
  /* -------------*/
809
822
  VALUE array;
823
+ char *cache;
824
+ long holds;
810
825
  } CAObjectMask;
811
826
 
812
827
  /* CARepeat (Phase R migration): structurally identical to CAStride.
@@ -862,7 +877,7 @@ int8_t ca_promote_type (int8_t a, int8_t b);
862
877
  /* Infer a data_type code from a Ruby *value* (literal Numeric, true/false,
863
878
  Complex, etc.) — distinct from rb_ca_guess_type which interprets the
864
879
  object as a data_type *representation* (e.g. T_FIXNUM as a data_type code).
865
- Used by then_else and by ca_lazy_wrap_scalar's bool-self corner case.
880
+ Used by rb_ca_cast_self_or_other.
866
881
  CArray is not accepted (callers should use ca->data_type directly). */
867
882
  int8_t ca_value_to_data_type (VALUE obj);
868
883
 
@@ -922,7 +937,6 @@ extern const rb_data_type_t careduce_data_type;
922
937
  extern const rb_data_type_t carefer_data_type;
923
938
  extern const rb_data_type_t caselect_data_type;
924
939
  extern const rb_data_type_t cashift_data_type;
925
- extern const rb_data_type_t caunboundrepeat_data_type;
926
940
  extern const rb_data_type_t cawindow_data_type;
927
941
 
928
942
  extern const rb_data_type_t carray_mask_data_type;
@@ -933,7 +947,6 @@ extern const rb_data_type_t careduce_mask_data_type;
933
947
  extern const rb_data_type_t carefer_mask_data_type;
934
948
  extern const rb_data_type_t caselect_mask_data_type;
935
949
  extern const rb_data_type_t cashift_mask_data_type;
936
- extern const rb_data_type_t caunboundrepeat_mask_data_type;
937
950
  extern const rb_data_type_t cawindow_mask_data_type;
938
951
 
939
952
  /* -------------------------------------------------------------------- */
@@ -987,21 +1000,21 @@ extern VALUE rb_cCArrayObject;
987
1000
  #define CA_CHECK_DATA_TYPE(data_type) \
988
1001
  do { \
989
1002
  if ( data_type <= CA_NONE || data_type >= CA_NTYPE ) { \
990
- rb_raise(rb_eRuntimeError, "invalid data_type id %i", data_type); \
1003
+ rb_raise(rb_eArgError, "invalid data_type id %i", data_type); \
991
1004
  } \
992
1005
  if ( ! ca_valid[data_type] ) { \
993
- rb_raise(rb_eRuntimeError, "data_type %s is disabled", ca_type_name[data_type]); \
1006
+ rb_raise(rb_eCADataTypeError, "data_type %s is disabled", ca_type_name[data_type]); \
994
1007
  } \
995
1008
  } while (0)
996
1009
 
997
1010
  #define CA_CHECK_DATA_TYPE_NUMERIC(data_type) \
998
1011
  if ( data_type <= CA_NONE || data_type >= CA_NTYPE || !ca_valid[data_type] || data_type == CA_FIXLEN || data_type == CA_OBJECT ) { \
999
- rb_raise(rb_eRuntimeError, "invalid numeric data type"); \
1012
+ rb_raise(rb_eCADataTypeError, "invalid numeric data type"); \
1000
1013
  }
1001
1014
 
1002
1015
  #define CA_CHECK_RANK(ndim) \
1003
1016
  if ( ndim <= 0 || ndim > CA_RANK_MAX ) { \
1004
- rb_raise(rb_eRuntimeError, "invalid ndim"); \
1017
+ rb_raise(rb_eArgError, "invalid ndim"); \
1005
1018
  }
1006
1019
 
1007
1020
  #define CA_CHECK_DIM(ndim, dim) \
@@ -1009,44 +1022,46 @@ extern VALUE rb_cCArrayObject;
1009
1022
  int8_t i_; \
1010
1023
  for (i_=0; i_<ndim; i_++) { \
1011
1024
  if ( dim[i_] < 0 ) { \
1012
- rb_raise(rb_eRuntimeError, "negative size dimension at %i-dim", i_); \
1025
+ rb_raise(rb_eArgError, "negative size dimension at %i-dim", i_); \
1013
1026
  } \
1014
1027
  } \
1015
1028
  }
1016
1029
 
1030
+ /* A fixlen cell is at least one byte wide. A zero-width cell has one
1031
+ possible value, and a strided view of it cannot say which cell is which:
1032
+ its byte strides are all zero. */
1017
1033
  #define CA_CHECK_BYTES(data_type, bytes) \
1018
1034
  if ( data_type == CA_FIXLEN ) { \
1019
- if ( bytes < 0 ) { \
1020
- rb_raise(rb_eRuntimeError, "invalid bytes"); \
1035
+ if ( bytes <= 0 ) { \
1036
+ rb_raise(rb_eArgError, \
1037
+ "invalid bytes (a fixlen needs bytes: of 1 or more)"); \
1021
1038
  } \
1022
1039
  } \
1023
1040
  else { \
1024
1041
  bytes = ca_sizeof[data_type]; \
1025
1042
  if ( bytes <= 0 ) { \
1026
- rb_raise(rb_eRuntimeError, "invalid bytes"); \
1043
+ rb_raise(rb_eArgError, "invalid bytes"); \
1027
1044
  } \
1028
1045
  }
1029
1046
 
1047
+ /* An index into `n` places, counted from the end when negative, outside of
1048
+ which IndexError is raised naming the method the user called, `what` the
1049
+ index is ("index", "address") and the value given. */
1050
+ NORETURN(void ca_index_out_of_range (ca_size_t idx, ca_size_t n, const char *what));
1051
+
1052
+ /* Normalise `index` in place against `dim` (a negative one counts from the
1053
+ end) and raise through ca_index_out_of_range when it falls outside. */
1030
1054
  #define CA_CHECK_INDEX(index, dim) \
1031
1055
  do { \
1032
- if ( index < 0 ) { \
1033
- index += (dim); \
1056
+ ca_size_t ca_check_index_given_ = (index); \
1057
+ if ( (index) < 0 ) { \
1058
+ (index) += (dim); \
1034
1059
  } \
1035
- if ( index < 0 || index >= (dim) ) { \
1036
- rb_raise(rb_eIndexError, "index out of range ( %" PRId64 " <=> 0..%" PRId64 " )", (int64_t) index, (int64_t) dim-1); \
1060
+ if ( (index) < 0 || (index) >= (dim) ) { \
1061
+ ca_index_out_of_range(ca_check_index_given_, (dim), "index"); \
1037
1062
  } \
1038
1063
  } while (0)
1039
1064
 
1040
- #define CA_CHECK_BOUND(ca, idx) \
1041
- { \
1042
- int8_t i; \
1043
- for (i=0; i<ca->ndim; i++) { \
1044
- if ( idx[i] < 0 || idx[i] >= ca->dim[i] ) { \
1045
- rb_raise(rb_eRuntimeError, "index out of range at %i-dim ( %i <=> 0..%i )", i, idx[i], ca->dim[i]-1); \
1046
- } \
1047
- } \
1048
- }
1049
-
1050
1065
  /* -------------------------------------------------------------------- */
1051
1066
 
1052
1067
  /* complex <-> Ruby Complex conversion
@@ -1072,6 +1087,10 @@ extern VALUE rb_cCArrayObject;
1072
1087
  # endif
1073
1088
  #endif
1074
1089
 
1090
+ /* A string as a complex cell: a real number read as Float() reads it
1091
+ (nan / inf included), else as Complex() does; anything else raises. */
1092
+ double complex ca_str_to_cmplx (VALUE str);
1093
+
1075
1094
  static inline double complex
1076
1095
  rb_carray_num2cmplx (VALUE num)
1077
1096
  {
@@ -1081,6 +1100,12 @@ rb_carray_num2cmplx (VALUE num)
1081
1100
  if ( RB_FLOAT_TYPE_P(num) || RB_INTEGER_TYPE_P(num) ) {
1082
1101
  return (double complex) NUM2DBL(num);
1083
1102
  }
1103
+ if ( RB_TYPE_P(num, T_STRING) ) {
1104
+ return ca_str_to_cmplx(num);
1105
+ }
1106
+ if ( NIL_P(num) ) {
1107
+ rb_raise(rb_eTypeError, "can't convert nil into Complex");
1108
+ }
1084
1109
  if ( rb_respond_to(num, rb_intern("to_c")) ) {
1085
1110
  VALUE c = rb_funcall(num, rb_intern("to_c"), 0);
1086
1111
  return CMPLX(NUM2DBL(rb_complex_real(c)), NUM2DBL(rb_complex_imag(c)));
@@ -1127,6 +1152,7 @@ double OBJ2DBL (VALUE v);
1127
1152
  object->int/float cast loop so an unparseable cell becomes UNDEF instead
1128
1153
  of a silent 0.0 (float) or a raise (int). See ext/carray_cast.c. */
1129
1154
  int ca_obj2dbl_ok (VALUE v, double *out);
1155
+ int ca_obj2cmplx_ok (VALUE v, double complex *out);
1130
1156
  int rb_obj2long_ok (VALUE v, long *out);
1131
1157
  int rb_obj2ulong_ok (VALUE v, unsigned long *out);
1132
1158
  int rb_obj2ll_ok (VALUE v, long long *out);
@@ -1295,6 +1321,10 @@ VALUE rb_ca_farray (VALUE self);
1295
1321
 
1296
1322
  /* --- ca_obj_stride.c --- */
1297
1323
 
1324
+ /* ca_stride_setup with ca == NULL runs its checks and returns 0 without
1325
+ writing. ca_stride_new calls it that way before it allocates, so a
1326
+ rejected argument leaves no struct behind; a subclass constructor can
1327
+ do the same through its own setup function. */
1298
1328
  int ca_stride_setup (CAStride *ca, int8_t obj_type, CArray *parent,
1299
1329
  int8_t data_type, ca_size_t bytes,
1300
1330
  int8_t ndim, ca_size_t *dim,
@@ -1461,6 +1491,7 @@ int ca_is_object_type (void *ap);
1461
1491
 
1462
1492
  void ca_check_type (void *ap, int8_t data_type);
1463
1493
  #define ca_check_data_type(ap, data_type) ca_check_type(ap, data_type)
1494
+ void ca_check_uninitialized (void *ap); /* initialize / initialize_copy entry */
1464
1495
  void ca_check_ndim (void *ap, int ndim);
1465
1496
  void ca_check_shape (void *ap, int ndim, ca_size_t *dim);
1466
1497
  void ca_check_same_data_type (void *ap1, void *ap2);
@@ -1476,11 +1507,41 @@ int ca_is_valid_index (void *ap, ca_size_t *idx);
1476
1507
 
1477
1508
  /* API : allocate, attach, update, sync, detach */
1478
1509
 
1510
+ /* Attach lifecycle contract (R1-R6). Ownership-based, and NOT transitive.
1511
+ This block is the canonical statement of the contract; the other documents
1512
+ copy it. guides/devel/04_attach_lifecycle.md discusses it at length.
1513
+
1514
+ R1 (validity) ca_attach(x) makes x->ptr only valid. It says nothing
1515
+ about any other array.
1516
+ R2 (no transit) Attaching a child does not attach its parent. An
1517
+ implementation may do so as an internal optimisation;
1518
+ never rely on it.
1519
+ R3 (necessity) To touch ca->parent->ptr, call ca_attach(ca->parent)
1520
+ yourself.
1521
+ R4 (ordering) Attaching both parent and child: open parent -> child,
1522
+ close child -> parent, sync in attach order. Symmetric
1523
+ nesting stays correct when a view double-attaches
1524
+ internally (views carry an attach refcount; entities do
1525
+ not).
1526
+ R5 (traffic) Attach hands you a buffer, not a live array. Use x->ptr;
1527
+ a view derived from x composes past the buffer to the
1528
+ root.
1529
+ R6 (raising) ca_allocate and ca_attach that raise have taken
1530
+ nothing; ca_allocate_n and ca_attach_n take all of
1531
+ their arrays or none. Close a window with
1532
+ ca_sync_detach, which detaches even when the sync
1533
+ raises -- ca_sync then ca_detach leaves the window open
1534
+ on a raise. Anything between that can raise (Ruby
1535
+ called from inside the window) needs an ensure of its
1536
+ own.
1537
+ */
1538
+
1479
1539
  void ca_allocate (void *ap);
1480
1540
  void ca_attach (void *ca);
1481
1541
  void ca_update (void *ca);
1482
1542
  void ca_sync (void *ca);
1483
1543
  void ca_detach (void *ca);
1544
+ void ca_sync_detach (void *ca);
1484
1545
 
1485
1546
  void ca_allocate_n (int n, ...);
1486
1547
  void ca_attach_n (int n, ...);
@@ -1653,6 +1714,7 @@ void ca_parse_range_without_check (VALUE arg, ca_size_t size,
1653
1714
  ca_size_t *offset, ca_size_t *count, ca_size_t *step);
1654
1715
 
1655
1716
  int ca_equal (void *ap, void *bp);
1717
+ int ca_eql_storage (void *ap, void *bp);
1656
1718
  void ca_zerodiv(void) __attribute__((noreturn));
1657
1719
  /* ca_rand removed in 3.0; use rb_random_real/rb_random_ulong_limited instead */
1658
1720
  ca_size_t ca_bounds_normalize_index (int8_t bounds, ca_size_t size0, ca_size_t k);