carray 2.0.1 → 3.0.1
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 +6 -25
- data/CHANGELOG.md +338 -0
- data/{NEWS.md → CHANGELOG.v1.md} +3 -0
- data/LICENSE +1 -1
- data/README.md +120 -36
- data/carray.gemspec +32 -30
- 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 +1244 -0
- data/ext/ca_bincmp_dispatch.c +76 -0
- data/ext/ca_bincmp_dispatch.h +85 -0
- data/ext/ca_binop_dispatch.c +124 -0
- data/ext/ca_binop_dispatch.h +152 -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 +239 -0
- data/ext/ca_group_iter.c +304 -0
- data/ext/ca_iter_substrate.h +325 -0
- data/ext/ca_kernel_iterator.c +4367 -0
- data/ext/ca_kernel_iterator.h +2596 -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 +839 -0
- data/ext/ca_obj_binop.c +948 -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 +967 -0
- data/ext/ca_obj_face.c +750 -0
- data/ext/ca_obj_face.h +279 -0
- data/ext/ca_obj_fake.c +239 -100
- data/ext/ca_obj_farray.c +54 -441
- data/ext/ca_obj_field.c +82 -529
- data/ext/ca_obj_fixlen_string.c +308 -0
- data/ext/ca_obj_grid.c +866 -440
- data/ext/ca_obj_meld.c +1039 -0
- data/ext/ca_obj_moncmp.c +588 -0
- data/ext/ca_obj_monop.c +1123 -0
- data/ext/ca_obj_object.c +866 -296
- data/ext/ca_obj_record.c +470 -0
- data/ext/ca_obj_reduce.c +97 -82
- data/ext/ca_obj_refer.c +593 -459
- data/ext/ca_obj_remap.c +475 -0
- data/ext/ca_obj_repeat.c +92 -477
- data/ext/ca_obj_roll.c +624 -0
- data/ext/ca_obj_select.c +344 -296
- data/ext/ca_obj_select_axis.c +1306 -0
- data/ext/ca_obj_shift.c +231 -793
- data/ext/ca_obj_source.c +78 -0
- data/ext/ca_obj_stack.c +1173 -0
- data/ext/ca_obj_stride.c +2584 -0
- data/ext/ca_obj_string.c +270 -0
- data/ext/ca_obj_tile.c +622 -0
- data/ext/ca_obj_time.c +548 -0
- data/ext/ca_obj_timedelta.c +437 -0
- data/ext/ca_obj_transpose.c +62 -516
- data/ext/ca_obj_triop.c +785 -0
- data/ext/ca_obj_window.c +1202 -565
- data/ext/ca_op_byte_swap.c +175 -0
- data/ext/ca_op_cmplx64.h +123 -0
- data/ext/ca_op_ipower.c +316 -0
- data/ext/ca_op_powi.h +88 -0
- data/ext/ca_sort_kernels.h +132 -0
- data/ext/ca_sweep_engine.c +473 -0
- data/ext/ca_sweep_engine.h +166 -0
- data/ext/ca_transform_common.c +235 -0
- data/ext/ca_triop_dispatch.c +55 -0
- data/ext/ca_triop_dispatch.h +62 -0
- data/ext/carray.h +810 -420
- data/ext/carray_access.c +873 -731
- data/ext/carray_attribute.c +98 -329
- data/ext/carray_bincount.c +255 -0
- data/ext/carray_broadcast.c +376 -0
- data/ext/carray_build_flags.h +3 -0
- data/ext/carray_call_cfunc.c +2897 -874
- data/ext/carray_call_cfunc.h +313 -0
- data/ext/carray_cast.c +1264 -315
- 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 +168 -270
- data/ext/carray_core.c +1396 -206
- 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 +1021 -0
- data/ext/carray_index_classifier.h +27 -0
- data/ext/carray_internal.h +136 -0
- data/ext/carray_kernels_bincmp.c +4446 -0
- data/ext/carray_kernels_binop.c +11001 -0
- data/ext/carray_kernels_init.c +1131 -0
- data/ext/carray_kernels_map.c +3467 -0
- data/ext/carray_kernels_moncmp.c +2097 -0
- data/ext/carray_kernels_monop.c +18313 -0
- data/ext/carray_kernels_reduce_aggregate.c +25837 -0
- data/ext/carray_kernels_reduce_boolean.c +330 -0
- data/ext/carray_kernels_reduce_cumulative.c +14593 -0
- data/ext/carray_kernels_reduce_extreme.c +16948 -0
- data/ext/carray_kernels_reduce_variance.c +3910 -0
- data/ext/carray_kernels_scan.c +3693 -0
- data/ext/carray_kernels_search.c +32138 -0
- data/ext/carray_kernels_sort.c +10626 -0
- data/ext/carray_kernels_triop.c +1392 -0
- data/ext/carray_lazy.c +737 -0
- data/ext/carray_loop.c +88 -200
- data/ext/carray_mask.c +853 -158
- 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 +1650 -0
- data/ext/carray_operator.c +1525 -320
- 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 +234 -55
- data/ext/mk_call_cfunc.rb +671 -0
- data/ext/mkkernel.rb +9096 -0
- data/ext/ruby_carray.c +211 -108
- data/ext/version.h +4 -14
- 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 +239 -0
- data/lib/carray/autoload_method_extension.rb +45 -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 +614 -0
- data/lib/carray/boolean_reduce.rb +109 -0
- data/lib/carray/categorical.rb +561 -0
- data/lib/carray/categorical_iterator.rb +1084 -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 +160 -328
- data/lib/carray/core_extensions.rb +297 -0
- data/lib/carray/data_type_extension.rb +250 -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 +642 -0
- data/lib/carray/frame/group.rb +186 -0
- data/lib/carray/frame/io.rb +321 -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 +316 -0
- data/lib/carray/frame.rb +16 -0
- data/lib/carray/fuse_source.rb +123 -0
- data/lib/carray/fusion.rb +218 -0
- data/lib/carray/histogram.rb +512 -0
- data/lib/carray/inspect.rb +37 -26
- data/lib/carray/iterator.rb +58 -349
- data/lib/carray/lazy.rb +941 -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 +52 -0
- data/lib/carray/methods/mask_duplicates.rb +41 -0
- data/lib/carray/methods/meshgrid.rb +90 -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 +161 -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 +89 -0
- data/lib/carray/serialize.rb +478 -167
- data/lib/carray/slab_iterator.rb +305 -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 +2654 -38
- data/lib/carray/window_iterator.rb +927 -0
- data/lib/carray.rb +55 -57
- data/yard-stubs/ca_obj_array.rb +385 -0
- data/yard-stubs/ca_obj_bitarray.rb +38 -0
- data/yard-stubs/ca_obj_bitfield.rb +43 -0
- data/yard-stubs/ca_obj_block.rb +73 -0
- data/yard-stubs/ca_obj_byte_swap.rb +56 -0
- data/yard-stubs/ca_obj_fake.rb +31 -0
- data/yard-stubs/ca_obj_farray.rb +32 -0
- data/yard-stubs/ca_obj_field.rb +45 -0
- data/yard-stubs/ca_obj_grid.rb +35 -0
- data/yard-stubs/ca_obj_refer.rb +72 -0
- data/yard-stubs/ca_obj_roll.rb +45 -0
- data/yard-stubs/ca_obj_shift.rb +43 -0
- data/yard-stubs/ca_obj_stride.rb +181 -0
- data/yard-stubs/ca_obj_tile.rb +29 -0
- data/yard-stubs/ca_obj_transpose.rb +40 -0
- data/yard-stubs/ca_obj_window.rb +49 -0
- data/yard-stubs/carray_access.rb +131 -0
- data/yard-stubs/carray_attribute.rb +246 -0
- data/yard-stubs/carray_broadcast.rb +37 -0
- data/yard-stubs/carray_cast.rb +489 -0
- data/yard-stubs/carray_class.rb +65 -0
- data/yard-stubs/carray_conversion.rb +76 -0
- data/yard-stubs/carray_copy.rb +79 -0
- data/yard-stubs/carray_core.rb +114 -0
- data/yard-stubs/carray_count.rb +79 -0
- data/yard-stubs/carray_element.rb +108 -0
- data/yard-stubs/carray_generate.rb +66 -0
- data/yard-stubs/carray_lazy.rb +23 -0
- data/yard-stubs/carray_loop.rb +140 -0
- data/yard-stubs/carray_mask.rb +259 -0
- data/yard-stubs/carray_math.rb +132 -0
- data/yard-stubs/carray_mathfunc.rb +45 -0
- data/yard-stubs/carray_median_percentile.rb +89 -0
- data/yard-stubs/carray_memory_view.rb +163 -0
- data/yard-stubs/carray_order.rb +312 -0
- data/yard-stubs/carray_random.rb +89 -0
- data/yard-stubs/carray_scatter.rb +106 -0
- data/yard-stubs/carray_slab.rb +57 -0
- data/yard-stubs/carray_sort.rb +163 -0
- data/yard-stubs/carray_test.rb +85 -0
- data/yard-stubs/carray_undef.rb +64 -0
- data/yard-stubs/carray_utils.rb +97 -0
- data/yard-stubs/ruby_carray.rb +193 -0
- metadata +220 -138
- 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/ca_obj_unbound_repeat.c +0 -529
- 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_copy.c
CHANGED
|
@@ -1,28 +1,38 @@
|
|
|
1
1
|
/* ---------------------------------------------------------------------------
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
Duplication and template allocation: `copy` (always-copy entity),
|
|
4
|
+
`to_ca` (entity self / view materialise sentinel), and `template`
|
|
5
|
+
(same-shape blank result, optionally retyped or block-initialised).
|
|
6
|
+
Sibling of carray_generate.c (factory builders) and carray_access.c
|
|
7
|
+
(`store_all` broadcast path used by the 0-arity template block).
|
|
8
8
|
|
|
9
9
|
---------------------------------------------------------------------------- */
|
|
10
10
|
|
|
11
11
|
#include "carray.h"
|
|
12
|
+
#include "ca_obj_face.h" /* CA_FACE_LIFT_IF_FACE */
|
|
13
|
+
#include "carray_internal.h" /* ca_gc_hold_push / ca_gc_hold_pop_to */
|
|
12
14
|
#include <stdarg.h>
|
|
13
15
|
|
|
14
16
|
/* ------------------------------------------------------------------- */
|
|
15
17
|
|
|
18
|
+
/* Allocates a fresh entity (or scalar) of the same shape, data_type,
|
|
19
|
+
* and bytes as `ca`, copies the element payload, and reproduces the
|
|
20
|
+
* mask state. Always copies even when `ca` is an entity; for view
|
|
21
|
+
* sources the data path goes through `ca_copy_data`, otherwise a flat
|
|
22
|
+
* memcpy of `ca_length(ca)` bytes.
|
|
23
|
+
*
|
|
24
|
+
* Backs `CArray#copy` and is also reachable as a C-level utility from
|
|
25
|
+
* other ext files that need an owned snapshot. */
|
|
16
26
|
CArray *
|
|
17
27
|
ca_copy (void *ap)
|
|
18
28
|
{
|
|
19
29
|
CArray *ca = (CArray *) ap;
|
|
20
30
|
CArray *co;
|
|
21
31
|
|
|
22
|
-
if ( ca_is_scalar(ca) ) {
|
|
32
|
+
if ( ca_is_scalar(ca) ) {
|
|
23
33
|
co = (CArray *) cscalar_new(ca->data_type, ca->bytes, 0);
|
|
24
34
|
}
|
|
25
|
-
else {
|
|
35
|
+
else {
|
|
26
36
|
co = carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, 0);
|
|
27
37
|
}
|
|
28
38
|
|
|
@@ -41,69 +51,148 @@ ca_copy (void *ap)
|
|
|
41
51
|
return co;
|
|
42
52
|
}
|
|
43
53
|
|
|
44
|
-
/*
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*/
|
|
48
|
-
|
|
54
|
+
/* Ruby entry for `CArray#copy`. Wraps `ca_copy` and, when `self` is a
|
|
55
|
+
* Face (e.g. CARecord), lifts the wrapped result so the derived class
|
|
56
|
+
* identity is preserved on the copy. */
|
|
49
57
|
VALUE
|
|
50
58
|
rb_ca_copy (VALUE self)
|
|
51
59
|
{
|
|
52
60
|
volatile VALUE obj;
|
|
53
|
-
CArray *ca;
|
|
61
|
+
CArray *ca, *co;
|
|
62
|
+
int guard = -1;
|
|
54
63
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
co = ca_copy(ca);
|
|
65
|
+
/* The copy holds VALUEs that so far exist only in co->ptr, and
|
|
66
|
+
ca_wrap_struct allocates. Keep them reachable until the wrapper
|
|
67
|
+
that owns them exists. */
|
|
68
|
+
if ( ca_is_object_type(co) ) {
|
|
69
|
+
guard = ca_gc_hold_push(co->ptr, co->elements);
|
|
70
|
+
}
|
|
71
|
+
obj = ca_wrap_struct(co);
|
|
72
|
+
ca_gc_hold_pop_to(guard);
|
|
73
|
+
CA_FACE_LIFT_IF_FACE(obj, self, ca);
|
|
57
74
|
return obj;
|
|
58
75
|
}
|
|
59
76
|
|
|
77
|
+
/* Reads the `writable:` keyword every `to_ca` implementation accepts.
|
|
78
|
+
* Returns non-zero when the caller demands a result whose writes reach
|
|
79
|
+
* the source, so a `to_ca` that can only hand back a copy must refuse
|
|
80
|
+
* instead of returning one silently.
|
|
81
|
+
*
|
|
82
|
+
* Exported for `to_ca` implementations written in C, in this tree and
|
|
83
|
+
* in ext gems; the Ruby-side equivalent is a `writable: false` keyword
|
|
84
|
+
* on the method definition. */
|
|
85
|
+
int
|
|
86
|
+
ca_to_ca_writable_arg (int argc, VALUE *argv)
|
|
87
|
+
{
|
|
88
|
+
VALUE opts;
|
|
89
|
+
ID kw_ids[1];
|
|
90
|
+
VALUE kw_vals[1];
|
|
91
|
+
|
|
92
|
+
rb_scan_args(argc, argv, "0:", &opts);
|
|
93
|
+
if ( NIL_P(opts) ) {
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
kw_ids[0] = rb_intern("writable");
|
|
97
|
+
rb_get_kwargs(opts, kw_ids, 0, 1, kw_vals);
|
|
98
|
+
return ( kw_vals[0] == Qundef ) ? 0 : RTEST(kw_vals[0]);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* Refusal an implementation raises when `writable: true` was asked of a
|
|
102
|
+
* `to_ca` that only ever produces a detached copy. */
|
|
103
|
+
void
|
|
104
|
+
ca_to_ca_refuse_writable (VALUE self)
|
|
105
|
+
{
|
|
106
|
+
volatile VALUE inspect = rb_inspect(CLASS_OF(self));
|
|
107
|
+
rb_raise(rb_eRuntimeError,
|
|
108
|
+
"%s#to_ca can only return a copy; it can't satisfy `writable: true'",
|
|
109
|
+
StringValuePtr(inspect));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* Ruby entry for `CArray#to_ca`. Returns `self` unchanged — for any
|
|
113
|
+
* CArray (entity or data view) the receiver is already a CArray.
|
|
114
|
+
*
|
|
115
|
+
* `writable: true` states that the caller is going to write through the
|
|
116
|
+
* result into the source. `self` shares its storage by construction, so
|
|
117
|
+
* the only way to fail here is a read-only receiver.
|
|
118
|
+
*
|
|
119
|
+
* Other classes override `to_ca` for their own semantics: a Ruby
|
|
120
|
+
* `Array` builds a new CArray, and lazy views (CAMonOp / CABinOp /
|
|
121
|
+
* CAMonCmp / CABinCmp / CALazyMarker) force evaluation into a fresh
|
|
122
|
+
* entity; both are copies and so refuse `writable: true`. When an
|
|
123
|
+
* independent owned copy is required, callers use `copy`. */
|
|
124
|
+
VALUE
|
|
125
|
+
rb_ca_to_ca (int argc, VALUE *argv, VALUE self)
|
|
126
|
+
{
|
|
127
|
+
if ( ca_to_ca_writable_arg(argc, argv) ) {
|
|
128
|
+
CArray *ca;
|
|
129
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
130
|
+
if ( ca_is_readonly(ca) ) {
|
|
131
|
+
rb_raise(rb_eRuntimeError, "can't modify read-only carray");
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return self;
|
|
135
|
+
}
|
|
136
|
+
|
|
60
137
|
/* ------------------------------------------------------------------- */
|
|
61
138
|
|
|
139
|
+
/* Allocates a fresh entity (or scalar) with the same shape,
|
|
140
|
+
* data_type, and bytes as `ca`, without a mask and with the payload
|
|
141
|
+
* left uninitialised. Used by ext code that is about to overwrite
|
|
142
|
+
* every element (e.g. kernel outputs, casts, element-wise results). */
|
|
62
143
|
CArray *
|
|
63
144
|
ca_template (void *ap)
|
|
64
145
|
{
|
|
65
146
|
CArray *ca = (CArray *) ap;
|
|
66
|
-
if ( ca_is_scalar(ca) ) {
|
|
147
|
+
if ( ca_is_scalar(ca) ) {
|
|
67
148
|
return (CArray*) cscalar_new(ca->data_type, ca->bytes, NULL);
|
|
68
149
|
}
|
|
69
|
-
else {
|
|
150
|
+
else {
|
|
70
151
|
return carray_new(ca->data_type, ca->ndim, ca->dim, ca->bytes, NULL);
|
|
71
152
|
}
|
|
72
153
|
}
|
|
73
154
|
|
|
155
|
+
/* Variant of `ca_template` that zero-fills the payload (entity path
|
|
156
|
+
* uses `carray_new_safe`). Used when the caller may leave some cells
|
|
157
|
+
* untouched and needs a defined initial value. */
|
|
74
158
|
CArray *
|
|
75
159
|
ca_template_safe (void *ap)
|
|
76
160
|
{
|
|
77
161
|
CArray *ca = (CArray *) ap;
|
|
78
|
-
if ( ca_is_scalar(ca) ) {
|
|
162
|
+
if ( ca_is_scalar(ca) ) {
|
|
79
163
|
return (CArray*) cscalar_new(ca->data_type, ca->bytes, NULL);
|
|
80
164
|
}
|
|
81
|
-
else {
|
|
165
|
+
else {
|
|
82
166
|
return carray_new_safe(ca->data_type, ca->ndim, ca->dim, ca->bytes, NULL);
|
|
83
167
|
}
|
|
84
168
|
}
|
|
85
169
|
|
|
170
|
+
/* `ca_template_safe` with an explicit target `data_type` / `bytes`
|
|
171
|
+
* (i.e. shape is taken from `ca` but the element type is overridden).
|
|
172
|
+
* The `bytes` argument is required for fixlen, ignored for numeric
|
|
173
|
+
* data types. */
|
|
86
174
|
CArray *
|
|
87
175
|
ca_template_safe2 (void *ap, int8_t data_type, ca_size_t bytes)
|
|
88
176
|
{
|
|
89
177
|
CArray *ca = (CArray *) ap;
|
|
90
178
|
CA_CHECK_DATA_TYPE(data_type);
|
|
91
|
-
if ( ca_is_scalar(ca) ) {
|
|
179
|
+
if ( ca_is_scalar(ca) ) {
|
|
92
180
|
return (CArray*) cscalar_new(data_type, bytes, NULL);
|
|
93
181
|
}
|
|
94
|
-
else {
|
|
182
|
+
else {
|
|
95
183
|
return carray_new_safe(data_type, ca->ndim, ca->dim, bytes, NULL);
|
|
96
184
|
}
|
|
97
185
|
}
|
|
98
186
|
|
|
99
|
-
/*
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
187
|
+
/* Ruby entry for `CArray#template`. Allocates a same-shape blank
|
|
188
|
+
* result, retypes it when `data_type` is given, and optionally runs a
|
|
189
|
+
* block initialiser:
|
|
190
|
+
* - block arity == 0: evaluate once, broadcast via `rb_ca_store_all`
|
|
191
|
+
* (scalar-fill fast path, the dominant idiom)
|
|
192
|
+
* - block arity != 0: per-cell walk yielding the multi-dimensional
|
|
193
|
+
* subscript as individual integer arguments
|
|
194
|
+
* The arity dispatch matches `CArray.new` (ca_obj_array.c) so the two
|
|
195
|
+
* factories behave the same for block-driven initialisation. */
|
|
107
196
|
static VALUE
|
|
108
197
|
rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
109
198
|
{
|
|
@@ -118,23 +207,51 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
|
118
207
|
|
|
119
208
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
120
209
|
|
|
121
|
-
if ( NIL_P(rtype) ) {
|
|
210
|
+
if ( NIL_P(rtype) ) {
|
|
122
211
|
co = ca_template_safe(ca);
|
|
123
212
|
obj = ca_wrap_struct(co);
|
|
124
|
-
rb_ca_data_type_inherit(obj, self);
|
|
125
213
|
}
|
|
126
214
|
else {
|
|
127
215
|
rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
|
|
128
216
|
co = ca_template_safe2(ca, data_type, bytes);
|
|
129
217
|
obj = ca_wrap_struct(co);
|
|
130
|
-
rb_ca_data_type_import(obj, rtype);
|
|
131
218
|
}
|
|
132
219
|
|
|
133
|
-
if ( rb_block_given_p() ) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
220
|
+
if ( rb_block_given_p() ) {
|
|
221
|
+
if ( rb_proc_arity(rb_block_proc()) == 0 ) {
|
|
222
|
+
volatile VALUE rval = rb_yield_values2(0, NULL);
|
|
223
|
+
if ( rval != self ) {
|
|
224
|
+
rb_ca_store_all(obj, rval);
|
|
225
|
+
}
|
|
137
226
|
}
|
|
227
|
+
else {
|
|
228
|
+
CArray *co;
|
|
229
|
+
TypedData_Get_Struct(obj, CArray, &carray_data_type, co);
|
|
230
|
+
if ( co->ndim > 0 ) {
|
|
231
|
+
ca_size_t idx[CA_RANK_MAX];
|
|
232
|
+
volatile VALUE ridx = rb_ary_new2(co->ndim);
|
|
233
|
+
ca_attach(co);
|
|
234
|
+
rb_ca_index_walk(obj, co, 0, idx, ridx, CA_LOOP_STORE);
|
|
235
|
+
ca_sync(co);
|
|
236
|
+
ca_detach(co);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
volatile VALUE rval = rb_yield_values2(0, NULL);
|
|
240
|
+
rb_ca_store_addr(obj, 0, rval);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* Preserve the Face identity only for a same-type template (no explicit
|
|
246
|
+
* retype). A retype (template(:boolean)) is a different-typed buffer and
|
|
247
|
+
* must not be re-wrapped as the Face. A same-type template of a Face with
|
|
248
|
+
* a valid blank form (CARecord carries its data_class through the struct
|
|
249
|
+
* tail; identity Faces alias same-type storage) is lifted so the class is
|
|
250
|
+
* preserved. A Face with no valid blank form (CAConstString's content-
|
|
251
|
+
* defined offset+buffer) overrides `template` in Ruby to return a plain
|
|
252
|
+
* array instead of a broken same-class shell. */
|
|
253
|
+
if ( NIL_P(rtype) ) {
|
|
254
|
+
CA_FACE_LIFT_IF_FACE(obj, self, ca);
|
|
138
255
|
}
|
|
139
256
|
|
|
140
257
|
return obj;
|
|
@@ -155,6 +272,10 @@ rb_ca_template_with_type (VALUE self, VALUE rtype, VALUE rbytes)
|
|
|
155
272
|
return rb_ca_template_method(2, args, self);
|
|
156
273
|
}
|
|
157
274
|
|
|
275
|
+
/* Picks the largest-shape CArray among `n` variadic CArray arguments
|
|
276
|
+
* and returns `template(largest)`. Used by `carray_call_cfunc.c` to
|
|
277
|
+
* size the output of vectorised scalar C-function calls, where the
|
|
278
|
+
* inputs may be a mix of scalars and arrays. */
|
|
158
279
|
VALUE
|
|
159
280
|
rb_ca_template_n (int n, ...)
|
|
160
281
|
{
|
|
@@ -194,244 +315,21 @@ rb_ca_template_n (int n, ...)
|
|
|
194
315
|
}
|
|
195
316
|
|
|
196
317
|
/* ------------------------------------------------------------------- */
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
idx[level] = offset[level];
|
|
206
|
-
idx0[level] = offset0[level];
|
|
207
|
-
memcpy(ca_ptr_at_index(ca, idx), ca_ptr_at_index(cs, idx0), size[level]*ca->bytes);
|
|
208
|
-
if ( ca->mask ) {
|
|
209
|
-
memset(ca_ptr_at_index(ca->mask, idx), 0, size[level]*sizeof(boolean8_t));
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
for (i=0; i<size[level]; i++) {
|
|
214
|
-
idx[level] = offset[level] + i;
|
|
215
|
-
idx0[level] = offset0[level] + i;
|
|
216
|
-
ca_paste_loop(ca, offset, offset0, size, cs, level+1, idx, idx0);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
318
|
+
/* [MOVED] sub-region copy `crop(offset, dst)` / `paste(offset, src)`
|
|
319
|
+
* -> lib/extras/crop_paste.rb (Ruby wrappers over CAWindow,
|
|
320
|
+
* opt-in via `require "extras/crop_paste"`, not autoloaded).
|
|
321
|
+
*
|
|
322
|
+
* The names `clip` / `clip!` now mean value clamp (clamp to a min/max
|
|
323
|
+
* range) and live in ext/carray_generate.c. The old `clip` argument
|
|
324
|
+
* order was reversed in the sub-region API, so the moved entry is
|
|
325
|
+
* renamed to `crop`; `paste` keeps its name. */
|
|
220
326
|
|
|
221
327
|
/* ------------------------------------------------------------------- */
|
|
222
328
|
|
|
223
329
|
void
|
|
224
|
-
|
|
225
|
-
{
|
|
226
|
-
CArray *ca = (CArray *) ap;
|
|
227
|
-
CArray *cs = (CArray *) sp;
|
|
228
|
-
ca_size_t size[CA_RANK_MAX];
|
|
229
|
-
ca_size_t offset0[CA_RANK_MAX];
|
|
230
|
-
ca_size_t idx[CA_RANK_MAX];
|
|
231
|
-
ca_size_t idx0[CA_RANK_MAX];
|
|
232
|
-
int8_t i;
|
|
233
|
-
|
|
234
|
-
ca_check_same_data_type(ca, cs);
|
|
235
|
-
ca_check_same_ndim(ca, cs);
|
|
236
|
-
|
|
237
|
-
for (i=0; i<ca->ndim; i++) {
|
|
238
|
-
if ( offset[i] >= 0 ) {
|
|
239
|
-
if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
|
|
240
|
-
size[i] = ca->dim[i] - offset[i];
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
size[i] = cs->dim[i];
|
|
244
|
-
}
|
|
245
|
-
offset0[i] = 0;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
|
|
249
|
-
size[i] = ca->dim[i];
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
size[i] = cs->dim[i] + offset[i];
|
|
253
|
-
}
|
|
254
|
-
offset0[i] = -offset[i];
|
|
255
|
-
offset[i] = 0;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
for (i=0; i<ca->ndim; i++) {
|
|
260
|
-
CA_CHECK_INDEX(offset[i], ca->dim[i]);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if ( ca_has_mask(cs) ) {
|
|
264
|
-
ca_create_mask(ca);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
ca_attach_n(2, ca, cs);
|
|
268
|
-
|
|
269
|
-
ca_paste_loop(ca, offset, offset0, size, cs, 0, idx, idx0);
|
|
270
|
-
|
|
271
|
-
if ( ca_has_mask(cs) ) {
|
|
272
|
-
ca_paste_loop(ca->mask, offset, offset0, size, cs->mask, 0, idx, idx0);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
ca_sync(ca);
|
|
276
|
-
ca_detach_n(2, ca, cs);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/* @overload paste (idx, ary)
|
|
280
|
-
(Copy) Pastes `ary` to `self` at the index `idx`.
|
|
281
|
-
`idx` should be Array object with the length same as `self.ndim`.
|
|
282
|
-
`ary` should have same shape with `self`.
|
|
283
|
-
*/
|
|
284
|
-
|
|
285
|
-
static VALUE
|
|
286
|
-
rb_ca_paste (VALUE self, VALUE roffset, VALUE rsrc)
|
|
330
|
+
Init_carray_copy (void)
|
|
287
331
|
{
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
int i;
|
|
291
|
-
|
|
292
|
-
rb_ca_modify(self);
|
|
293
|
-
|
|
294
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
295
|
-
|
|
296
|
-
Check_Type(roffset, T_ARRAY);
|
|
297
|
-
|
|
298
|
-
if ( RARRAY_LEN(roffset) != ca->ndim ) {
|
|
299
|
-
rb_raise(rb_eArgError,
|
|
300
|
-
"# of arguments should equal to the ndim");
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
for (i=0; i<ca->ndim; i++) {
|
|
304
|
-
offset[i] = NUM2SIZE(rb_ary_entry(roffset,i));
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
cs = ca_wrap_readonly(rsrc, ca->data_type);
|
|
308
|
-
|
|
309
|
-
ca_paste(ca, offset, cs);
|
|
310
|
-
|
|
311
|
-
return self;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
static void
|
|
316
|
-
ca_clip_loop (CArray *ca, ca_size_t *offset, ca_size_t *offset0,
|
|
317
|
-
ca_size_t *size, CArray *cs,
|
|
318
|
-
int32_t level, ca_size_t *idx, ca_size_t *idx0)
|
|
319
|
-
{
|
|
320
|
-
ca_size_t i;
|
|
321
|
-
if ( level == ca->ndim - 1 ) {
|
|
322
|
-
idx[level] = offset[level];
|
|
323
|
-
idx0[level] = offset0[level];
|
|
324
|
-
memcpy(ca_ptr_at_index(cs, idx0), ca_ptr_at_index(ca, idx), size[level]*ca->bytes);
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
for (i=0; i<size[level]; i++) {
|
|
328
|
-
idx[level] = offset[level] + i;
|
|
329
|
-
idx0[level] = offset0[level] + i;
|
|
330
|
-
ca_clip_loop(ca, offset, offset0, size, cs, level+1, idx, idx0);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/* ------------------------------------------------------------------- */
|
|
336
|
-
|
|
337
|
-
void
|
|
338
|
-
ca_clip (void *ap, ca_size_t *offset, void *sp)
|
|
339
|
-
{
|
|
340
|
-
CArray *ca = (CArray *) ap;
|
|
341
|
-
CArray *cs = (CArray *) sp;
|
|
342
|
-
ca_size_t size[CA_RANK_MAX];
|
|
343
|
-
ca_size_t offset0[CA_RANK_MAX];
|
|
344
|
-
ca_size_t idx[CA_RANK_MAX];
|
|
345
|
-
ca_size_t idx0[CA_RANK_MAX];
|
|
346
|
-
int i;
|
|
347
|
-
|
|
348
|
-
ca_check_same_data_type(ca, cs);
|
|
349
|
-
ca_check_same_ndim(ca, cs);
|
|
350
|
-
|
|
351
|
-
for (i=0; i<ca->ndim; i++) {
|
|
352
|
-
if ( offset[i] >= 0 ) {
|
|
353
|
-
if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
|
|
354
|
-
size[i] = ca->dim[i] - offset[i];
|
|
355
|
-
}
|
|
356
|
-
else {
|
|
357
|
-
size[i] = cs->dim[i];
|
|
358
|
-
}
|
|
359
|
-
offset0[i] = 0;
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
if ( ca->dim[i] <= cs->dim[i] + offset[i] ) {
|
|
363
|
-
size[i] = ca->dim[i];
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
size[i] = cs->dim[i] + offset[i];
|
|
367
|
-
}
|
|
368
|
-
offset0[i] = -offset[i];
|
|
369
|
-
offset[i] = 0;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
for (i=0; i<ca->ndim; i++) {
|
|
374
|
-
CA_CHECK_INDEX(offset[i], ca->dim[i]);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
if ( ca_has_mask(cs) ) {
|
|
378
|
-
ca_create_mask(ca);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
ca_attach_n(2, ca, cs);
|
|
382
|
-
|
|
383
|
-
ca_clip_loop(ca, offset, offset0, size, cs, 0, idx, idx0);
|
|
384
|
-
|
|
385
|
-
if ( ca_has_mask(cs) ) {
|
|
386
|
-
ca_clip_loop(ca->mask, offset, offset0, size, cs->mask, 0, idx, idx0);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
ca_sync(ca);
|
|
390
|
-
ca_detach_n(2, ca, cs);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
/* @overload clip (idx, ary)
|
|
394
|
-
(copy) Clips the data at `idx` from `self` to `ary`.
|
|
395
|
-
*/
|
|
396
|
-
|
|
397
|
-
static VALUE
|
|
398
|
-
rb_ca_clip (VALUE self, VALUE roffset, VALUE rsrc)
|
|
399
|
-
{
|
|
400
|
-
CArray *ca, *cs;
|
|
401
|
-
ca_size_t offset[CA_RANK_MAX];
|
|
402
|
-
int i;
|
|
403
|
-
|
|
404
|
-
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
405
|
-
|
|
406
|
-
Check_Type(roffset, T_ARRAY);
|
|
407
|
-
|
|
408
|
-
if ( RARRAY_LEN(roffset) != ca->ndim ) {
|
|
409
|
-
rb_raise(rb_eArgError,
|
|
410
|
-
"# of arguments should equal to the ndim");
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
for (i=0; i<ca->ndim; i++) {
|
|
414
|
-
offset[i] = NUM2SIZE(rb_ary_entry(roffset, i));
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
cs = ca_wrap_writable(rsrc, ca->data_type);
|
|
418
|
-
|
|
419
|
-
ca_clip(ca, offset, cs);
|
|
420
|
-
|
|
421
|
-
return rsrc;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/* ------------------------------------------------------------------- */
|
|
425
|
-
|
|
426
|
-
void
|
|
427
|
-
Init_carray_copy ()
|
|
428
|
-
{
|
|
429
|
-
/* CArray duplication, conversion */
|
|
430
|
-
|
|
431
|
-
rb_define_method(rb_cCArray, "to_ca", rb_ca_copy, 0);
|
|
332
|
+
rb_define_method(rb_cCArray, "to_ca", rb_ca_to_ca, -1);
|
|
333
|
+
rb_define_method(rb_cCArray, "copy", rb_ca_copy, 0);
|
|
432
334
|
rb_define_method(rb_cCArray, "template", rb_ca_template_method, -1);
|
|
433
|
-
|
|
434
|
-
rb_define_method(rb_cCArray, "clip", rb_ca_clip, 2);
|
|
435
|
-
rb_define_method(rb_cCArray, "paste", rb_ca_paste, 2);
|
|
436
335
|
}
|
|
437
|
-
|