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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +205 -0
- data/carray.gemspec +1 -1
- data/ext/ca_array_pool.c +25 -1
- data/ext/ca_axis_dispatch.c +13 -20
- data/ext/ca_categorical_iterator.c +27 -20
- data/ext/ca_compare.c +4 -4
- data/ext/ca_composite_dispatch.c +9 -9
- data/ext/ca_kernel_iterator.c +6 -6
- data/ext/ca_kernel_iterator.h +112 -83
- data/ext/ca_obj_array.c +69 -19
- data/ext/ca_obj_bincmp.c +1 -0
- data/ext/ca_obj_binop.c +1 -0
- data/ext/ca_obj_bitarray.c +5 -1
- data/ext/ca_obj_bitfield.c +58 -43
- data/ext/ca_obj_byte_swap.c +2 -1
- data/ext/ca_obj_const_string.c +15 -3
- data/ext/ca_obj_face.c +42 -1
- data/ext/ca_obj_field.c +13 -3
- data/ext/ca_obj_grid.c +52 -5
- data/ext/ca_obj_monop.c +46 -10
- data/ext/ca_obj_object.c +64 -12
- data/ext/ca_obj_record.c +3 -0
- data/ext/ca_obj_reduce.c +4 -0
- data/ext/ca_obj_refer.c +18 -9
- data/ext/ca_obj_roll.c +26 -6
- data/ext/ca_obj_select.c +34 -5
- data/ext/ca_obj_shift.c +31 -7
- data/ext/ca_obj_stack.c +1 -0
- data/ext/ca_obj_stride.c +28 -19
- data/ext/ca_obj_string.c +11 -2
- data/ext/ca_obj_tile.c +27 -7
- data/ext/ca_obj_transpose.c +8 -4
- data/ext/ca_obj_triop.c +3 -0
- data/ext/ca_obj_window.c +79 -50
- data/ext/ca_op_ipower.c +4 -4
- data/ext/ca_sort_kernels.h +6 -3
- data/ext/carray.h +33 -0
- data/ext/carray_access.c +16 -3
- data/ext/carray_attribute.c +24 -0
- data/ext/carray_cast.c +243 -82
- data/ext/carray_cast_func.rb +56 -26
- data/ext/carray_conversion.c +2 -2
- data/ext/carray_core.c +3 -0
- data/ext/carray_count.c +6 -0
- data/ext/carray_element.c +9 -4
- data/ext/carray_factorize.c +20 -20
- data/ext/carray_generate.c +8 -2
- data/ext/carray_histogram.c +1 -1
- data/ext/carray_index_classifier.c +4 -4
- data/ext/carray_internal.h +12 -0
- data/ext/carray_kernels_bincmp.c +168 -168
- data/ext/carray_kernels_binop.c +900 -900
- data/ext/carray_kernels_init.c +4 -4
- data/ext/carray_kernels_moncmp.c +96 -96
- data/ext/carray_kernels_monop.c +1984 -1984
- data/ext/carray_kernels_reduce_aggregate.c +1733 -1733
- data/ext/carray_kernels_reduce_cumulative.c +642 -642
- data/ext/carray_kernels_reduce_extreme.c +1150 -1150
- data/ext/carray_kernels_reduce_variance.c +258 -258
- data/ext/carray_kernels_scan.c +128 -128
- data/ext/carray_kernels_search.c +340 -340
- data/ext/carray_kernels_sort.c +295 -304
- data/ext/carray_kernels_triop.c +114 -114
- data/ext/carray_key_windows.c +4 -0
- data/ext/carray_mask.c +45 -22
- data/ext/carray_memory_view.c +2 -2
- data/ext/carray_operator.c +5 -5
- data/ext/carray_order.c +227 -8
- data/ext/carray_random.c +18 -18
- data/ext/carray_scatter.c +24 -7
- data/ext/carray_slab.c +32 -9
- data/ext/carray_sort.c +224 -16
- data/ext/carray_sort_kernel.c +5 -7
- data/ext/carray_struct.c +35 -43
- data/ext/carray_time_text.c +4 -2
- data/ext/carray_utils.c +63 -21
- data/ext/mkkernel.rb +210 -115
- data/ext/version.h +4 -4
- data/lib/carray/attribute.rb +17 -4
- data/lib/carray/basics.rb +27 -7
- data/lib/carray/categorical.rb +30 -16
- data/lib/carray/categorical_iterator.rb +6 -6
- data/lib/carray/const_string.rb +10 -0
- data/lib/carray/data_type_extension.rb +8 -1
- data/lib/carray/fixlen_string.rb +41 -2
- data/lib/carray/frame/column_verbs.rb +4 -3
- data/lib/carray/frame/concat.rb +17 -3
- data/lib/carray/frame/frame.rb +6 -7
- data/lib/carray/frame/group.rb +100 -13
- data/lib/carray/frame/io.rb +3 -1
- data/lib/carray/fuse_source.rb +31 -2
- data/lib/carray/lazy.rb +35 -0
- data/lib/carray/methods/is_in.rb +8 -1
- data/lib/carray/segment_iterator.rb +12 -8
- data/lib/carray/serialize.rb +19 -2
- data/lib/carray/stack.rb +15 -12
- data/lib/carray/string.rb +8 -0
- data/lib/carray/string_operation_extension.rb +13 -5
- data/lib/carray/struct_builder.rb +5 -3
- data/lib/carray/time.rb +107 -68
- data/yard-stubs/ca_obj_transpose.rb +5 -4
- data/yard-stubs/carray_attribute.rb +3 -1
- data/yard-stubs/carray_cast.rb +2 -0
- data/yard-stubs/carray_conversion.rb +5 -1
- data/yard-stubs/carray_element.rb +7 -6
- data/yard-stubs/carray_mask.rb +8 -3
- data/yard-stubs/carray_math.rb +14 -4
- data/yard-stubs/carray_order.rb +100 -4
- data/yard-stubs/carray_scatter.rb +7 -5
- 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
|
|
24
|
-
|
|
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
|
-
|
|
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.
|
data/ext/carray_factorize.c
CHANGED
|
@@ -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; \
|
data/ext/carray_generate.c
CHANGED
|
@@ -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));
|
data/ext/carray_histogram.c
CHANGED
|
@@ -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
|
|
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
|
-
|
|
168
|
-
|
|
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 (
|
|
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 (
|
|
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);
|
data/ext/carray_internal.h
CHANGED
|
@@ -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)
|