carray 2.0.1 → 3.0.0
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/.yardopts +5 -25
- data/CHANGELOG.md +16 -0
- data/LICENSE +1 -1
- data/NEWS.md +3 -0
- data/README.md +128 -44
- data/carray.gemspec +22 -24
- data/ext/ca_array_pool.c +91 -0
- data/ext/ca_axis_descriptor.h +186 -0
- data/ext/ca_axis_dispatch.c +924 -0
- data/ext/ca_axis_group.c +1208 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +125 -0
- data/ext/ca_binop_dispatch.h +159 -0
- data/ext/ca_categorical_iterator.c +1375 -0
- data/ext/ca_compare.c +94 -0
- data/ext/ca_compare.h +26 -0
- data/ext/ca_composite_dispatch.c +414 -0
- data/ext/ca_composite_dispatch.h +116 -0
- data/ext/ca_for_buffer.h +96 -0
- data/ext/ca_for_each_element.h +241 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4321 -0
- data/ext/ca_kernel_iterator.h +2603 -0
- data/ext/ca_moncmp_dispatch.c +37 -0
- data/ext/ca_moncmp_dispatch.h +62 -0
- data/ext/ca_monop_dispatch.c +200 -0
- data/ext/ca_monop_dispatch.h +235 -0
- data/ext/ca_obj_array.c +355 -359
- data/ext/ca_obj_bincmp.c +809 -0
- data/ext/ca_obj_binop.c +892 -0
- data/ext/ca_obj_bitarray.c +369 -164
- data/ext/ca_obj_bitfield.c +294 -234
- data/ext/ca_obj_block.c +189 -711
- data/ext/ca_obj_byte_swap.c +766 -0
- data/ext/ca_obj_const_string.c +965 -0
- data/ext/ca_obj_face.c +670 -0
- data/ext/ca_obj_face.h +247 -0
- data/ext/ca_obj_fake.c +228 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +306 -0
- data/ext/ca_obj_grid.c +858 -440
- data/ext/ca_obj_meld.c +1034 -0
- data/ext/ca_obj_moncmp.c +569 -0
- data/ext/ca_obj_monop.c +1111 -0
- data/ext/ca_obj_object.c +772 -297
- data/ext/ca_obj_record.c +468 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +569 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +616 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1296 -0
- data/ext/ca_obj_shift.c +229 -791
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2501 -0
- data/ext/ca_obj_string.c +268 -0
- data/ext/ca_obj_tile.c +614 -0
- data/ext/ca_obj_time.c +546 -0
- data/ext/ca_obj_timedelta.c +435 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +746 -0
- data/ext/ca_obj_unbound_repeat.c +207 -240
- data/ext/ca_obj_window.c +1131 -563
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_ipower.c +319 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +430 -0
- data/ext/ca_sweep_engine.h +157 -0
- data/ext/ca_transform_common.c +228 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +795 -402
- data/ext/carray_access.c +831 -711
- data/ext/carray_attribute.c +98 -329
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +283 -0
- data/ext/carray_call_cfunc.c +1360 -828
- data/ext/carray_call_cfunc.h +160 -0
- data/ext/carray_cast.c +1212 -301
- data/ext/carray_cast_func.rb +81 -40
- data/ext/carray_class.c +53 -63
- data/ext/carray_config.h +28 -0
- data/ext/carray_conversion.c +350 -346
- data/ext/carray_copy.c +156 -268
- data/ext/carray_core.c +1341 -198
- data/ext/carray_count.c +312 -0
- data/ext/carray_data_type.c +43 -19
- data/ext/carray_element.c +585 -213
- data/ext/carray_factorize.c +2542 -0
- data/ext/carray_generate.c +230 -559
- data/ext/carray_histogram.c +490 -0
- data/ext/carray_hold.c +228 -0
- data/ext/carray_index_classifier.c +1035 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +120 -0
- data/ext/carray_kernels_bincmp.c +4445 -0
- data/ext/carray_kernels_binop.c +10979 -0
- data/ext/carray_kernels_init.c +36 -0
- data/ext/carray_kernels_map.c +3466 -0
- data/ext/carray_kernels_moncmp.c +2096 -0
- data/ext/carray_kernels_monop.c +18312 -0
- data/ext/carray_kernels_reduce_aggregate.c +25836 -0
- data/ext/carray_kernels_reduce_boolean.c +329 -0
- data/ext/carray_kernels_reduce_cumulative.c +14592 -0
- data/ext/carray_kernels_reduce_extreme.c +16947 -0
- data/ext/carray_kernels_reduce_variance.c +3909 -0
- data/ext/carray_kernels_scan.c +3692 -0
- data/ext/carray_kernels_search.c +32137 -0
- data/ext/carray_kernels_sort.c +10625 -0
- data/ext/carray_kernels_triop.c +1391 -0
- data/ext/carray_lazy.c +567 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +848 -154
- data/ext/carray_math_kernel.h +120 -0
- data/ext/carray_mathfunc.c +10 -241
- data/ext/carray_median_percentile.c +1257 -0
- data/ext/carray_memory_view.c +1625 -0
- data/ext/carray_operator.c +1526 -318
- data/ext/carray_order.c +664 -1394
- data/ext/carray_partition.c +416 -0
- data/ext/carray_random.c +518 -0
- data/ext/carray_scatter.c +357 -0
- data/ext/carray_slab.c +1219 -0
- data/ext/carray_slab.h +84 -0
- data/ext/carray_sort.c +829 -0
- data/ext/carray_sort_kernel.c +620 -0
- data/ext/carray_struct.c +695 -0
- data/ext/carray_test.c +343 -229
- data/ext/carray_undef.c +34 -17
- data/ext/carray_utils.c +175 -74
- data/ext/extconf.rb +216 -55
- data/ext/mk_call_cfunc.rb +480 -0
- data/ext/mkkernel.rb +8842 -0
- data/ext/ruby_carray.c +202 -101
- data/ext/version.h +5 -15
- data/ext/version.rb +5 -13
- data/lib/carray/arrow_tensor.rb +401 -0
- data/lib/carray/attribute.rb +166 -0
- data/lib/carray/autoload_carray.rb +220 -0
- data/lib/carray/autoload_method_extension.rb +44 -0
- data/lib/carray/axis_group.rb +711 -0
- data/lib/carray/basics.rb +481 -0
- data/lib/carray/bincount_nd.rb +358 -0
- data/lib/carray/block_iterator.rb +604 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1062 -0
- data/lib/carray/complex.rb +150 -0
- data/lib/carray/conditional.rb +216 -0
- data/lib/carray/const_string.rb +228 -0
- data/lib/carray/construct.rb +139 -328
- data/lib/carray/core_extensions.rb +240 -0
- data/lib/carray/data_type_extension.rb +233 -0
- data/lib/carray/fixlen_string.rb +95 -0
- data/lib/carray/frame/concat.rb +132 -0
- data/lib/carray/frame/convert.rb +95 -0
- data/lib/carray/frame/csv_parser.rb +211 -0
- data/lib/carray/frame/frame.rb +649 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +164 -0
- data/lib/carray/frame/join.rb +248 -0
- data/lib/carray/frame/records.rb +99 -0
- data/lib/carray/frame/sort.rb +113 -0
- data/lib/carray/frame/verbs.rb +299 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -20
- data/lib/carray/iterator.rb +57 -349
- data/lib/carray/lazy.rb +889 -0
- data/lib/carray/mask_gap_fill.rb +200 -0
- data/lib/carray/math.rb +78 -342
- data/lib/carray/meld_reduce.rb +289 -0
- data/lib/carray/methods/align_addr.rb +116 -0
- data/lib/carray/methods/bin.rb +128 -0
- data/lib/carray/methods/bincount.rb +87 -0
- data/lib/carray/methods/bit_string.rb +92 -0
- data/lib/carray/methods/broadcast.rb +63 -0
- data/lib/carray/methods/choose.rb +39 -0
- data/lib/carray/methods/composition.rb +280 -0
- data/lib/carray/methods/gather_nd.rb +206 -0
- data/lib/carray/methods/index.rb +39 -0
- data/lib/carray/methods/insert_block.rb +99 -0
- data/lib/carray/methods/is_in.rb +141 -0
- data/lib/carray/methods/join.rb +90 -0
- data/lib/carray/methods/locate_addr.rb +47 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +91 -0
- data/lib/carray/methods/mode.rb +126 -0
- data/lib/carray/methods/nunique.rb +46 -0
- data/lib/carray/methods/resize.rb +56 -0
- data/lib/carray/methods/snap.rb +156 -0
- data/lib/carray/methods/string_format.rb +57 -0
- data/lib/carray/methods/unique.rb +47 -0
- data/lib/carray/methods/value_counts.rb +71 -0
- data/lib/carray/mkmf.rb +124 -101
- data/lib/carray/runtime.rb +108 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +292 -0
- data/lib/carray/stack.rb +291 -0
- data/lib/carray/string.rb +56 -180
- data/lib/carray/string_operation_extension.rb +289 -0
- data/lib/carray/struct.rb +335 -323
- data/lib/carray/struct_builder.rb +697 -0
- data/lib/carray/table.rb +41 -2
- data/lib/carray/time.rb +2255 -38
- data/lib/carray/window_iterator.rb +655 -0
- data/lib/carray.rb +55 -57
- metadata +163 -130
- data/Rakefile +0 -51
- data/TODO.md +0 -18
- data/ext/ca_iter_block.c +0 -257
- data/ext/ca_iter_dimension.c +0 -299
- data/ext/ca_iter_window.c +0 -214
- data/ext/ca_obj_mapping.c +0 -644
- data/ext/carray_iterator.c +0 -641
- data/ext/carray_math.rb +0 -850
- data/ext/carray_numeric.c +0 -259
- data/ext/carray_sort_addr.c +0 -254
- data/ext/carray_stat.c +0 -2100
- data/ext/carray_stat_proc.rb +0 -1999
- data/ext/mkmath.rb +0 -741
- data/ext/ruby_ccomplex.c +0 -509
- data/ext/ruby_float_func.c +0 -86
- data/lib/carray/array.rb +0 -8
- data/lib/carray/autoload/autoload_base.rb +0 -19
- data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
- data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
- data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
- data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
- data/lib/carray/autoload/autoload_gem_random.rb +0 -8
- data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
- data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
- data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
- data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
- data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
- data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
- data/lib/carray/autoload/autoload_object_link.rb +0 -1
- data/lib/carray/autoload/autoload_object_pack.rb +0 -2
- data/lib/carray/autoload.rb +0 -141
- data/lib/carray/basic.rb +0 -191
- data/lib/carray/broadcast.rb +0 -101
- data/lib/carray/compose.rb +0 -315
- data/lib/carray/convert.rb +0 -115
- data/lib/carray/info.rb +0 -110
- data/lib/carray/io/imagemagick.rb +0 -235
- data/lib/carray/mask.rb +0 -102
- data/lib/carray/math/histogram.rb +0 -177
- data/lib/carray/math/recurrence.rb +0 -93
- data/lib/carray/object/ca_obj_iterator.rb +0 -50
- data/lib/carray/object/ca_obj_link.rb +0 -50
- data/lib/carray/object/ca_obj_pack.rb +0 -99
- data/lib/carray/obsolete.rb +0 -256
- data/lib/carray/ordering.rb +0 -181
- data/lib/carray/testing.rb +0 -51
- data/lib/carray/transform.rb +0 -109
- data/mailmap +0 -1
- data/misc/Methods.ja.md +0 -182
- data/misc/NOTE +0 -51
- data/spec/Classes/CABitfield_spec.rb +0 -58
- data/spec/Classes/CABlockIterator_spec.rb +0 -114
- data/spec/Classes/CABlock_spec.rb +0 -205
- data/spec/Classes/CAField_spec.rb +0 -39
- data/spec/Classes/CAGrid_spec.rb +0 -75
- data/spec/Classes/CAMap_spec.rb +0 -0
- data/spec/Classes/CAMapping_spec.rb +0 -105
- data/spec/Classes/CAObject_attribute_spec.rb +0 -33
- data/spec/Classes/CAObject_spec.rb +0 -33
- data/spec/Classes/CARefer_spec.rb +0 -93
- data/spec/Classes/CARepeat_spec.rb +0 -65
- data/spec/Classes/CASelect_spec.rb +0 -22
- data/spec/Classes/CAShift_spec.rb +0 -16
- data/spec/Classes/CAStruct_spec.rb +0 -71
- data/spec/Classes/CATranspose_spec.rb +0 -60
- data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
- data/spec/Classes/CAWindow_spec.rb +0 -54
- data/spec/Classes/CAWrap_spec.rb +0 -8
- data/spec/Classes/CArray_spec.rb +0 -184
- data/spec/Classes/CScalar_spec.rb +0 -55
- data/spec/Features/feature_130_spec.rb +0 -19
- data/spec/Features/feature_attributes_spec.rb +0 -280
- data/spec/Features/feature_boolean_spec.rb +0 -98
- data/spec/Features/feature_broadcast.rb +0 -116
- data/spec/Features/feature_cast_function.rb +0 -19
- data/spec/Features/feature_cast_spec.rb +0 -33
- data/spec/Features/feature_class_spec.rb +0 -84
- data/spec/Features/feature_complex_spec.rb +0 -42
- data/spec/Features/feature_composite_spec.rb +0 -124
- data/spec/Features/feature_convert_spec.rb +0 -46
- data/spec/Features/feature_copy_spec.rb +0 -123
- data/spec/Features/feature_creation_spec.rb +0 -84
- data/spec/Features/feature_element_spec.rb +0 -144
- data/spec/Features/feature_extream_spec.rb +0 -54
- data/spec/Features/feature_generate_spec.rb +0 -74
- data/spec/Features/feature_index_spec.rb +0 -69
- data/spec/Features/feature_mask_spec.rb +0 -580
- data/spec/Features/feature_math_spec.rb +0 -97
- data/spec/Features/feature_order_spec.rb +0 -146
- data/spec/Features/feature_ref_store_spec.rb +0 -209
- data/spec/Features/feature_serialization_spec.rb +0 -125
- data/spec/Features/feature_stat_spec.rb +0 -397
- data/spec/Features/feature_virtual_spec.rb +0 -48
- data/spec/Features/method_eq_spec.rb +0 -81
- data/spec/Features/method_is_nan_spec.rb +0 -12
- data/spec/Features/method_map_spec.rb +0 -54
- data/spec/Features/method_max_with.rb +0 -20
- data/spec/Features/method_min_with.rb +0 -19
- data/spec/Features/method_ne_spec.rb +0 -18
- data/spec/Features/method_project_spec.rb +0 -188
- data/spec/Features/method_ref_spec.rb +0 -27
- data/spec/Features/method_round_spec.rb +0 -11
- data/spec/Features/method_s_linspace_spec.rb +0 -48
- data/spec/Features/method_s_span_spec.rb +0 -14
- data/spec/Features/method_seq_spec.rb +0 -47
- data/spec/Features/method_sort_with.rb +0 -43
- data/spec/Features/method_sorted_with.rb +0 -29
- data/spec/Features/method_span_spec.rb +0 -42
- data/spec/Features/method_wrap_readonly_spec.rb +0 -43
- data/spec/UnitTest/test_CAVirtual.rb +0 -214
- data/spec/spec_all.rb +0 -10
- data/utils/ca_ase.rb +0 -21
- data/utils/ca_methods.rb +0 -15
- data/utils/cast_checker.rb +0 -30
- data/utils/convert_test.rb +0 -73
- data/utils/extract_yard.rb +0 -22
- data/utils/guess_shape.rb +0 -76
- data/utils/monkey_patch_methods.rb +0 -62
- data/utils/remove_resource_fork.sh +0 -5
data/ext/carray_loop.c
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/* ---------------------------------------------------------------------------
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Block-based iteration entry points: each / each_addr / each_index /
|
|
4
|
+
each_with_addr / each_with_index and their map! / collect! siblings.
|
|
5
|
+
Pure per-cell Ruby callback paths (= no kernel_iterator); used when
|
|
6
|
+
the caller wants Ruby block semantics over flat addresses or
|
|
7
|
+
multi-dim indices. Bound at the bottom by Init_carray_loop.
|
|
4
8
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Copyright (C) 2005-2025 Hiroki Motoyoshi
|
|
9
|
+
User-facing docs live in yard-stubs/carray_loop.rb.
|
|
8
10
|
|
|
9
11
|
---------------------------------------------------------------------------- */
|
|
10
12
|
|
|
@@ -41,141 +43,136 @@ rb_ca_s_each_index_internal (int ndim, VALUE *dim, uint8_t indim, VALUE ridx)
|
|
|
41
43
|
return ret;
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
/*
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
CArray.each_index(3,2){|i,j| print "(#{i} #{j}) " }
|
|
50
|
-
produces:
|
|
51
|
-
(0 0) (0 1) (1 0) (1 1) (2 0) (2 1) (3 0) (3 1)
|
|
52
|
-
*/
|
|
53
|
-
|
|
46
|
+
/* CArray.each_index(*shape) -- class method. Walks the cartesian
|
|
47
|
+
product of `0...d` for each `d` in `shape` and yields the index
|
|
48
|
+
tuple via rb_yield_splat (= block receives |i, j, ...| individual
|
|
49
|
+
args). Independent of any CArray instance. */
|
|
54
50
|
static VALUE
|
|
55
51
|
rb_ca_s_each_index (int ndim, VALUE *dim, VALUE self)
|
|
56
52
|
{
|
|
57
53
|
volatile VALUE ridx = rb_ary_new2(ndim);
|
|
58
|
-
#if RUBY_VERSION_CODE >= 190
|
|
59
54
|
RETURN_ENUMERATOR(self, ndim, dim);
|
|
60
|
-
#endif
|
|
61
55
|
return rb_ca_s_each_index_internal(ndim, dim, 0, ridx);
|
|
62
56
|
}
|
|
63
57
|
|
|
64
58
|
/* ------------------------------------------------------------------- */
|
|
65
59
|
|
|
66
|
-
/*
|
|
67
|
-
|
|
68
|
-
(Iterator) Iterates all the elements of the object.
|
|
69
|
-
|
|
70
|
-
*/
|
|
71
|
-
|
|
60
|
+
/* CArray#each {|elem| ... } -- yield each cell value in flat-address
|
|
61
|
+
order via rb_ca_fetch_addr (per-cell Ruby callback). */
|
|
72
62
|
static VALUE
|
|
73
63
|
rb_ca_each (VALUE self)
|
|
74
64
|
{
|
|
75
65
|
volatile VALUE ret = Qnil;
|
|
76
66
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
77
67
|
ca_size_t i;
|
|
78
|
-
#if RUBY_VERSION_CODE >= 190
|
|
79
68
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
80
|
-
#endif
|
|
81
69
|
for (i=0; i<elements; i++) {
|
|
82
70
|
ret = rb_yield(rb_ca_fetch_addr(self, i));
|
|
83
71
|
}
|
|
84
72
|
return ret;
|
|
85
73
|
}
|
|
86
74
|
|
|
87
|
-
/*
|
|
88
|
-
|
|
89
|
-
(Iterator) Iterates all the elements of the object.
|
|
90
|
-
|
|
91
|
-
*/
|
|
92
|
-
|
|
75
|
+
/* CArray#each_with_addr {|elem, addr| ... } -- yield (value, flat
|
|
76
|
+
address) pairs in flat-address order. */
|
|
93
77
|
static VALUE
|
|
94
78
|
rb_ca_each_with_addr (VALUE self)
|
|
95
79
|
{
|
|
96
80
|
volatile VALUE ret = Qnil;
|
|
97
81
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
98
82
|
ca_size_t i;
|
|
99
|
-
#if RUBY_VERSION_CODE >= 190
|
|
100
83
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
101
|
-
#endif
|
|
102
84
|
for (i=0; i<elements; i++) {
|
|
103
85
|
ret = rb_yield_values(2, rb_ca_fetch_addr(self, i), SIZE2NUM(i));
|
|
104
86
|
}
|
|
105
87
|
return ret;
|
|
106
88
|
}
|
|
107
89
|
|
|
108
|
-
/*
|
|
109
|
-
|
|
110
|
-
(Iterator) Iterates all address of the object.
|
|
111
|
-
*/
|
|
112
|
-
|
|
90
|
+
/* CArray#each_addr {|addr| ... } -- yield each flat address
|
|
91
|
+
`0...self.elements` in order; does not fetch the value. */
|
|
113
92
|
static VALUE
|
|
114
93
|
rb_ca_each_addr (VALUE self)
|
|
115
94
|
{
|
|
116
95
|
volatile VALUE ret = Qnil;
|
|
117
96
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
118
97
|
ca_size_t i;
|
|
119
|
-
#if RUBY_VERSION_CODE >= 190
|
|
120
98
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
121
|
-
#endif
|
|
122
99
|
for (i=0; i<elements; i++) {
|
|
123
100
|
ret = rb_yield(SIZE2NUM(i));
|
|
124
101
|
}
|
|
125
102
|
return ret;
|
|
126
103
|
}
|
|
127
104
|
|
|
128
|
-
|
|
129
|
-
|
|
105
|
+
/* Unified recursive walk over all multi-dimensional indices. mode
|
|
106
|
+
selects the per-cell action, so each_index / each_with_index /
|
|
107
|
+
map_index! / map_with_index! share this single recursion:
|
|
108
|
+
CA_LOOP_WITH_VALUE -- yield the element value alongside the index
|
|
109
|
+
CA_LOOP_STORE -- store the block result back (map! family)
|
|
110
|
+
Construction-block sugar in rb_ca_initialize also reuses this walk
|
|
111
|
+
in CA_LOOP_STORE mode (= map_index! semantics).
|
|
112
|
+
|
|
113
|
+
Called by rb_ca_each_index / _each_with_index / _map_index_bang /
|
|
114
|
+
_map_with_index_bang here, and by rb_ca_initialize in
|
|
115
|
+
ext/ca_obj_array.c. */
|
|
116
|
+
VALUE
|
|
117
|
+
rb_ca_index_walk (VALUE self, CArray *ca, int8_t level,
|
|
118
|
+
ca_size_t *idx, VALUE ridx, int mode)
|
|
130
119
|
{
|
|
131
120
|
volatile VALUE ret = Qnil;
|
|
132
|
-
CArray *ca;
|
|
133
121
|
ca_size_t i;
|
|
134
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
135
122
|
if ( level == ca->ndim - 1 ) {
|
|
136
123
|
for (i=0; i<ca->dim[level]; i++) {
|
|
124
|
+
volatile VALUE obj;
|
|
125
|
+
idx[level] = i;
|
|
137
126
|
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
138
|
-
|
|
127
|
+
/* CAREFUL: the subscript is yielded as individual arguments
|
|
128
|
+
(rb_yield_values2), not as a single Array. This lets |i, j|
|
|
129
|
+
work uniformly in 1-D and N-D; the single-Array form forced
|
|
130
|
+
1-D users to write |(i)| or |i,| and silently stored the
|
|
131
|
+
wrapping Array into integer cells when omitted. Block forms
|
|
132
|
+
that want the whole subscript should write |*idx|. */
|
|
133
|
+
if ( mode & CA_LOOP_WITH_VALUE ) {
|
|
134
|
+
int argc = (int)ca->ndim + 1;
|
|
135
|
+
VALUE *argv = ALLOCA_N(VALUE, argc);
|
|
136
|
+
argv[0] = rb_ca_fetch_index(self, idx);
|
|
137
|
+
MEMCPY(argv + 1, RARRAY_CONST_PTR(ridx), VALUE, ca->ndim);
|
|
138
|
+
obj = rb_yield_values2(argc, argv);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
obj = rb_yield_values2((int)ca->ndim, RARRAY_CONST_PTR(ridx));
|
|
142
|
+
}
|
|
143
|
+
if ( mode & CA_LOOP_STORE ) {
|
|
144
|
+
rb_ca_store_index(self, idx, obj);
|
|
145
|
+
}
|
|
146
|
+
ret = obj;
|
|
139
147
|
}
|
|
140
148
|
}
|
|
141
149
|
else {
|
|
142
150
|
for (i=0; i<ca->dim[level]; i++) {
|
|
151
|
+
idx[level] = i;
|
|
143
152
|
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
144
|
-
ret =
|
|
153
|
+
ret = rb_ca_index_walk(self, ca, level+1, idx, ridx, mode);
|
|
145
154
|
}
|
|
146
155
|
}
|
|
147
156
|
return ret;
|
|
148
157
|
}
|
|
149
158
|
|
|
150
|
-
/*
|
|
151
|
-
|
|
152
|
-
(Iterator) Iterates all index of the object.
|
|
153
|
-
|
|
154
|
-
CArray.int(3,2).each_index(){|i,j| print "(#{i} #{j}) " }
|
|
155
|
-
|
|
156
|
-
<em>produces:</em>
|
|
157
|
-
|
|
158
|
-
(0 0) (0 1) (1 0) (1 1) (2 0) (2 1) (3 0) (3 1)
|
|
159
|
-
|
|
160
|
-
*/
|
|
161
|
-
|
|
159
|
+
/* CArray#each_index {|i, j, ...| ... } -- yield each multi-dim index
|
|
160
|
+
of self in row-major order via rb_ca_index_walk. */
|
|
162
161
|
static VALUE
|
|
163
162
|
rb_ca_each_index (VALUE self)
|
|
164
163
|
{
|
|
164
|
+
CArray *ca;
|
|
165
|
+
ca_size_t idx[CA_RANK_MAX];
|
|
165
166
|
volatile VALUE ridx;
|
|
166
|
-
int8_t ndim = NUM2INT(rb_ca_ndim(self));
|
|
167
|
-
ridx = rb_ary_new2(ndim);
|
|
168
|
-
#if RUBY_VERSION_CODE >= 190
|
|
169
167
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
169
|
+
ridx = rb_ary_new2(ca->ndim);
|
|
170
|
+
return rb_ca_index_walk(self, ca, 0, idx, ridx, 0);
|
|
172
171
|
}
|
|
173
172
|
|
|
174
|
-
/*
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
*/
|
|
178
|
-
|
|
173
|
+
/* CArray#map! {|elem| ... } -- yield each cell value, store the
|
|
174
|
+
block's return back at the same flat address. Mutates self;
|
|
175
|
+
attach / sync / detach around the loop for view-safety. */
|
|
179
176
|
static VALUE
|
|
180
177
|
rb_ca_map_bang (VALUE self)
|
|
181
178
|
{
|
|
@@ -183,9 +180,7 @@ rb_ca_map_bang (VALUE self)
|
|
|
183
180
|
CArray *ca;
|
|
184
181
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
185
182
|
ca_size_t i;
|
|
186
|
-
#if RUBY_VERSION_CODE >= 190
|
|
187
183
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
188
|
-
#endif
|
|
189
184
|
rb_ca_modify(self);
|
|
190
185
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
191
186
|
ca_attach(ca);
|
|
@@ -198,164 +193,65 @@ rb_ca_map_bang (VALUE self)
|
|
|
198
193
|
return self;
|
|
199
194
|
}
|
|
200
195
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
{
|
|
205
|
-
volatile VALUE ret = Qnil;
|
|
206
|
-
CArray *ca;
|
|
207
|
-
ca_size_t i;
|
|
208
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
209
|
-
if ( level == ca->ndim - 1 ) {
|
|
210
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
211
|
-
idx[level] = i;
|
|
212
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
213
|
-
ret = rb_yield_values(2, rb_ca_fetch_index(self, idx),
|
|
214
|
-
rb_obj_clone(ridx));
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
else {
|
|
218
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
219
|
-
idx[level] = i;
|
|
220
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
221
|
-
ret = rb_ca_each_with_index_internal(self, level+1, idx, ridx);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return ret;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/* @overload each_with_index () {|elem, idx| ... }
|
|
228
|
-
|
|
229
|
-
[TBD]
|
|
230
|
-
|
|
231
|
-
*/
|
|
232
|
-
|
|
196
|
+
/* CArray#each_with_index {|elem, i, j, ...| ... } -- yield each cell
|
|
197
|
+
value followed by its multi-dim index components (individual args;
|
|
198
|
+
see rb_ca_index_walk header). */
|
|
233
199
|
static VALUE
|
|
234
200
|
rb_ca_each_with_index (VALUE self)
|
|
235
201
|
{
|
|
236
|
-
|
|
202
|
+
CArray *ca;
|
|
237
203
|
ca_size_t idx[CA_RANK_MAX];
|
|
238
|
-
|
|
239
|
-
#if RUBY_VERSION_CODE >= 190
|
|
204
|
+
volatile VALUE ridx;
|
|
240
205
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
241
|
-
#endif
|
|
242
|
-
rb_ca_modify(self);
|
|
243
|
-
ridx = rb_ary_new2(ndim);
|
|
244
|
-
ret = rb_ca_each_with_index_internal(self, 0, idx, ridx);
|
|
245
|
-
return ret;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
static void
|
|
250
|
-
rb_ca_map_with_index_bang_internal (VALUE self,
|
|
251
|
-
int8_t level, ca_size_t *idx, VALUE ridx)
|
|
252
|
-
{
|
|
253
|
-
CArray *ca;
|
|
254
|
-
ca_size_t i;
|
|
255
206
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
259
|
-
idx[level] = i;
|
|
260
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
261
|
-
obj = rb_yield_values(2, rb_ca_fetch_index(self, idx),
|
|
262
|
-
rb_obj_clone(ridx));
|
|
263
|
-
rb_ca_store_index(self, idx, obj);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
268
|
-
idx[level] = i;
|
|
269
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
270
|
-
rb_ca_map_with_index_bang_internal(self, level+1, idx, ridx);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
207
|
+
ridx = rb_ary_new2(ca->ndim);
|
|
208
|
+
return rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE);
|
|
273
209
|
}
|
|
274
210
|
|
|
275
|
-
/* @overload map_with_index () {|elem, idx| ... }
|
|
276
|
-
|
|
277
|
-
[TBD]
|
|
278
|
-
|
|
279
|
-
*/
|
|
280
211
|
|
|
212
|
+
/* CArray#map_with_index! {|elem, i, j, ...| ... } -- yield each cell
|
|
213
|
+
value with its multi-dim index components, store the block's
|
|
214
|
+
return back. Mutates self. */
|
|
281
215
|
static VALUE
|
|
282
216
|
rb_ca_map_with_index_bang (VALUE self)
|
|
283
217
|
{
|
|
284
|
-
volatile VALUE ridx;
|
|
285
218
|
CArray *ca;
|
|
286
219
|
ca_size_t idx[CA_RANK_MAX];
|
|
287
|
-
|
|
288
|
-
#if RUBY_VERSION_CODE >= 190
|
|
220
|
+
volatile VALUE ridx;
|
|
289
221
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
290
|
-
#endif
|
|
291
222
|
rb_ca_modify(self);
|
|
292
223
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
293
224
|
ca_attach(ca);
|
|
294
|
-
ridx = rb_ary_new2(ndim);
|
|
295
|
-
|
|
225
|
+
ridx = rb_ary_new2(ca->ndim);
|
|
226
|
+
rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_WITH_VALUE | CA_LOOP_STORE);
|
|
296
227
|
ca_sync(ca);
|
|
297
228
|
ca_detach(ca);
|
|
298
229
|
return self;
|
|
299
230
|
}
|
|
300
231
|
|
|
301
232
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
{
|
|
306
|
-
CArray *ca;
|
|
307
|
-
ca_size_t i;
|
|
308
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
309
|
-
if ( level == ca->ndim - 1 ) {
|
|
310
|
-
volatile VALUE obj;
|
|
311
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
312
|
-
idx[level] = i;
|
|
313
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
314
|
-
obj = rb_yield_splat(rb_obj_clone(ridx));
|
|
315
|
-
rb_ca_store_index(self, idx, obj);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
for (i=0; i<ca->dim[level]; i++) {
|
|
320
|
-
idx[level] = i;
|
|
321
|
-
rb_ary_store(ridx, level, SIZE2NUM(i));
|
|
322
|
-
rb_ca_map_index_bang_internal(self, level+1, idx, ridx);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/* @overload map_index! () {|idx| ... }
|
|
328
|
-
|
|
329
|
-
[TBD]
|
|
330
|
-
|
|
331
|
-
*/
|
|
332
|
-
|
|
233
|
+
/* CArray#map_index! {|i, j, ...| ... } -- yield each multi-dim index
|
|
234
|
+
(no value), store the block's return back at that cell. Used by
|
|
235
|
+
the construction-block sugar in CArray.new (rb_ca_initialize). */
|
|
333
236
|
static VALUE
|
|
334
237
|
rb_ca_map_index_bang (VALUE self)
|
|
335
238
|
{
|
|
336
|
-
volatile VALUE ridx;
|
|
337
239
|
CArray *ca;
|
|
338
240
|
ca_size_t idx[CA_RANK_MAX];
|
|
339
|
-
|
|
340
|
-
#if RUBY_VERSION_CODE >= 190
|
|
241
|
+
volatile VALUE ridx;
|
|
341
242
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
342
|
-
#endif
|
|
343
243
|
rb_ca_modify(self);
|
|
344
244
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
345
245
|
ca_attach(ca);
|
|
346
|
-
ridx = rb_ary_new2(ndim);
|
|
347
|
-
|
|
246
|
+
ridx = rb_ary_new2(ca->ndim);
|
|
247
|
+
rb_ca_index_walk(self, ca, 0, idx, ridx, CA_LOOP_STORE);
|
|
348
248
|
ca_sync(ca);
|
|
349
249
|
ca_detach(ca);
|
|
350
250
|
return self;
|
|
351
251
|
}
|
|
352
252
|
|
|
353
|
-
/*
|
|
354
|
-
|
|
355
|
-
[TBD]
|
|
356
|
-
|
|
357
|
-
*/
|
|
358
|
-
|
|
253
|
+
/* CArray#map_with_addr! {|elem, addr| ... } -- yield (value, flat
|
|
254
|
+
address), store the block's return at that address. */
|
|
359
255
|
static VALUE
|
|
360
256
|
rb_ca_map_with_addr_bang (VALUE self)
|
|
361
257
|
{
|
|
@@ -363,9 +259,7 @@ rb_ca_map_with_addr_bang (VALUE self)
|
|
|
363
259
|
CArray *ca;
|
|
364
260
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
365
261
|
ca_size_t i;
|
|
366
|
-
#if RUBY_VERSION_CODE >= 190
|
|
367
262
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
368
|
-
#endif
|
|
369
263
|
rb_ca_modify(self);
|
|
370
264
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
371
265
|
ca_attach(ca);
|
|
@@ -379,12 +273,8 @@ rb_ca_map_with_addr_bang (VALUE self)
|
|
|
379
273
|
}
|
|
380
274
|
|
|
381
275
|
|
|
382
|
-
/*
|
|
383
|
-
|
|
384
|
-
[TBD]
|
|
385
|
-
|
|
386
|
-
*/
|
|
387
|
-
|
|
276
|
+
/* CArray#map_addr! {|addr| ... } -- yield each flat address (no
|
|
277
|
+
value), store the block's return at that address. */
|
|
388
278
|
static VALUE
|
|
389
279
|
rb_ca_map_addr_bang (VALUE self)
|
|
390
280
|
{
|
|
@@ -392,9 +282,7 @@ rb_ca_map_addr_bang (VALUE self)
|
|
|
392
282
|
CArray *ca;
|
|
393
283
|
ca_size_t elements = NUM2SIZE(rb_ca_elements(self));
|
|
394
284
|
ca_size_t i;
|
|
395
|
-
#if RUBY_VERSION_CODE >= 190
|
|
396
285
|
RETURN_ENUMERATOR(self, 0, 0);
|
|
397
|
-
#endif
|
|
398
286
|
rb_ca_modify(self);
|
|
399
287
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
400
288
|
ca_attach(ca);
|
|
@@ -409,7 +297,7 @@ rb_ca_map_addr_bang (VALUE self)
|
|
|
409
297
|
|
|
410
298
|
|
|
411
299
|
void
|
|
412
|
-
Init_carray_loop ()
|
|
300
|
+
Init_carray_loop (void)
|
|
413
301
|
{
|
|
414
302
|
rb_define_singleton_method(rb_cCArray, "each_index", rb_ca_s_each_index, -1);
|
|
415
303
|
|