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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +304 -0
- data/README.md +3 -4
- data/carray.gemspec +1 -1
- data/ext/ca_axis_dispatch.c +225 -0
- data/ext/ca_axis_group.c +177 -99
- data/ext/ca_binop_dispatch.c +54 -32
- data/ext/ca_binop_dispatch.h +1 -0
- data/ext/ca_categorical_iterator.c +66 -71
- data/ext/ca_compare.c +8 -2
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +27 -11
- data/ext/ca_kernel_iterator.c +663 -214
- data/ext/ca_kernel_iterator.h +231 -167
- data/ext/ca_monop_dispatch.c +4 -4
- data/ext/ca_monop_dispatch.h +4 -0
- data/ext/ca_obj_array.c +132 -22
- data/ext/ca_obj_bincmp.c +152 -121
- data/ext/ca_obj_binop.c +107 -210
- data/ext/ca_obj_bitarray.c +37 -24
- data/ext/ca_obj_bitfield.c +95 -62
- data/ext/ca_obj_block.c +1 -0
- data/ext/ca_obj_byte_swap.c +40 -40
- data/ext/ca_obj_const_string.c +96 -25
- data/ext/ca_obj_face.c +406 -64
- data/ext/ca_obj_face.h +92 -47
- data/ext/ca_obj_fake.c +21 -50
- data/ext/ca_obj_farray.c +1 -0
- data/ext/ca_obj_field.c +16 -3
- data/ext/ca_obj_fixlen_string.c +21 -21
- data/ext/ca_obj_grid.c +181 -124
- data/ext/ca_obj_meld.c +189 -107
- data/ext/ca_obj_moncmp.c +61 -61
- data/ext/ca_obj_monop.c +125 -107
- data/ext/ca_obj_object.c +543 -233
- data/ext/ca_obj_record.c +51 -16
- data/ext/ca_obj_reduce.c +5 -8
- data/ext/ca_obj_refer.c +117 -33
- data/ext/ca_obj_remap.c +57 -17
- data/ext/ca_obj_repeat.c +21 -5
- data/ext/ca_obj_roll.c +115 -11
- data/ext/ca_obj_select.c +47 -49
- data/ext/ca_obj_select_axis.c +58 -60
- data/ext/ca_obj_shift.c +22 -102
- data/ext/ca_obj_stack.c +223 -118
- data/ext/ca_obj_stride.c +195 -34
- data/ext/ca_obj_string.c +17 -18
- data/ext/ca_obj_tile.c +32 -16
- data/ext/ca_obj_time.c +23 -25
- data/ext/ca_obj_timedelta.c +21 -23
- data/ext/ca_obj_transpose.c +12 -3
- data/ext/ca_obj_triop.c +110 -117
- data/ext/ca_obj_window.c +149 -27
- data/ext/ca_op_ipower.c +24 -11
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +102 -79
- data/ext/ca_sweep_engine.h +7 -20
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +463 -0
- data/ext/carray.h +70 -27
- data/ext/carray_access.c +455 -211
- data/ext/carray_address_basis.c +177 -36
- data/ext/carray_attribute.c +45 -3
- data/ext/carray_bincount.c +32 -2
- data/ext/carray_broadcast.c +46 -14
- data/ext/carray_call_cfunc.c +0 -28
- data/ext/carray_cast.c +1444 -209
- data/ext/carray_cast_func.rb +34 -21
- data/ext/carray_conversion.c +197 -73
- data/ext/carray_copy.c +32 -11
- data/ext/carray_core.c +514 -122
- data/ext/carray_count.c +140 -87
- data/ext/carray_element.c +18 -27
- data/ext/carray_factorize.c +569 -277
- data/ext/carray_generate.c +76 -40
- data/ext/carray_histogram.c +152 -94
- data/ext/carray_hold.c +2 -1
- data/ext/carray_index_classifier.c +63 -96
- data/ext/carray_internal.h +385 -3
- data/ext/carray_lazy.c +834 -79
- data/ext/carray_loop.c +81 -65
- data/ext/carray_mask.c +682 -316
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +221 -76
- data/ext/carray_memory_view.c +254 -248
- data/ext/carray_operator.c +1089 -359
- data/ext/carray_order.c +133 -69
- data/ext/carray_partition.c +102 -56
- data/ext/carray_random.c +273 -239
- data/ext/carray_scatter.c +308 -65
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +170 -70
- data/ext/carray_sort.c +215 -218
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +99 -21
- data/ext/carray_test.c +167 -64
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_utils.c +363 -98
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +0 -2
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1076 -846
- data/ext/ruby_carray.c +7 -1
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +39 -0
- data/lib/carray/autoload_carray.rb +19 -0
- data/lib/carray/autoload_method_extension.rb +6 -0
- data/lib/carray/axis_group.rb +174 -26
- data/lib/carray/basics.rb +91 -25
- data/lib/carray/bincount_nd.rb +6 -0
- data/lib/carray/block_iterator.rb +118 -48
- data/lib/carray/boolean_reduce.rb +21 -29
- data/lib/carray/categorical.rb +94 -26
- data/lib/carray/categorical_iterator.rb +333 -826
- data/lib/carray/complex.rb +36 -29
- data/lib/carray/conditional.rb +94 -7
- data/lib/carray/const_string.rb +46 -0
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +13 -7
- data/lib/carray/frame/csv_parser.rb +589 -82
- data/lib/carray/frame/describe.rb +79 -0
- data/lib/carray/frame/frame.rb +124 -25
- data/lib/carray/frame/group.rb +189 -63
- data/lib/carray/frame/io.rb +412 -72
- data/lib/carray/frame/join.rb +134 -46
- data/lib/carray/frame/records.rb +37 -16
- data/lib/carray/frame/reshape.rb +448 -0
- data/lib/carray/frame/sort.rb +26 -2
- data/lib/carray/frame/verbs.rb +715 -48
- data/lib/carray/frame.rb +2 -0
- data/lib/carray/fuse_source.rb +111 -2
- data/lib/carray/fusion.rb +229 -38
- data/lib/carray/inspect.rb +29 -11
- data/lib/carray/iterator.rb +14 -2
- data/lib/carray/lazy.rb +54 -30
- data/lib/carray/mask_gap_fill.rb +66 -52
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +40 -7
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bincount.rb +2 -2
- data/lib/carray/methods/bit_string.rb +14 -3
- data/lib/carray/methods/composition.rb +16 -10
- data/lib/carray/methods/factorize.rb +2 -2
- data/lib/carray/methods/gather_nd.rb +13 -2
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_in.rb +117 -4
- data/lib/carray/methods/join.rb +1 -1
- data/lib/carray/methods/locate_addr.rb +177 -36
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/repeat.rb +1 -20
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +11 -2
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/runtime.rb +14 -11
- data/lib/carray/segment_iterator.rb +990 -0
- data/lib/carray/serialize.rb +197 -27
- data/lib/carray/slab_iterator.rb +51 -27
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string_operation_extension.rb +4 -3
- data/lib/carray/struct.rb +142 -51
- data/lib/carray/struct_builder.rb +110 -14
- data/lib/carray/table.rb +2 -2
- data/lib/carray/time.rb +517 -103
- data/lib/carray/window_iterator.rb +127 -72
- data/lib/carray.rb +2 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +1 -1
- data/yard-stubs/ca_obj_refer.rb +3 -3
- data/yard-stubs/ca_obj_roll.rb +0 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +1 -2
- data/yard-stubs/carray_access.rb +5 -4
- data/yard-stubs/carray_broadcast.rb +1 -1
- data/yard-stubs/carray_cast.rb +78 -43
- data/yard-stubs/carray_conversion.rb +13 -1
- data/yard-stubs/carray_copy.rb +8 -3
- data/yard-stubs/carray_core.rb +3 -3
- data/yard-stubs/carray_count.rb +9 -0
- data/yard-stubs/carray_lazy.rb +5 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +34 -10
- data/yard-stubs/carray_math.rb +25 -13
- data/yard-stubs/carray_median_percentile.rb +10 -6
- data/yard-stubs/carray_order.rb +34 -13
- data/yard-stubs/carray_scatter.rb +10 -3
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +2 -1
- data/yard-stubs/carray_sort.rb +43 -3
- data/yard-stubs/carray_test.rb +10 -0
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +11 -19
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_build_flags.h +0 -3
- data/ext/carray_config.h +0 -28
- data/ext/carray_kernels_bincmp.c +0 -4446
- data/ext/carray_kernels_binop.c +0 -11001
- data/ext/carray_kernels_init.c +0 -1131
- data/ext/carray_kernels_map.c +0 -3467
- data/ext/carray_kernels_moncmp.c +0 -2097
- data/ext/carray_kernels_monop.c +0 -18313
- data/ext/carray_kernels_reduce_aggregate.c +0 -26005
- data/ext/carray_kernels_reduce_boolean.c +0 -330
- data/ext/carray_kernels_reduce_cumulative.c +0 -14862
- data/ext/carray_kernels_reduce_extreme.c +0 -17494
- data/ext/carray_kernels_reduce_variance.c +0 -3910
- data/ext/carray_kernels_scan.c +0 -3693
- data/ext/carray_kernels_search.c +0 -32218
- data/ext/carray_kernels_sort.c +0 -10626
- data/ext/carray_kernels_triop.c +0 -1392
data/ext/ca_obj_const_string.c
CHANGED
|
@@ -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 +
|
|
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
|
-
|
|
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
|
-
/*
|
|
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
|
-
|
|
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#
|
|
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
|
-
|
|
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, "
|
|
989
|
-
|
|
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
|
-
|
|
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
|