carray 3.0.4 → 3.0.5

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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +205 -0
  3. data/carray.gemspec +1 -1
  4. data/ext/ca_array_pool.c +25 -1
  5. data/ext/ca_axis_dispatch.c +13 -20
  6. data/ext/ca_categorical_iterator.c +27 -20
  7. data/ext/ca_compare.c +4 -4
  8. data/ext/ca_composite_dispatch.c +9 -9
  9. data/ext/ca_kernel_iterator.c +6 -6
  10. data/ext/ca_kernel_iterator.h +112 -83
  11. data/ext/ca_obj_array.c +69 -19
  12. data/ext/ca_obj_bincmp.c +1 -0
  13. data/ext/ca_obj_binop.c +1 -0
  14. data/ext/ca_obj_bitarray.c +5 -1
  15. data/ext/ca_obj_bitfield.c +58 -43
  16. data/ext/ca_obj_byte_swap.c +2 -1
  17. data/ext/ca_obj_const_string.c +15 -3
  18. data/ext/ca_obj_face.c +42 -1
  19. data/ext/ca_obj_field.c +13 -3
  20. data/ext/ca_obj_grid.c +52 -5
  21. data/ext/ca_obj_monop.c +46 -10
  22. data/ext/ca_obj_object.c +64 -12
  23. data/ext/ca_obj_record.c +3 -0
  24. data/ext/ca_obj_reduce.c +4 -0
  25. data/ext/ca_obj_refer.c +18 -9
  26. data/ext/ca_obj_roll.c +26 -6
  27. data/ext/ca_obj_select.c +34 -5
  28. data/ext/ca_obj_shift.c +31 -7
  29. data/ext/ca_obj_stack.c +1 -0
  30. data/ext/ca_obj_stride.c +28 -19
  31. data/ext/ca_obj_string.c +11 -2
  32. data/ext/ca_obj_tile.c +27 -7
  33. data/ext/ca_obj_transpose.c +8 -4
  34. data/ext/ca_obj_triop.c +3 -0
  35. data/ext/ca_obj_window.c +79 -50
  36. data/ext/ca_op_ipower.c +4 -4
  37. data/ext/ca_sort_kernels.h +6 -3
  38. data/ext/carray.h +33 -0
  39. data/ext/carray_access.c +16 -3
  40. data/ext/carray_attribute.c +24 -0
  41. data/ext/carray_cast.c +243 -82
  42. data/ext/carray_cast_func.rb +56 -26
  43. data/ext/carray_conversion.c +2 -2
  44. data/ext/carray_core.c +3 -0
  45. data/ext/carray_count.c +6 -0
  46. data/ext/carray_element.c +9 -4
  47. data/ext/carray_factorize.c +20 -20
  48. data/ext/carray_generate.c +8 -2
  49. data/ext/carray_histogram.c +1 -1
  50. data/ext/carray_index_classifier.c +4 -4
  51. data/ext/carray_internal.h +12 -0
  52. data/ext/carray_kernels_bincmp.c +168 -168
  53. data/ext/carray_kernels_binop.c +900 -900
  54. data/ext/carray_kernels_init.c +4 -4
  55. data/ext/carray_kernels_moncmp.c +96 -96
  56. data/ext/carray_kernels_monop.c +1984 -1984
  57. data/ext/carray_kernels_reduce_aggregate.c +1733 -1733
  58. data/ext/carray_kernels_reduce_cumulative.c +642 -642
  59. data/ext/carray_kernels_reduce_extreme.c +1150 -1150
  60. data/ext/carray_kernels_reduce_variance.c +258 -258
  61. data/ext/carray_kernels_scan.c +128 -128
  62. data/ext/carray_kernels_search.c +340 -340
  63. data/ext/carray_kernels_sort.c +295 -304
  64. data/ext/carray_kernels_triop.c +114 -114
  65. data/ext/carray_key_windows.c +4 -0
  66. data/ext/carray_mask.c +45 -22
  67. data/ext/carray_memory_view.c +2 -2
  68. data/ext/carray_operator.c +5 -5
  69. data/ext/carray_order.c +227 -8
  70. data/ext/carray_random.c +18 -18
  71. data/ext/carray_scatter.c +24 -7
  72. data/ext/carray_slab.c +32 -9
  73. data/ext/carray_sort.c +224 -16
  74. data/ext/carray_sort_kernel.c +5 -7
  75. data/ext/carray_struct.c +35 -43
  76. data/ext/carray_time_text.c +4 -2
  77. data/ext/carray_utils.c +63 -21
  78. data/ext/mkkernel.rb +210 -115
  79. data/ext/version.h +4 -4
  80. data/lib/carray/attribute.rb +17 -4
  81. data/lib/carray/basics.rb +27 -7
  82. data/lib/carray/categorical.rb +30 -16
  83. data/lib/carray/categorical_iterator.rb +6 -6
  84. data/lib/carray/const_string.rb +10 -0
  85. data/lib/carray/data_type_extension.rb +8 -1
  86. data/lib/carray/fixlen_string.rb +41 -2
  87. data/lib/carray/frame/column_verbs.rb +4 -3
  88. data/lib/carray/frame/concat.rb +17 -3
  89. data/lib/carray/frame/frame.rb +6 -7
  90. data/lib/carray/frame/group.rb +100 -13
  91. data/lib/carray/frame/io.rb +3 -1
  92. data/lib/carray/fuse_source.rb +31 -2
  93. data/lib/carray/lazy.rb +35 -0
  94. data/lib/carray/methods/is_in.rb +8 -1
  95. data/lib/carray/segment_iterator.rb +12 -8
  96. data/lib/carray/serialize.rb +19 -2
  97. data/lib/carray/stack.rb +15 -12
  98. data/lib/carray/string.rb +8 -0
  99. data/lib/carray/string_operation_extension.rb +13 -5
  100. data/lib/carray/struct_builder.rb +5 -3
  101. data/lib/carray/time.rb +107 -68
  102. data/yard-stubs/ca_obj_transpose.rb +5 -4
  103. data/yard-stubs/carray_attribute.rb +3 -1
  104. data/yard-stubs/carray_cast.rb +2 -0
  105. data/yard-stubs/carray_conversion.rb +5 -1
  106. data/yard-stubs/carray_element.rb +7 -6
  107. data/yard-stubs/carray_mask.rb +8 -3
  108. data/yard-stubs/carray_math.rb +14 -4
  109. data/yard-stubs/carray_order.rb +100 -4
  110. data/yard-stubs/carray_scatter.rb +7 -5
  111. metadata +1 -1
data/ext/carray_element.c CHANGED
@@ -20,17 +20,22 @@
20
20
  #include "ca_obj_face.h"
21
21
  #include "carray_internal.h" /* ca_obj_extremum_replaces */
22
22
 
23
- /* An element index is an Integer, as it is for `[]`; a Float would be cut
24
- to an integer by NUM2SIZE. */
23
+ /* An element index is read as `[]` reads a key: an Integer, or a Float
24
+ with no fraction. */
25
25
  static inline ca_size_t
26
26
  elem_index_value (VALUE v)
27
27
  {
28
+ ca_size_t k;
28
29
  if ( FIXNUM_P(v) ) return (ca_size_t) FIX2LONG(v);
29
- if ( ! RB_INTEGER_TYPE_P(v) ) {
30
+ switch ( ca_index_key_position(v, &k) ) {
31
+ case 1:
32
+ return k;
33
+ case 2:
34
+ return CA_LENGTH_MAX; /* past int64: past every axis, refused as out of range */
35
+ default:
30
36
  rb_raise(rb_eIndexError, "object '%"PRIsVALUE"' is invalid for an index",
31
37
  rb_inspect(v));
32
38
  }
33
- return NUM2SIZE(v);
34
39
  }
35
40
 
36
41
  /* T_ARRAY index parser. ridx is assumed already known to be T_ARRAY.
@@ -865,7 +865,7 @@ fz_factorize_appearance_body (VALUE arg)
865
865
  element to a 64-bit key; equality within one data type is preserved. */
866
866
  #define FZ_LOOP(T, WIDEN) \
867
867
  do { \
868
- const T *ip = (const T *) p_in; \
868
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
869
869
  uint32_t *op = (uint32_t *) p_out; \
870
870
  for ( ca_size_t i = 0; i < n; i++ ) { \
871
871
  if ( m && m[i] ) { op[i] = 0xFFFFFFFFu; continue; } \
@@ -884,7 +884,7 @@ fz_factorize_appearance_body (VALUE arg)
884
884
  kept as-is), so masked source cells store the sentinel. */
885
885
  #define FZ_LOOP_FLOAT(T) \
886
886
  do { \
887
- const T *ip = (const T *) p_in; \
887
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
888
888
  uint32_t *op = (uint32_t *) p_out; \
889
889
  for ( ca_size_t i = 0; i < n; i++ ) { \
890
890
  if ( m && m[i] ) { op[i] = 0xFFFFFFFFu; continue; } \
@@ -1073,7 +1073,7 @@ fz_mask_duplicates_body (VALUE arg)
1073
1073
  interns first appearances, so is_new == 0 flags a duplicate. */
1074
1074
  #define MD_LOOP(T, WIDEN) \
1075
1075
  do { \
1076
- const T *ip = (const T *) p_in; \
1076
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1077
1077
  boolean8_t *op = (boolean8_t *) p_out; \
1078
1078
  for ( ca_size_t i = 0; i < n; i++ ) { \
1079
1079
  if ( m && m[i] ) { op[i] = 0; continue; } \
@@ -1091,7 +1091,7 @@ fz_mask_duplicates_body (VALUE arg)
1091
1091
  before the bitwise key. */
1092
1092
  #define MD_LOOP_FLOAT(T) \
1093
1093
  do { \
1094
- const T *ip = (const T *) p_in; \
1094
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1095
1095
  boolean8_t *op = (boolean8_t *) p_out; \
1096
1096
  for ( ca_size_t i = 0; i < n; i++ ) { \
1097
1097
  if ( m && m[i] ) { op[i] = 0; continue; } \
@@ -1225,7 +1225,7 @@ fz_unique_flat_body (VALUE arg)
1225
1225
 
1226
1226
  #define UQ_LOOP(T, WIDEN) \
1227
1227
  do { \
1228
- const T *ip = (const T *) p_in; \
1228
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1229
1229
  for ( ca_size_t i = 0; i < n; i++ ) { \
1230
1230
  if ( m && m[i] ) { continue; } \
1231
1231
  uint64_t key = (uint64_t) (WIDEN ip[i]); \
@@ -1239,7 +1239,7 @@ fz_unique_flat_body (VALUE arg)
1239
1239
  pushed level is the raw first-seen element. */
1240
1240
  #define UQ_LOOP_FLOAT(T) \
1241
1241
  do { \
1242
- const T *ip = (const T *) p_in; \
1242
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1243
1243
  for ( ca_size_t i = 0; i < n; i++ ) { \
1244
1244
  if ( m && m[i] ) { continue; } \
1245
1245
  T v = ip[i]; \
@@ -1340,7 +1340,7 @@ fz_intern_all (ca_iter_state *st_v, fz_hash *h, CArray *cv, fz_levels *lv)
1340
1340
 
1341
1341
  #define FZ_IA(T, WIDEN) \
1342
1342
  do { \
1343
- const T *ip = (const T *) p_v; \
1343
+ const CA_U(T) *ip = (const CA_U(T) *) p_v; \
1344
1344
  for ( ca_size_t i = 0; i < nv; i++ ) { \
1345
1345
  if ( mv && mv[i] ) { continue; } \
1346
1346
  uint64_t key = (uint64_t) (WIDEN ip[i]); \
@@ -1352,7 +1352,7 @@ fz_intern_all (ca_iter_state *st_v, fz_hash *h, CArray *cv, fz_levels *lv)
1352
1352
 
1353
1353
  #define FZ_IA_FLOAT(T) \
1354
1354
  do { \
1355
- const T *ip = (const T *) p_v; \
1355
+ const CA_U(T) *ip = (const CA_U(T) *) p_v; \
1356
1356
  for ( ca_size_t i = 0; i < nv; i++ ) { \
1357
1357
  if ( mv && mv[i] ) { continue; } \
1358
1358
  T v = ip[i]; \
@@ -1493,7 +1493,7 @@ fz_is_in_body (VALUE arg)
1493
1493
 
1494
1494
  #define IN_PROBE(T, WIDEN) \
1495
1495
  do { \
1496
- const T *ip = (const T *) p_in; \
1496
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1497
1497
  boolean8_t *op = (boolean8_t *) p_out; \
1498
1498
  for ( ca_size_t i = 0; i < n; i++ ) { \
1499
1499
  if ( m && m[i] ) { op[i] = 0; continue; } \
@@ -1504,7 +1504,7 @@ fz_is_in_body (VALUE arg)
1504
1504
 
1505
1505
  #define IN_PROBE_FLOAT(T) \
1506
1506
  do { \
1507
- const T *ip = (const T *) p_in; \
1507
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1508
1508
  boolean8_t *op = (boolean8_t *) p_out; \
1509
1509
  for ( ca_size_t i = 0; i < n; i++ ) { \
1510
1510
  if ( m && m[i] ) { op[i] = 0; continue; } \
@@ -1661,7 +1661,7 @@ fz_locate_addr_body (VALUE arg)
1661
1661
 
1662
1662
  #define LOC_BUILD(T, WIDEN) \
1663
1663
  do { \
1664
- const T *ip = (const T *) p_r; \
1664
+ const CA_U(T) *ip = (const CA_U(T) *) p_r; \
1665
1665
  for ( ca_size_t i = 0; i < nr; i++ ) { \
1666
1666
  if ( mr && mr[i] ) { continue; } \
1667
1667
  uint64_t key = (uint64_t) (WIDEN ip[i]); \
@@ -1674,7 +1674,7 @@ fz_locate_addr_body (VALUE arg)
1674
1674
 
1675
1675
  #define LOC_BUILD_FLOAT(T) \
1676
1676
  do { \
1677
- const T *ip = (const T *) p_r; \
1677
+ const CA_U(T) *ip = (const CA_U(T) *) p_r; \
1678
1678
  for ( ca_size_t i = 0; i < nr; i++ ) { \
1679
1679
  if ( mr && mr[i] ) { continue; } \
1680
1680
  T v = ip[i]; \
@@ -1751,7 +1751,7 @@ fz_locate_addr_body (VALUE arg)
1751
1751
 
1752
1752
  #define LOC_PROBE(T, WIDEN) \
1753
1753
  do { \
1754
- const T *ip = (const T *) p_in; \
1754
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1755
1755
  const int64_t *ab = (const int64_t *) addr.p; \
1756
1756
  for ( ca_size_t i = 0; i < n; i++ ) { \
1757
1757
  ca_size_t o = base + i; \
@@ -1765,7 +1765,7 @@ fz_locate_addr_body (VALUE arg)
1765
1765
 
1766
1766
  #define LOC_PROBE_FLOAT(T) \
1767
1767
  do { \
1768
- const T *ip = (const T *) p_in; \
1768
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
1769
1769
  const int64_t *ab = (const int64_t *) addr.p; \
1770
1770
  for ( ca_size_t i = 0; i < n; i++ ) { \
1771
1771
  ca_size_t o = base + i; \
@@ -1929,7 +1929,7 @@ fz_set_relation_body (VALUE arg)
1929
1929
 
1930
1930
  #define SR(T, WIDEN) \
1931
1931
  do { \
1932
- const T *ip = (const T *) p; \
1932
+ const CA_U(T) *ip = (const CA_U(T) *) p; \
1933
1933
  for ( ca_size_t i = 0; i < n; i++ ) { \
1934
1934
  if ( m && m[i] ) { continue; } \
1935
1935
  uint64_t key = (uint64_t) (WIDEN ip[i]); \
@@ -1943,7 +1943,7 @@ fz_set_relation_body (VALUE arg)
1943
1943
 
1944
1944
  #define SR_FLOAT(T) \
1945
1945
  do { \
1946
- const T *ip = (const T *) p; \
1946
+ const CA_U(T) *ip = (const CA_U(T) *) p; \
1947
1947
  for ( ca_size_t i = 0; i < n; i++ ) { \
1948
1948
  if ( m && m[i] ) { continue; } \
1949
1949
  T v = ip[i]; \
@@ -2188,7 +2188,7 @@ fz_value_counts_flat_body (VALUE arg)
2188
2188
 
2189
2189
  #define VC_LOOP(T, WIDEN) \
2190
2190
  do { \
2191
- const T *ip = (const T *) p_in; \
2191
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
2192
2192
  for ( ca_size_t i = 0; i < n; i++ ) { \
2193
2193
  if ( m && m[i] ) { continue; } \
2194
2194
  uint64_t key = (uint64_t) (WIDEN ip[i]); \
@@ -2206,7 +2206,7 @@ fz_value_counts_flat_body (VALUE arg)
2206
2206
 
2207
2207
  #define VC_LOOP_FLOAT(T) \
2208
2208
  do { \
2209
- const T *ip = (const T *) p_in; \
2209
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
2210
2210
  for ( ca_size_t i = 0; i < n; i++ ) { \
2211
2211
  if ( m && m[i] ) { continue; } \
2212
2212
  T v = ip[i]; \
@@ -2516,7 +2516,7 @@ fz_is_mode_body (VALUE arg)
2516
2516
  /* Integer: WIDEN gives the key directly. Two passes over the fiber. */
2517
2517
  #define IM_BODY(T, WIDEN) \
2518
2518
  do { \
2519
- const T *ip = (const T *) p_in; \
2519
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
2520
2520
  boolean8_t *op = (boolean8_t *) p_out; \
2521
2521
  for ( ca_size_t i = 0; i < n; i++ ) { \
2522
2522
  if ( m && m[i] ) { continue; } \
@@ -2543,7 +2543,7 @@ fz_is_mode_body (VALUE arg)
2543
2543
  /* Float: NaN collapses to one canonical key; -0.0 / +0.0 share a key. */
2544
2544
  #define IM_BODY_FLOAT(T) \
2545
2545
  do { \
2546
- const T *ip = (const T *) p_in; \
2546
+ const CA_U(T) *ip = (const CA_U(T) *) p_in; \
2547
2547
  boolean8_t *op = (boolean8_t *) p_out; \
2548
2548
  for ( int pass = 0; pass < 2; pass++ ) { \
2549
2549
  int64_t mx = 0; \
@@ -117,7 +117,7 @@ ca_seq_is_real (VALUE v)
117
117
  /* Fill the whole array in row-major order with `step*i + offset`. */
118
118
  #define proc_seq_bang(type, from, to) \
119
119
  { \
120
- type *p = (type *)ca->ptr; \
120
+ CA_U(type) *p = (CA_U(type) *)ca->ptr; \
121
121
  ca_size_t i; \
122
122
  if ( NIL_P(roffset) && NIL_P(rstep) ) { \
123
123
  for (i=0; i<ca->elements; i++) { \
@@ -149,7 +149,7 @@ ca_seq_is_real (VALUE v)
149
149
  `outer_size` come from the enclosing scope (ca_seq_geometry). */
150
150
  #define proc_seq_bang_axis(type, from, to) \
151
151
  { \
152
- type *p = (type *)ca->ptr; \
152
+ CA_U(type) *p = (CA_U(type) *)ca->ptr; \
153
153
  ca_size_t o, k, in; \
154
154
  if ( ca_seq_is_real(rstep) || ca_seq_is_real(roffset) ) { \
155
155
  double offset = (NIL_P(roffset)) ? 0 : NUM2DBL(roffset); \
@@ -289,6 +289,9 @@ ca_seq_bang_object_body (VALUE arg)
289
289
  }
290
290
  else if ( ! NIL_P(rmethod) ) { /* a.seq(obj, :method) */
291
291
  ID id_method = SYM2ID(rmethod);
292
+ if ( ca->elements == 0 ) { /* no first cell to write */
293
+ return Qnil;
294
+ }
292
295
  *p++ = ca_seq_cell(c, rval = roffset);
293
296
  for (i=1; i<ca->elements; i++) {
294
297
  *p++ = ca_seq_cell(c, rval = rb_funcall(rval, id_method, 0));
@@ -297,6 +300,9 @@ ca_seq_bang_object_body (VALUE arg)
297
300
  else { /* a.seq(obj, step) */
298
301
  ID id_plus = rb_intern("+");
299
302
  rstep = ( NIL_P(rstep) ) ? INT2NUM(1) : rstep;
303
+ if ( ca->elements == 0 ) { /* no first cell to write */
304
+ return Qnil;
305
+ }
300
306
  *p++ = ca_seq_cell(c, rval = roffset);
301
307
  for (i=1; i<ca->elements; i++) {
302
308
  *p++ = ca_seq_cell(c, rval = rb_funcall(rval, id_plus, 1, rstep));
@@ -312,7 +312,7 @@ histogram_scatter_walk (VALUE arg)
312
312
  ca_size_t off = fiber_base;
313
313
  int masked = 0;
314
314
  for ( kk = 0; kk < (ca_size_t) M; kk++ ) {
315
- double v = *(const double *)(p + a * ss + kk * cs);
315
+ double v = *(const ca_u_float64_t *)(p + a * ss + kk * cs);
316
316
  if ( (m && m[a * sms + kk * cms]) || isnan(v) ) { masked = 1; break; }
317
317
  off += histbin_index(&axes[kk], v) * ext_stride[kk];
318
318
  }
@@ -164,8 +164,8 @@ ca_classifier_key_too_large (VALUE v, const char *where)
164
164
  Returns 1 with the position in *out, 2 for an Integer past int64 (past
165
165
  every axis, which is no longer than int64), and 0 for anything else (a
166
166
  Float with a fraction or past 2**53, NaN, Inf, a Rational, a String). */
167
- static int
168
- ca_classifier_key_position (VALUE v, ca_size_t *out)
167
+ int
168
+ ca_index_key_position (VALUE v, ca_size_t *out)
169
169
  {
170
170
  if ( FIXNUM_P(v) ) {
171
171
  *out = (ca_size_t) FIX2LONG(v);
@@ -201,7 +201,7 @@ static ca_size_t
201
201
  ca_classifier_key_int_where (VALUE v, int axis, const char *where)
202
202
  {
203
203
  ca_size_t k;
204
- switch ( ca_classifier_key_position(v, &k) ) {
204
+ switch ( ca_index_key_position(v, &k) ) {
205
205
  case 1:
206
206
  return k;
207
207
  case 2:
@@ -232,7 +232,7 @@ static ca_size_t
232
232
  ca_classifier_key_step (VALUE v, int axis)
233
233
  {
234
234
  ca_size_t k;
235
- if ( ca_classifier_key_position(v, &k) == 2 ) {
235
+ if ( ca_index_key_position(v, &k) == 2 ) {
236
236
  return rb_big_sign(v) ? (ca_size_t) INT64_MAX : (ca_size_t) INT64_MIN;
237
237
  }
238
238
  return ca_classifier_key_int(v, axis);
@@ -393,6 +393,10 @@ VALUE rb_ary_flatten_for_elements (VALUE ary, ca_size_t elements, void *ap);
393
393
  const char *ca_calling_method_name (void);
394
394
  VALUE ca_answer_as_caller (VALUE (*body)(VALUE), VALUE arg);
395
395
  long ca_integer_arg (VALUE v, const char *arg, const char *name);
396
+ /* 1 with the position of an index key (an Integer, or a Float with no
397
+ fraction while exact), 2 for an Integer past int64, 0 otherwise. */
398
+ int ca_index_key_position (VALUE v, ca_size_t *out);
399
+ void ca_refuse_without_common_type (VALUE self, VALUE other);
396
400
  ca_size_t ca_shape_elements (int8_t ndim, const ca_size_t *dim, ca_size_t bytes);
397
401
  void ca_check_index_array (VALUE v);
398
402
  VALUE ca_order_key (VALUE v, const char *name);
@@ -414,6 +418,13 @@ NORETURN(void ca_op_refuse_unimplemented (VALUE operand, int8_t data_type,
414
418
  void ca_check_rank_fits (long ndim, const char *name);
415
419
  /* The checks of carray.h inside the library, each naming the method the
416
420
  user called; the public ones stay as they are for extensions. */
421
+ /* A wrap of a caller's buffer lent to a CAObject hook (CA_FLAG_LENT), and
422
+ the mark that a view was taken of it while it was lent
423
+ (CA_FLAG_LENT_VIEWED). rb_ca_set_parent sets the second; the hook's
424
+ caller reads both when it takes the buffer back (ca_obj_object.c). */
425
+ #define CA_FLAG_LENT 2048
426
+ #define CA_FLAG_LENT_VIEWED 4096
427
+
417
428
  #define CA_CHECK_DATA_TYPE_GIVEN(data_type) \
418
429
  do { \
419
430
  int ca_dt_ = (data_type); \
@@ -728,6 +739,7 @@ int ca_op_raises_on_cell (int kind, int op_id, int8_t dt);
728
739
  gate first, and a string reference compares in its own type, padding
729
740
  included. */
730
741
  int8_t ca_query_match_type (int8_t ref, VALUE query);
742
+ VALUE ca_fixlen_widen_for_query (VALUE self, VALUE query);
731
743
 
732
744
  static inline int
733
745
  ca_query_match_applies (CArray *ref, VALUE query)