carray 3.0.2 → 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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +304 -0
  3. data/README.md +3 -4
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +225 -0
  6. data/ext/ca_axis_group.c +177 -99
  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 +66 -71
  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 +663 -214
  14. data/ext/ca_kernel_iterator.h +231 -167
  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 +132 -22
  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 +1 -0
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +96 -25
  25. data/ext/ca_obj_face.c +406 -64
  26. data/ext/ca_obj_face.h +92 -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 +21 -21
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +189 -107
  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 +543 -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 +47 -49
  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 -118
  46. data/ext/ca_obj_stride.c +195 -34
  47. data/ext/ca_obj_string.c +17 -18
  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 +149 -27
  54. data/ext/ca_op_ipower.c +24 -11
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_sort_kernels.h +70 -0
  58. data/ext/ca_sweep_engine.c +102 -79
  59. data/ext/ca_sweep_engine.h +7 -20
  60. data/ext/ca_triop_dispatch.c +4 -1
  61. data/ext/ca_triop_dispatch.h +5 -2
  62. data/ext/caframe_csv_reader.c +463 -0
  63. data/ext/carray.h +70 -27
  64. data/ext/carray_access.c +455 -211
  65. data/ext/carray_address_basis.c +177 -36
  66. data/ext/carray_attribute.c +45 -3
  67. data/ext/carray_bincount.c +32 -2
  68. data/ext/carray_broadcast.c +46 -14
  69. data/ext/carray_call_cfunc.c +0 -28
  70. data/ext/carray_cast.c +1444 -209
  71. data/ext/carray_cast_func.rb +34 -21
  72. data/ext/carray_conversion.c +197 -73
  73. data/ext/carray_copy.c +32 -11
  74. data/ext/carray_core.c +514 -122
  75. data/ext/carray_count.c +140 -87
  76. data/ext/carray_element.c +18 -27
  77. data/ext/carray_factorize.c +569 -277
  78. data/ext/carray_generate.c +76 -40
  79. data/ext/carray_histogram.c +152 -94
  80. data/ext/carray_hold.c +2 -1
  81. data/ext/carray_index_classifier.c +63 -96
  82. data/ext/carray_internal.h +385 -3
  83. data/ext/carray_lazy.c +834 -79
  84. data/ext/carray_loop.c +81 -65
  85. data/ext/carray_mask.c +682 -316
  86. data/ext/carray_math_kernel.h +1 -0
  87. data/ext/carray_median_percentile.c +221 -76
  88. data/ext/carray_memory_view.c +254 -248
  89. data/ext/carray_operator.c +1089 -359
  90. data/ext/carray_order.c +133 -69
  91. data/ext/carray_partition.c +102 -56
  92. data/ext/carray_random.c +273 -239
  93. data/ext/carray_scatter.c +308 -65
  94. data/ext/carray_segment.c +257 -0
  95. data/ext/carray_slab.c +170 -70
  96. data/ext/carray_sort.c +215 -218
  97. data/ext/carray_sort_kernel.c +8 -1
  98. data/ext/carray_struct.c +99 -21
  99. data/ext/carray_test.c +167 -64
  100. data/ext/carray_time_text.c +1182 -0
  101. data/ext/carray_utils.c +363 -98
  102. data/ext/extconf.rb +27 -2
  103. data/ext/mk_call_cfunc.rb +0 -2
  104. data/ext/mk_pow5_table.rb +35 -0
  105. data/ext/mkkernel.rb +1076 -846
  106. data/ext/ruby_carray.c +7 -1
  107. data/ext/version.h +4 -4
  108. data/ext/version.rb +4 -2
  109. data/lib/carray/attribute.rb +39 -0
  110. data/lib/carray/autoload_carray.rb +19 -0
  111. data/lib/carray/autoload_method_extension.rb +6 -0
  112. data/lib/carray/axis_group.rb +174 -26
  113. data/lib/carray/basics.rb +91 -25
  114. data/lib/carray/bincount_nd.rb +6 -0
  115. data/lib/carray/block_iterator.rb +118 -48
  116. data/lib/carray/boolean_reduce.rb +21 -29
  117. data/lib/carray/categorical.rb +94 -26
  118. data/lib/carray/categorical_iterator.rb +333 -826
  119. data/lib/carray/complex.rb +36 -29
  120. data/lib/carray/conditional.rb +94 -7
  121. data/lib/carray/const_string.rb +46 -0
  122. data/lib/carray/frame/concat.rb +157 -6
  123. data/lib/carray/frame/convert.rb +13 -7
  124. data/lib/carray/frame/csv_parser.rb +589 -82
  125. data/lib/carray/frame/describe.rb +79 -0
  126. data/lib/carray/frame/frame.rb +124 -25
  127. data/lib/carray/frame/group.rb +189 -63
  128. data/lib/carray/frame/io.rb +412 -72
  129. data/lib/carray/frame/join.rb +134 -46
  130. data/lib/carray/frame/records.rb +37 -16
  131. data/lib/carray/frame/reshape.rb +448 -0
  132. data/lib/carray/frame/sort.rb +26 -2
  133. data/lib/carray/frame/verbs.rb +715 -48
  134. data/lib/carray/frame.rb +2 -0
  135. data/lib/carray/fuse_source.rb +111 -2
  136. data/lib/carray/fusion.rb +229 -38
  137. data/lib/carray/inspect.rb +29 -11
  138. data/lib/carray/iterator.rb +14 -2
  139. data/lib/carray/lazy.rb +54 -30
  140. data/lib/carray/mask_gap_fill.rb +66 -52
  141. data/lib/carray/math.rb +32 -19
  142. data/lib/carray/meld_reduce.rb +40 -7
  143. data/lib/carray/methods/align_addr.rb +8 -4
  144. data/lib/carray/methods/bincount.rb +2 -2
  145. data/lib/carray/methods/bit_string.rb +14 -3
  146. data/lib/carray/methods/composition.rb +16 -10
  147. data/lib/carray/methods/factorize.rb +2 -2
  148. data/lib/carray/methods/gather_nd.rb +13 -2
  149. data/lib/carray/methods/insert_block.rb +9 -14
  150. data/lib/carray/methods/is_in.rb +117 -4
  151. data/lib/carray/methods/join.rb +1 -1
  152. data/lib/carray/methods/locate_addr.rb +177 -36
  153. data/lib/carray/methods/mode.rb +18 -1
  154. data/lib/carray/methods/repeat.rb +1 -20
  155. data/lib/carray/methods/resize.rb +21 -23
  156. data/lib/carray/methods/snap.rb +34 -12
  157. data/lib/carray/methods/unique.rb +11 -2
  158. data/lib/carray/record_order.rb +208 -0
  159. data/lib/carray/runtime.rb +14 -11
  160. data/lib/carray/segment_iterator.rb +990 -0
  161. data/lib/carray/serialize.rb +197 -27
  162. data/lib/carray/slab_iterator.rb +51 -27
  163. data/lib/carray/stack.rb +10 -4
  164. data/lib/carray/string_operation_extension.rb +4 -3
  165. data/lib/carray/struct.rb +142 -51
  166. data/lib/carray/struct_builder.rb +110 -14
  167. data/lib/carray/table.rb +2 -2
  168. data/lib/carray/time.rb +517 -103
  169. data/lib/carray/window_iterator.rb +127 -72
  170. data/lib/carray.rb +2 -2
  171. data/yard-stubs/ca_obj_array.rb +4 -4
  172. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  173. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  174. data/yard-stubs/ca_obj_fake.rb +1 -1
  175. data/yard-stubs/ca_obj_field.rb +1 -1
  176. data/yard-stubs/ca_obj_refer.rb +3 -3
  177. data/yard-stubs/ca_obj_roll.rb +0 -1
  178. data/yard-stubs/ca_obj_stride.rb +10 -7
  179. data/yard-stubs/ca_obj_transpose.rb +1 -1
  180. data/yard-stubs/ca_obj_window.rb +1 -2
  181. data/yard-stubs/carray_access.rb +5 -4
  182. data/yard-stubs/carray_broadcast.rb +1 -1
  183. data/yard-stubs/carray_cast.rb +78 -43
  184. data/yard-stubs/carray_conversion.rb +13 -1
  185. data/yard-stubs/carray_copy.rb +8 -3
  186. data/yard-stubs/carray_core.rb +3 -3
  187. data/yard-stubs/carray_count.rb +9 -0
  188. data/yard-stubs/carray_lazy.rb +5 -1
  189. data/yard-stubs/carray_loop.rb +4 -1
  190. data/yard-stubs/carray_mask.rb +34 -10
  191. data/yard-stubs/carray_math.rb +25 -13
  192. data/yard-stubs/carray_median_percentile.rb +10 -6
  193. data/yard-stubs/carray_order.rb +34 -13
  194. data/yard-stubs/carray_scatter.rb +10 -3
  195. data/yard-stubs/carray_segment.rb +72 -0
  196. data/yard-stubs/carray_slab.rb +2 -1
  197. data/yard-stubs/carray_sort.rb +43 -3
  198. data/yard-stubs/carray_test.rb +10 -0
  199. data/yard-stubs/carray_utils.rb +0 -26
  200. metadata +11 -19
  201. data/ext/ca_for_each_element.h +0 -239
  202. data/ext/carray_build_flags.h +0 -3
  203. data/ext/carray_config.h +0 -28
  204. data/ext/carray_kernels_bincmp.c +0 -4446
  205. data/ext/carray_kernels_binop.c +0 -11001
  206. data/ext/carray_kernels_init.c +0 -1131
  207. data/ext/carray_kernels_map.c +0 -3467
  208. data/ext/carray_kernels_moncmp.c +0 -2097
  209. data/ext/carray_kernels_monop.c +0 -18313
  210. data/ext/carray_kernels_reduce_aggregate.c +0 -26005
  211. data/ext/carray_kernels_reduce_boolean.c +0 -330
  212. data/ext/carray_kernels_reduce_cumulative.c +0 -14862
  213. data/ext/carray_kernels_reduce_extreme.c +0 -17494
  214. data/ext/carray_kernels_reduce_variance.c +0 -3910
  215. data/ext/carray_kernels_scan.c +0 -3693
  216. data/ext/carray_kernels_search.c +0 -32218
  217. data/ext/carray_kernels_sort.c +0 -10626
  218. data/ext/carray_kernels_triop.c +0 -1392
@@ -26,11 +26,12 @@
26
26
  bytes once in logical order, without offset-sharing dedup.
27
27
 
28
28
  Sibling of ca_obj_record.c (Face + VALUE tail + custom dmark) and
29
- ca_obj_time.c (int64 Face + storage_to_scalar fast path).
29
+ ca_obj_time.c (int64 Face + storage_to_element fast path).
30
30
 
31
31
  --------------------------------------------------------------------------- */
32
32
 
33
33
  #include "carray.h"
34
+ #include "carray_internal.h"
34
35
  #include "ca_obj_face.h"
35
36
  #include <ruby/encoding.h>
36
37
 
@@ -200,18 +201,6 @@ ca_const_string_func_allocate (void *ap)
200
201
  ca->ptr = ca->parent->ptr;
201
202
  }
202
203
 
203
- static void
204
- ca_const_string_func_create_mask (void *ap)
205
- {
206
- CAConstString *ca = (CAConstString *) ap;
207
- ca_update_mask(ca->parent);
208
- if ( ! ca->parent->mask ) {
209
- ca_create_mask(ca->parent);
210
- }
211
- ca->mask = (CArray *) ca_refer_new(ca->parent->mask,
212
- CA_BOOLEAN, ca->ndim, ca->dim, 0, 0);
213
- }
214
-
215
204
  ca_operation_function_t ca_const_string_func = {
216
205
  -1, /* CA_OBJ_CONST_STRING — filled by ca_install_obj_type */
217
206
  CA_VIEW_ARRAY,
@@ -222,7 +211,7 @@ ca_operation_function_t ca_const_string_func = {
222
211
  ca_face_sync,
223
212
  ca_face_detach,
224
213
  ca_face_fill_data,
225
- ca_const_string_func_create_mask,
214
+ ca_view_func_create_mask,
226
215
  ca_face_xfer_index,
227
216
  ca_face_xfer_addrs,
228
217
  NULL, /* fold_stride: identity Face is not foldable */
@@ -255,12 +244,12 @@ ca_const_string_decode (CAConstString *ca, int64_t start, int64_t end)
255
244
  return rb_str_freeze(s);
256
245
  }
257
246
 
258
- /* storage_to_scalar in C (= skip rb_funcall on the per-cell fetch hot
247
+ /* storage_to_element in C (= skip rb_funcall on the per-cell fetch hot
259
248
  path). Since the Face surface is CA_FIXLEN (16 bytes), fetch delivers a
260
249
  16-byte raw String = the (start,end) int64 pair. Decode the buffer slice
261
250
  → frozen Ruby String (plain frozen String, no Scalar wrapper). */
262
251
  static VALUE
263
- rb_ca_const_string_storage_to_scalar (VALUE self, VALUE raw)
252
+ rb_ca_const_string_storage_to_element (VALUE self, VALUE raw)
264
253
  {
265
254
  CAConstString *ca;
266
255
  int64_t pair[2];
@@ -269,7 +258,7 @@ rb_ca_const_string_storage_to_scalar (VALUE self, VALUE raw)
269
258
 
270
259
  if ( TYPE(raw) != T_STRING || RSTRING_LEN(raw) != (long) sizeof(pair) ) {
271
260
  rb_raise(rb_eArgError,
272
- "CAConstString#storage_to_scalar: expected a %lu-byte (start,end) cell",
261
+ "CAConstString#storage_to_element: expected a %lu-byte (start,end) cell",
273
262
  (unsigned long) sizeof(pair));
274
263
  }
275
264
  memcpy(pair, RSTRING_PTR(raw), sizeof(pair));
@@ -316,8 +305,8 @@ rb_ca_const_string_wrap (VALUE parent_val, VALUE buffer, int encoding_id)
316
305
  int64_t *pair;
317
306
  boolean8_t *m;
318
307
 
319
- ca_attach(parent);
320
308
  ca_update_mask(parent);
309
+ ca_attach(parent); /* window: detached before its one raise */
321
310
  n = parent->elements;
322
311
  pair = (int64_t *) parent->ptr;
323
312
  m = parent->mask ? (boolean8_t *) parent->mask->ptr : NULL;
@@ -462,6 +451,54 @@ rb_ca_const_string_buffer (VALUE self)
462
451
 
463
452
  /* ------------------------------------------------------------------- */
464
453
 
454
+ /* to_string: the cells as a CAString over an object array of Strings, in
455
+ one pass over the buffer (shape and mask carried). */
456
+ static VALUE
457
+ rb_ca_const_string_to_string (VALUE self)
458
+ {
459
+ CAConstString *ca;
460
+ volatile VALUE vpairs, out;
461
+ CArray *pe, *co;
462
+ rb_encoding *enc;
463
+ const char *buf;
464
+ const int64_t *pair;
465
+ boolean8_t *m;
466
+ VALUE *cells;
467
+ ca_size_t i;
468
+
469
+ TypedData_Get_Struct(self, CAConstString, &catext_data_type, ca);
470
+ vpairs = rb_ca_parent(self);
471
+ TypedData_Get_Struct(vpairs, CArray, &carray_data_type, pe);
472
+ if ( ! ca_is_entity(pe) ) {
473
+ vpairs = rb_ca_copy(vpairs);
474
+ TypedData_Get_Struct(vpairs, CArray, &carray_data_type, pe);
475
+ }
476
+ enc = rb_enc_from_index(ca->encoding_id);
477
+ out = rb_carray_new(CA_OBJECT, pe->ndim, pe->dim, 0, NULL);
478
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
479
+ m = ca_has_mask(pe) ? (boolean8_t *) pe->mask->ptr : NULL;
480
+ if ( m ) {
481
+ ca_create_mask(co);
482
+ memcpy(co->mask->ptr, m, pe->elements);
483
+ }
484
+ buf = RSTRING_PTR(ca->buffer);
485
+ pair = (const int64_t *) pe->ptr;
486
+ cells = (VALUE *) co->ptr;
487
+ for (i = 0; i < pe->elements; i++) {
488
+ if ( m && m[i] ) {
489
+ continue;
490
+ }
491
+ /* out is reachable and marks its cells, so each String is held as it
492
+ is stored */
493
+ cells[i] = rb_enc_str_new(buf + pair[2 * i],
494
+ (long) ( pair[2 * i + 1] - pair[2 * i] ), enc);
495
+ }
496
+ RB_GC_GUARD(vpairs);
497
+ RB_GC_GUARD(self);
498
+ return rb_funcall(rb_const_get(rb_cObject, rb_intern("CAString")),
499
+ rb_intern("wrap"), 1, out);
500
+ }
501
+
465
502
  /* copy = compacting deep copy — the only chain-descent point in
466
503
  CAConstString. Produces a standalone CAConstString:
467
504
  - a fresh contiguous fixlen-16 (start,end) pair entity
@@ -486,8 +523,8 @@ rb_ca_const_string_copy (VALUE self)
486
523
  TypedData_Get_Struct(self, CAConstString, &catext_data_type, ca);
487
524
 
488
525
  /* materialize logical-order (start,end) pairs + mask */
489
- ca_attach((CArray *) ca);
490
526
  ca_update_mask((CArray *) ca);
527
+ ca_attach((CArray *) ca); /* window: detached before its one raise */
491
528
 
492
529
  n = ca->elements;
493
530
  src_pair = (int64_t *) ca->ptr;
@@ -567,12 +604,14 @@ typedef struct {
567
604
  ca_size_t n;
568
605
  } ca_const_string_scan_t;
569
606
 
607
+ /* Opens the scan's window; ca_const_string_scan_end closes it. What runs
608
+ between them in this file reads bytes and raises only after closing. */
570
609
  static void
571
610
  ca_const_string_scan_begin (VALUE self, ca_const_string_scan_t *s)
572
611
  {
573
612
  TypedData_Get_Struct(self, CAConstString, &catext_data_type, s->ca);
574
- ca_attach((CArray *) s->ca);
575
613
  ca_update_mask((CArray *) s->ca);
614
+ ca_attach((CArray *) s->ca); /* window: closed by ca_const_string_scan_end */
576
615
  s->off = (int64_t *) s->ca->ptr;
577
616
  s->m = s->ca->mask ? (boolean8_t *) s->ca->mask->ptr : NULL;
578
617
  s->buf = RSTRING_PTR(s->ca->buffer);
@@ -586,6 +625,37 @@ ca_const_string_scan_end (ca_const_string_scan_t *s)
586
625
  ca_detach((CArray *) s->ca);
587
626
  }
588
627
 
628
+ typedef struct {
629
+ VALUE self;
630
+ ca_const_string_scan_t *s;
631
+ } ca_const_string_scan_arg_t;
632
+
633
+ static VALUE
634
+ ca_const_string_scan_begin_body (VALUE arg)
635
+ {
636
+ ca_const_string_scan_arg_t *x = (ca_const_string_scan_arg_t *) arg;
637
+ ca_const_string_scan_begin(x->self, x->s);
638
+ return Qnil;
639
+ }
640
+
641
+ /* Begins the scans of two arrays, both or neither: when the second one's
642
+ attach raises, the first is closed before the raise goes on. */
643
+ static void
644
+ ca_const_string_scan_begin_pair (VALUE va, ca_const_string_scan_t *a,
645
+ VALUE vb, ca_const_string_scan_t *b)
646
+ {
647
+ ca_const_string_scan_arg_t x;
648
+ int tag = 0;
649
+ ca_const_string_scan_begin(va, a);
650
+ x.self = vb;
651
+ x.s = b;
652
+ rb_protect(ca_const_string_scan_begin_body, (VALUE) &x, &tag);
653
+ if ( tag ) {
654
+ ca_const_string_scan_end(a);
655
+ rb_jump_tag(tag);
656
+ }
657
+ }
658
+
589
659
  /* Resolve element i to its record bytes; returns 0 if masked.
590
660
  Storage is (start,end) int64 pairs: s->off holds 2 int64 per element,
591
661
  so element i occupies s->off[2*i] (start) .. s->off[2*i+1] (end).
@@ -740,8 +810,7 @@ rb_ca_const_string_eq (VALUE self, VALUE other)
740
810
  int64_t la = 0, lb = 0;
741
811
  ca_size_t i;
742
812
 
743
- ca_const_string_scan_begin(self, &a);
744
- ca_const_string_scan_begin(other, &b);
813
+ ca_const_string_scan_begin_pair(self, &a, other, &b);
745
814
  if ( a.n != b.n ) {
746
815
  ca_const_string_scan_end(&a);
747
816
  ca_const_string_scan_end(&b);
@@ -950,6 +1019,7 @@ rb_ca_const_string_initialize_copy (VALUE self, VALUE other)
950
1019
  {
951
1020
  CAConstString *ca, *cs;
952
1021
  TypedData_Get_Struct(self, CAConstString, &catext_data_type, ca);
1022
+ ca_check_uninitialized(ca);
953
1023
  TypedData_Get_Struct(other, CAConstString, &catext_data_type, cs);
954
1024
  /* Shallow re-setup: shares the buffer and the offset source, which is the
955
1025
  documented `dup` semantics for a view. `copy` is the compacting deep
@@ -985,11 +1055,12 @@ Init_ca_obj_const_string (void)
985
1055
  rb_define_singleton_method(rb_cCAConstString, "__build__", rb_ca_const_string_build, 2);
986
1056
  rb_define_method(rb_cCAConstString, "encoding", rb_ca_const_string_encoding, 0);
987
1057
  rb_define_method(rb_cCAConstString, "buffer", rb_ca_const_string_buffer, 0);
988
- rb_define_method(rb_cCAConstString, "storage_to_scalar",
989
- rb_ca_const_string_storage_to_scalar, 1);
1058
+ rb_define_method(rb_cCAConstString, "storage_to_element",
1059
+ rb_ca_const_string_storage_to_element, 1);
990
1060
 
991
1061
  /* copy = compacting deep copy; to_ca is the same descent point. */
992
1062
  rb_define_method(rb_cCAConstString, "copy", rb_ca_const_string_copy, 0);
1063
+ rb_define_method(rb_cCAConstString, "to_string", rb_ca_const_string_to_string, 0);
993
1064
  rb_define_method(rb_cCAConstString, "to_ca", rb_ca_const_string_to_ca, -1);
994
1065
 
995
1066
  /* native byte ops (§3.7) */
@@ -1015,7 +1086,7 @@ Init_ca_obj_const_string (void)
1015
1086
  rb_define_method(rb_cCAConstString, "__max_bytes__", rb_ca_const_string_max, 0);
1016
1087
 
1017
1088
  /* Y-pilot: Face-local C-level fast path for per-cell scalar fetch. */
1018
- ca_face_register_storage_to_scalar(CA_OBJ_CONST_STRING, rb_ca_const_string_storage_to_scalar);
1089
+ ca_face_register_storage_to_element(CA_OBJ_CONST_STRING, rb_ca_const_string_storage_to_element);
1019
1090
 
1020
1091
  /* F.S1: CAConstString's `buffer` field is per-parent (= each CAConstString holds its
1021
1092
  own frozen byte String; cell offsets index into THIS instance's