carray 2.0.0 → 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 +774 -298
- 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 +230 -792
- 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 +208 -241
- 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 -330
- 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 +1342 -199
- 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 +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 +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/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/Classes/ex1.rb +0 -46
- 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/ca_obj_block.c
CHANGED
|
@@ -1,22 +1,76 @@
|
|
|
1
1
|
/* ---------------------------------------------------------------------------
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
CABlock: a CAStride view that exposes a rectangular sub-array of the
|
|
4
|
+
parent with per-axis start / step / count. Layout is the CAStride
|
|
5
|
+
prefix (dim, strides) plus a CABlock-specific tail (start, step,
|
|
6
|
+
count, size0) that captures the unstrided "what we slice from"
|
|
7
|
+
geometry — needed so iterators can mutate start[] in place and so
|
|
8
|
+
create_mask can reconstruct an aligned mask block.
|
|
9
|
+
|
|
10
|
+
Storage owns 6 * ndim ca_size_t cells (dim + strides + start + step
|
|
11
|
+
+ count + size0), allocated either through the pool framework
|
|
12
|
+
(single buffer via _pool) or, when the pool is not wired, through
|
|
13
|
+
six ALLOC_N calls in ca_block_setup. Both layouts give the same
|
|
14
|
+
byte total; the pool path is preferred and the ALLOC_N fallback
|
|
15
|
+
remains until all callsites are migrated.
|
|
8
16
|
|
|
9
17
|
---------------------------------------------------------------------------- */
|
|
10
18
|
|
|
11
19
|
#include "carray.h"
|
|
20
|
+
#include "carray_internal.h" /* per-obj_type view constructors */
|
|
21
|
+
|
|
22
|
+
extern ca_operation_function_t ca_stride_func;
|
|
23
|
+
|
|
24
|
+
VALUE rb_cCABlock;
|
|
25
|
+
VALUE rb_cCABlockMask;
|
|
26
|
+
|
|
27
|
+
static ca_operation_function_t ca_block_func; /* filled at Init time */
|
|
28
|
+
|
|
29
|
+
static size_t
|
|
30
|
+
ca_block_dsize (const void *ap)
|
|
31
|
+
{
|
|
32
|
+
const CABlock *ca = (const CABlock *) ap;
|
|
33
|
+
return sizeof(CABlock) + 6 * ca->ndim * sizeof(ca_size_t);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Pool framework hooks for CABlock. Overrides the CAStride base
|
|
37
|
+
hooks: where CAStride owns 2*ndim cells (dim + strides), CABlock
|
|
38
|
+
owns 6*ndim (dim + strides + start + step + count + size0).
|
|
39
|
+
CAREFUL: the first 2*ndim slots must stay layout-compatible with
|
|
40
|
+
ca_stride_pool_init so the base ca_stride_setup pool branch finds
|
|
41
|
+
dim / strides at the same offsets. See
|
|
42
|
+
devel/PROPOSAL_CARRAY_POOL_STANDARDIZATION.md. */
|
|
43
|
+
static size_t
|
|
44
|
+
ca_block_pool_bytes (int8_t ndim)
|
|
45
|
+
{
|
|
46
|
+
ca_size_t n = (ndim > 0) ? ndim : 1;
|
|
47
|
+
return 6 * (size_t) n * sizeof(ca_size_t);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static void
|
|
51
|
+
ca_block_pool_init (void *ap, int8_t ndim)
|
|
52
|
+
{
|
|
53
|
+
CABlock *ca = (CABlock *) ap;
|
|
54
|
+
ca_size_t n = (ndim > 0) ? ndim : 1;
|
|
55
|
+
ca_size_t *base = (ca_size_t *) ca->_pool;
|
|
56
|
+
/* CAStride prefix (dim, strides) at offsets 0, n -- the offsets must
|
|
57
|
+
match ca_stride_pool_init exactly. */
|
|
58
|
+
ca->dim = base + 0 * n;
|
|
59
|
+
ca->strides = base + 1 * n;
|
|
60
|
+
/* CABlock tail (start, step, count, size0). */
|
|
61
|
+
ca->start = base + 2 * n;
|
|
62
|
+
ca->step = base + 3 * n;
|
|
63
|
+
ca->count = base + 4 * n;
|
|
64
|
+
ca->size0 = base + 5 * n;
|
|
65
|
+
}
|
|
12
66
|
|
|
13
67
|
const rb_data_type_t cablock_data_type = {
|
|
14
|
-
.parent = &
|
|
68
|
+
.parent = &castride_data_type,
|
|
15
69
|
.wrap_struct_name = "CABlock",
|
|
16
70
|
.function = {
|
|
17
71
|
.dmark = ca_mark,
|
|
18
72
|
.dfree = ca_free,
|
|
19
|
-
.dsize =
|
|
73
|
+
.dsize = ca_block_dsize,
|
|
20
74
|
.dcompact = NULL
|
|
21
75
|
},
|
|
22
76
|
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
@@ -28,281 +82,134 @@ const rb_data_type_t cablock_mask_data_type = {
|
|
|
28
82
|
.function = {
|
|
29
83
|
.dmark = NULL,
|
|
30
84
|
.dfree = ca_free_nop,
|
|
31
|
-
.dsize =
|
|
85
|
+
.dsize = ca_block_dsize,
|
|
32
86
|
.dcompact = NULL
|
|
33
87
|
},
|
|
34
88
|
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
35
89
|
};
|
|
36
90
|
|
|
37
|
-
|
|
38
|
-
|
|
91
|
+
/* ------------------------------------------------------------------- */
|
|
92
|
+
|
|
93
|
+
/* Recompute base_offset from offset / start[] / size0[] / bytes.
|
|
94
|
+
Public because the per-cell iterators (CABlockIterator in
|
|
95
|
+
ext/ca_iter_block.c) mutate start[] in place between yields and
|
|
96
|
+
need to keep the CAStride prefix consistent with the new origin. */
|
|
97
|
+
void
|
|
98
|
+
ca_block_sync_base_offset (CABlock *cb)
|
|
99
|
+
{
|
|
100
|
+
ca_size_t n = cb->offset;
|
|
101
|
+
ca_size_t suffix = 1;
|
|
102
|
+
int8_t k;
|
|
103
|
+
for (k = cb->ndim - 1; k >= 0; k--) {
|
|
104
|
+
n += cb->start[k] * suffix;
|
|
105
|
+
suffix *= cb->size0[k];
|
|
106
|
+
}
|
|
107
|
+
cb->base_offset = n * cb->bytes;
|
|
108
|
+
}
|
|
39
109
|
|
|
40
|
-
|
|
110
|
+
int
|
|
41
111
|
ca_block_setup (CABlock *ca, CArray *parent, int8_t ndim, ca_size_t *dim,
|
|
42
|
-
|
|
112
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count,
|
|
113
|
+
ca_size_t offset)
|
|
43
114
|
{
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
ca_size_t
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
bytes = parent->bytes;
|
|
52
|
-
|
|
53
|
-
elements = 1;
|
|
54
|
-
for (i=0; i<ndim; i++) {
|
|
55
|
-
if ( count[i] < 0 ) {
|
|
115
|
+
ca_size_t strides[CA_RANK_MAX];
|
|
116
|
+
ca_size_t base_offset_elements;
|
|
117
|
+
ca_size_t suffix;
|
|
118
|
+
int8_t i;
|
|
119
|
+
|
|
120
|
+
for (i = 0; i < ndim; i++) {
|
|
121
|
+
if (count[i] < 0) {
|
|
56
122
|
rb_raise(rb_eIndexError,
|
|
57
123
|
"invalid size for %i-th dimension (negative)", i);
|
|
58
124
|
}
|
|
59
|
-
elements *= count[i];
|
|
60
125
|
}
|
|
61
126
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
127
|
+
/* strides[k] = step[k] * Pi_{j>k} size0[j] * parent->bytes */
|
|
128
|
+
suffix = parent->bytes;
|
|
129
|
+
for (i = ndim - 1; i >= 0; i--) {
|
|
130
|
+
strides[i] = step[i] * suffix;
|
|
131
|
+
suffix *= dim[i]; /* dim is parent->dim here (= the block's size0) */
|
|
67
132
|
}
|
|
68
133
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
134
|
+
/* base_offset (in parent elements) = offset + Sigma start[k] * Pi_{j>k} dim[j] */
|
|
135
|
+
base_offset_elements = offset;
|
|
136
|
+
{
|
|
137
|
+
ca_size_t s = 1;
|
|
138
|
+
for (i = ndim - 1; i >= 0; i--) {
|
|
139
|
+
base_offset_elements += start[i] * s;
|
|
140
|
+
s *= dim[i];
|
|
141
|
+
}
|
|
74
142
|
}
|
|
75
143
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
ca->bytes = bytes;
|
|
81
|
-
ca->elements = elements;
|
|
82
|
-
ca->ptr = NULL;
|
|
83
|
-
ca->mask = NULL;
|
|
84
|
-
ca->parent = parent;
|
|
85
|
-
ca->attach = 0;
|
|
86
|
-
ca->nosync = 0;
|
|
87
|
-
ca->offset = offset;
|
|
88
|
-
ca->start = ALLOC_N(ca_size_t, ndim);
|
|
89
|
-
ca->step = ALLOC_N(ca_size_t, ndim);
|
|
90
|
-
ca->count = ALLOC_N(ca_size_t, ndim);
|
|
91
|
-
ca->size0 = ALLOC_N(ca_size_t, ndim);
|
|
92
|
-
|
|
93
|
-
ca->maxdim_index = maxdim_index;
|
|
94
|
-
ca->maxdim_step = maxdim_step;
|
|
95
|
-
ca->maxdim_step0 = maxdim_step0;
|
|
96
|
-
|
|
97
|
-
/* printf("maxdim: %i %i %i\n", maxdim_index, maxdim_step, maxdim_step0); */
|
|
98
|
-
|
|
99
|
-
ca->dim = ca->count; /* ca->dim should not be free */
|
|
144
|
+
/* CAREFUL: the CABlock tail (offset / start / step / count / size0)
|
|
145
|
+
must be filled BEFORE ca_stride_setup. ca_stride_setup may auto-
|
|
146
|
+
dispatch ca_create_mask when the parent has a mask, and
|
|
147
|
+
ca_block_func_create_mask reads those tail fields.
|
|
100
148
|
|
|
149
|
+
Pool path: start/step/count/size0 already point into _pool (wired
|
|
150
|
+
by ca_block_pool_init); only memcpy the values. Non-pool path:
|
|
151
|
+
ALLOC_N each first, then memcpy. */
|
|
152
|
+
ca->offset = offset;
|
|
153
|
+
if ( ! ca->_pool ) {
|
|
154
|
+
ca->start = ALLOC_N(ca_size_t, ndim);
|
|
155
|
+
ca->step = ALLOC_N(ca_size_t, ndim);
|
|
156
|
+
ca->count = ALLOC_N(ca_size_t, ndim);
|
|
157
|
+
ca->size0 = ALLOC_N(ca_size_t, ndim);
|
|
158
|
+
}
|
|
101
159
|
memcpy(ca->start, start, ndim * sizeof(ca_size_t));
|
|
102
160
|
memcpy(ca->step, step, ndim * sizeof(ca_size_t));
|
|
103
161
|
memcpy(ca->count, count, ndim * sizeof(ca_size_t));
|
|
104
|
-
memcpy(ca->size0,
|
|
162
|
+
memcpy(ca->size0, dim, ndim * sizeof(ca_size_t));
|
|
105
163
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
164
|
+
ca_stride_setup((CAStride *) ca, CA_OBJ_BLOCK, parent,
|
|
165
|
+
parent->data_type, parent->bytes,
|
|
166
|
+
ndim, count, strides,
|
|
167
|
+
base_offset_elements * parent->bytes);
|
|
109
168
|
|
|
110
169
|
return 0;
|
|
111
170
|
}
|
|
112
171
|
|
|
113
172
|
CABlock *
|
|
114
173
|
ca_block_new (CArray *parent, int8_t ndim, ca_size_t *dim,
|
|
115
|
-
|
|
174
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count,
|
|
175
|
+
ca_size_t offset)
|
|
116
176
|
{
|
|
117
|
-
CABlock *ca =
|
|
177
|
+
CABlock *ca = (CABlock *) ca_array_alloc(CA_OBJ_BLOCK, ndim);
|
|
118
178
|
ca_block_setup(ca, parent, ndim, dim, start, step, count, offset);
|
|
119
179
|
return ca;
|
|
120
180
|
}
|
|
121
181
|
|
|
182
|
+
/* CABlock-specific free_object: cleans up the mask, then frees all
|
|
183
|
+
six per-axis arrays. Pool path consolidates them into one
|
|
184
|
+
ca_array_free; non-pool path xfrees each individually. Wired into
|
|
185
|
+
ca_block_func at Init_ca_obj_block. */
|
|
122
186
|
static void
|
|
123
187
|
free_ca_block (void *ap)
|
|
124
188
|
{
|
|
125
189
|
CABlock *ca = (CABlock *) ap;
|
|
126
|
-
if (
|
|
190
|
+
if (ca == NULL) return;
|
|
191
|
+
ca_free(ca->mask);
|
|
192
|
+
if (ca->_pool) {
|
|
193
|
+
ca_array_free(ca);
|
|
194
|
+
} else {
|
|
127
195
|
xfree(ca->start);
|
|
128
196
|
xfree(ca->step);
|
|
129
197
|
xfree(ca->count);
|
|
130
198
|
xfree(ca->size0);
|
|
131
|
-
|
|
132
|
-
|
|
199
|
+
xfree(ca->strides);
|
|
200
|
+
xfree(ca->dim);
|
|
133
201
|
xfree(ca);
|
|
134
202
|
}
|
|
135
203
|
}
|
|
136
204
|
|
|
137
|
-
static void ca_block_attach (CABlock *cb);
|
|
138
|
-
static void ca_block_sync (CABlock *cb);
|
|
139
|
-
|
|
140
|
-
/* ------------------------------------------------------------------- */
|
|
141
|
-
|
|
142
205
|
static void *
|
|
143
206
|
ca_block_func_clone (void *ap)
|
|
144
207
|
{
|
|
145
208
|
CABlock *ca = (CABlock *) ap;
|
|
146
|
-
return ca_block_new(ca->parent,
|
|
147
|
-
ca->ndim, ca->size0,
|
|
209
|
+
return ca_block_new(ca->parent, ca->ndim, ca->size0,
|
|
148
210
|
ca->start, ca->step, ca->count, ca->offset);
|
|
149
211
|
}
|
|
150
212
|
|
|
151
|
-
static char *
|
|
152
|
-
ca_block_func_ptr_at_index (void *ap, ca_size_t *idx) ;
|
|
153
|
-
|
|
154
|
-
static char *
|
|
155
|
-
ca_block_func_ptr_at_addr (void *ap, ca_size_t addr)
|
|
156
|
-
{
|
|
157
|
-
CABlock *ca = (CABlock *) ap;
|
|
158
|
-
if ( ca->ptr ) {
|
|
159
|
-
return ca->ptr + ca->bytes * addr;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
ca_size_t idx[CA_RANK_MAX];
|
|
163
|
-
ca_addr2index(ca, addr, idx);
|
|
164
|
-
return ca_block_func_ptr_at_index(ca, idx);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
static char *
|
|
169
|
-
ca_block_func_ptr_at_index (void *ap, ca_size_t *idx)
|
|
170
|
-
{
|
|
171
|
-
CABlock *ca = (CABlock *) ap;
|
|
172
|
-
|
|
173
|
-
if ( ca->ptr ) {
|
|
174
|
-
return ca_array_func_ptr_at_index(ca, idx);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
ca_size_t *start = ca->start;
|
|
178
|
-
ca_size_t *step = ca->step;
|
|
179
|
-
ca_size_t *size0 = ca->size0;
|
|
180
|
-
int8_t i;
|
|
181
|
-
ca_size_t n;
|
|
182
|
-
n = start[0] + idx[0]*step[0];
|
|
183
|
-
for (i=1; i<ca->ndim; i++) {
|
|
184
|
-
n *= size0[i];
|
|
185
|
-
n += start[i] + idx[i]*step[i];
|
|
186
|
-
}
|
|
187
|
-
n += ca->offset;
|
|
188
|
-
if ( ca->parent->ptr ) {
|
|
189
|
-
return ca->parent->ptr + ca->bytes * n;
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
return ca_ptr_at_addr(ca->parent, n);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
static void
|
|
198
|
-
ca_block_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
|
|
199
|
-
{
|
|
200
|
-
CABlock *ca = (CABlock *) ap;
|
|
201
|
-
ca_size_t *start = ca->start;
|
|
202
|
-
ca_size_t *step = ca->step;
|
|
203
|
-
ca_size_t *size0 = ca->size0;
|
|
204
|
-
int8_t i;
|
|
205
|
-
ca_size_t n;
|
|
206
|
-
n = start[0] + idx[0]*step[0];
|
|
207
|
-
for (i=1; i<ca->ndim; i++) {
|
|
208
|
-
n *= size0[i];
|
|
209
|
-
n += start[i] + idx[i]*step[i];
|
|
210
|
-
}
|
|
211
|
-
n += ca->offset;
|
|
212
|
-
ca_fetch_addr(ca->parent, n, ptr);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
static void
|
|
216
|
-
ca_block_func_store_index (void *ap, ca_size_t *idx, void *ptr)
|
|
217
|
-
{
|
|
218
|
-
CABlock *ca = (CABlock *) ap;
|
|
219
|
-
ca_size_t *start = ca->start;
|
|
220
|
-
ca_size_t *step = ca->step;
|
|
221
|
-
ca_size_t *size0 = ca->size0;
|
|
222
|
-
int8_t i;
|
|
223
|
-
ca_size_t n;
|
|
224
|
-
n = start[0] + idx[0]*step[0];
|
|
225
|
-
for (i=1; i<ca->ndim; i++) {
|
|
226
|
-
n *= size0[i];
|
|
227
|
-
n += start[i] + idx[i]*step[i];
|
|
228
|
-
}
|
|
229
|
-
n += ca->offset;
|
|
230
|
-
ca_store_addr(ca->parent, n, ptr);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
static void
|
|
234
|
-
ca_block_func_allocate (void *ap)
|
|
235
|
-
{
|
|
236
|
-
CABlock *ca = (CABlock *) ap;
|
|
237
|
-
ca_attach(ca->parent);
|
|
238
|
-
/* ca->ptr = ALLOC_N(char, ca_length(ca)); */
|
|
239
|
-
ca->ptr = malloc_with_check(ca_length(ca));
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
static void
|
|
243
|
-
ca_block_func_attach (void *ap)
|
|
244
|
-
{
|
|
245
|
-
CABlock *ca = (CABlock *) ap;
|
|
246
|
-
ca_attach(ca->parent);
|
|
247
|
-
/* ca->ptr = ALLOC_N(char, ca_length(ca)); */
|
|
248
|
-
ca->ptr = malloc_with_check(ca_length(ca));
|
|
249
|
-
ca_block_attach(ca);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
static void
|
|
253
|
-
ca_block_func_sync (void *ap)
|
|
254
|
-
{
|
|
255
|
-
CABlock *ca = (CABlock *) ap;
|
|
256
|
-
ca_block_sync(ca);
|
|
257
|
-
ca_sync(ca->parent);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
static void
|
|
261
|
-
ca_block_func_detach (void *ap)
|
|
262
|
-
{
|
|
263
|
-
CABlock *ca = (CABlock *) ap;
|
|
264
|
-
free(ca->ptr);
|
|
265
|
-
ca->ptr = NULL;
|
|
266
|
-
ca_detach(ca->parent);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
static void
|
|
270
|
-
ca_block_func_copy_data (void *ap, void *ptr)
|
|
271
|
-
{
|
|
272
|
-
CABlock *ca = (CABlock *) ap;
|
|
273
|
-
char *ptr0 = ca->ptr;
|
|
274
|
-
ca_attach(ca->parent);
|
|
275
|
-
ca->ptr = ptr;
|
|
276
|
-
ca_block_attach(ca);
|
|
277
|
-
ca->ptr = ptr0;
|
|
278
|
-
ca_detach(ca->parent);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
static void
|
|
282
|
-
ca_block_func_sync_data (void *ap, void *ptr)
|
|
283
|
-
{
|
|
284
|
-
CABlock *ca = (CABlock *) ap;
|
|
285
|
-
char *ptr0 = ca->ptr;
|
|
286
|
-
ca_attach(ca->parent);
|
|
287
|
-
ca->ptr = ptr;
|
|
288
|
-
ca_block_sync(ca);
|
|
289
|
-
ca->ptr = ptr0;
|
|
290
|
-
ca_sync(ca->parent);
|
|
291
|
-
ca_detach(ca->parent);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
static void ca_block_fill (CABlock *ca, char *val);
|
|
295
|
-
|
|
296
|
-
static void
|
|
297
|
-
ca_block_func_fill_data (void *ap, void *ptr)
|
|
298
|
-
{
|
|
299
|
-
CABlock *ca = (CABlock *) ap;
|
|
300
|
-
ca_attach(ca->parent);
|
|
301
|
-
ca_block_fill(ca, ptr);
|
|
302
|
-
ca_sync(ca->parent);
|
|
303
|
-
ca_detach(ca->parent);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
213
|
static void
|
|
307
214
|
ca_block_func_create_mask (void *ap)
|
|
308
215
|
{
|
|
@@ -314,32 +221,12 @@ ca_block_func_create_mask (void *ap)
|
|
|
314
221
|
ca->start, ca->step, ca->count, ca->offset);
|
|
315
222
|
}
|
|
316
223
|
|
|
317
|
-
ca_operation_function_t ca_block_func = {
|
|
318
|
-
CA_OBJ_BLOCK,
|
|
319
|
-
CA_VIRTUAL_ARRAY,
|
|
320
|
-
free_ca_block,
|
|
321
|
-
ca_block_func_clone,
|
|
322
|
-
ca_block_func_ptr_at_addr,
|
|
323
|
-
ca_block_func_ptr_at_index,
|
|
324
|
-
NULL,
|
|
325
|
-
ca_block_func_fetch_index,
|
|
326
|
-
NULL,
|
|
327
|
-
ca_block_func_store_index,
|
|
328
|
-
ca_block_func_allocate,
|
|
329
|
-
ca_block_func_attach,
|
|
330
|
-
ca_block_func_sync,
|
|
331
|
-
ca_block_func_detach,
|
|
332
|
-
ca_block_func_copy_data,
|
|
333
|
-
ca_block_func_sync_data,
|
|
334
|
-
ca_block_func_fill_data,
|
|
335
|
-
ca_block_func_create_mask,
|
|
336
|
-
};
|
|
337
|
-
|
|
338
224
|
/* ------------------------------------------------------------------- */
|
|
339
225
|
|
|
340
226
|
VALUE
|
|
341
227
|
rb_ca_block_new (VALUE cary, int8_t ndim, ca_size_t *dim,
|
|
342
|
-
|
|
228
|
+
ca_size_t *start, ca_size_t *step, ca_size_t *count,
|
|
229
|
+
ca_size_t offset)
|
|
343
230
|
{
|
|
344
231
|
volatile VALUE obj;
|
|
345
232
|
CArray *parent;
|
|
@@ -347,366 +234,14 @@ rb_ca_block_new (VALUE cary, int8_t ndim, ca_size_t *dim,
|
|
|
347
234
|
|
|
348
235
|
rb_check_carray_object(cary);
|
|
349
236
|
TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
|
|
237
|
+
|
|
350
238
|
ca = ca_block_new(parent, ndim, dim, start, step, count, offset);
|
|
351
239
|
obj = ca_wrap_struct(ca);
|
|
352
240
|
rb_ca_set_parent(obj, cary);
|
|
353
|
-
rb_ca_data_type_inherit(obj, cary);
|
|
354
|
-
return obj;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/* ---------------------------------------------------------------------- */
|
|
358
|
-
|
|
359
|
-
static void *mcopy_step (void *dest, const void *src,
|
|
360
|
-
size_t bytes, size_t n, size_t dstep, size_t sstep);
|
|
361
|
-
|
|
362
|
-
static void *mfill_step(void *dest,
|
|
363
|
-
size_t bytes, size_t n, size_t dstep, const void *src);
|
|
364
|
-
|
|
365
|
-
static void
|
|
366
|
-
ca_block_attach_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
|
367
|
-
{
|
|
368
|
-
ca_size_t count = ca->count[level];
|
|
369
|
-
ca_size_t addr, addr0, i;
|
|
370
|
-
|
|
371
|
-
if ( level == ca->ndim - 1 ) {
|
|
372
|
-
if ( ca->parent->ptr ) {
|
|
373
|
-
addr = saddr * ca->dim[level];
|
|
374
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
375
|
-
mcopy_step(ca_ptr_at_addr(ca, addr),
|
|
376
|
-
ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
377
|
-
ca->bytes, count, 1, ca->step[level]);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
for (i=0; i<count; i++) {
|
|
381
|
-
addr = saddr * ca->dim[level] + i;
|
|
382
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
383
|
-
+ i * ca->step[level];
|
|
384
|
-
memcpy(ca_ptr_at_addr(ca, addr),
|
|
385
|
-
ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
386
|
-
ca->bytes);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
else {
|
|
391
|
-
for (i=0; i<count; i++) {
|
|
392
|
-
addr = saddr * ca->dim[level] + i;
|
|
393
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
394
|
-
+ i * ca->step[level];
|
|
395
|
-
ca_block_attach_loop2(ca, level+1, addr, addr0);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
241
|
|
|
400
|
-
|
|
401
|
-
ca_block_attach_loop (CABlock *ca, ca_size_t level, ca_size_t saddr, ca_size_t saddr0)
|
|
402
|
-
{
|
|
403
|
-
ca_size_t count = ca->count[level];
|
|
404
|
-
ca_size_t addr, addr0, i;
|
|
405
|
-
|
|
406
|
-
if ( level == ca->ndim - 1 ) {
|
|
407
|
-
if ( level == ca->maxdim_index ) {
|
|
408
|
-
addr = saddr * ca->dim[level];
|
|
409
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
410
|
-
mcopy_step(ca_ptr_at_addr(ca, addr),
|
|
411
|
-
ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
412
|
-
ca->bytes, count, 1, ca->step[level]);
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
char *p = ca_ptr_at_addr(ca, saddr* ca->dim[level]);
|
|
416
|
-
char *q = ca_ptr_at_addr(ca->parent,
|
|
417
|
-
saddr0*ca->size0[level]+ca->start[level]+ca->offset);
|
|
418
|
-
ca_size_t pstep = ca->bytes;
|
|
419
|
-
ca_size_t qstep = ca->bytes*ca->step[level];
|
|
420
|
-
for (i=0; i<count; i++) {
|
|
421
|
-
mcopy_step(p,
|
|
422
|
-
q,
|
|
423
|
-
ca->bytes, ca->count[ca->maxdim_index],
|
|
424
|
-
ca->maxdim_step, ca->maxdim_step0);
|
|
425
|
-
p += pstep;
|
|
426
|
-
q += qstep;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
else {
|
|
431
|
-
if ( level == ca->maxdim_index ) {
|
|
432
|
-
addr = saddr * ca->dim[level];
|
|
433
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
434
|
-
ca_block_attach_loop(ca, level+1, addr, addr0);
|
|
435
|
-
}
|
|
436
|
-
else {
|
|
437
|
-
for (i=0; i<count; i++) {
|
|
438
|
-
addr = saddr * ca->dim[level] + i;
|
|
439
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
440
|
-
+ i * ca->step[level];
|
|
441
|
-
ca_block_attach_loop(ca, level+1, addr, addr0);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
static void
|
|
448
|
-
ca_block_attach (CABlock *ca)
|
|
449
|
-
{
|
|
450
|
-
ca_size_t addr = 0, addr0 = 0;
|
|
451
|
-
if ( ca->ndim <= 2 ) {
|
|
452
|
-
ca_block_attach_loop2(ca, 0, addr, addr0);
|
|
453
|
-
}
|
|
454
|
-
else {
|
|
455
|
-
ca_block_attach_loop(ca, 0, addr, addr0);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
static void
|
|
460
|
-
ca_block_sync_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
|
461
|
-
{
|
|
462
|
-
ca_size_t count = ca->count[level];
|
|
463
|
-
ca_size_t addr, addr0, i;
|
|
464
|
-
|
|
465
|
-
if ( level == ca->ndim - 1 ) {
|
|
466
|
-
if ( ca->parent->ptr ) {
|
|
467
|
-
addr = saddr * ca->dim[level];
|
|
468
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
469
|
-
mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
470
|
-
ca_ptr_at_addr(ca, addr),
|
|
471
|
-
ca->bytes, count, ca->step[level], 1);
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
for (i=0; i<count; i++) {
|
|
475
|
-
addr = saddr * ca->dim[level] + i;
|
|
476
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
477
|
-
+ i * ca->step[level];
|
|
478
|
-
memcpy(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
479
|
-
ca_ptr_at_addr(ca, addr),
|
|
480
|
-
ca->bytes);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
for (i=0; i<count; i++) {
|
|
486
|
-
addr = saddr * ca->dim[level] + i;
|
|
487
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level] + i * ca->step[level];
|
|
488
|
-
ca_block_sync_loop2(ca, level+1, addr, addr0);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
static void
|
|
494
|
-
ca_block_sync_loop (CABlock *ca, int8_t level, ca_size_t saddr, ca_size_t saddr0)
|
|
495
|
-
{
|
|
496
|
-
ca_size_t count = ca->count[level];
|
|
497
|
-
ca_size_t addr, addr0, i;
|
|
498
|
-
|
|
499
|
-
if ( level == ca->ndim - 1 ) {
|
|
500
|
-
if ( level == ca->maxdim_index ) {
|
|
501
|
-
addr = saddr * ca->dim[level];
|
|
502
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
503
|
-
mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
504
|
-
ca_ptr_at_addr(ca, addr),
|
|
505
|
-
ca->bytes, count, ca->step[level], 1);
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
for (i=0; i<count; i++) {
|
|
509
|
-
addr = saddr * ca->dim[level] + i;
|
|
510
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
511
|
-
+ i * ca->step[level];
|
|
512
|
-
mcopy_step(ca_ptr_at_addr(ca->parent, addr0 + ca->offset),
|
|
513
|
-
ca_ptr_at_addr(ca, addr),
|
|
514
|
-
ca->bytes, ca->count[ca->maxdim_index],
|
|
515
|
-
ca->maxdim_step0, ca->maxdim_step);
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
else {
|
|
520
|
-
if ( level == ca->maxdim_index ) {
|
|
521
|
-
addr = saddr * ca->dim[level];
|
|
522
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level];
|
|
523
|
-
ca_block_sync_loop(ca, level+1, addr, addr0);
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
for (i=0; i<count; i++) {
|
|
527
|
-
addr = saddr * ca->dim[level] + i;
|
|
528
|
-
addr0 = saddr0 * ca->size0[level] + ca->start[level]
|
|
529
|
-
+ i * ca->step[level];
|
|
530
|
-
ca_block_sync_loop(ca, level+1, addr, addr0);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
static void
|
|
537
|
-
ca_block_sync (CABlock *cb)
|
|
538
|
-
{
|
|
539
|
-
ca_size_t addr = 0, addr0 = 0;
|
|
540
|
-
if ( cb->ndim <= 2 ) {
|
|
541
|
-
ca_block_sync_loop2(cb, 0, addr, addr0);
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
ca_block_sync_loop(cb, 0, addr, addr0);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
static void
|
|
549
|
-
ca_block_fill_loop2 (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
|
|
550
|
-
{
|
|
551
|
-
ca_size_t count = ca->count[level];
|
|
552
|
-
ca_size_t addr, i;
|
|
553
|
-
if ( level == ca->ndim - 1 ) {
|
|
554
|
-
addr = saddr * ca->dim[level];
|
|
555
|
-
mfill_step(ca_ptr_at_addr(ca, addr),
|
|
556
|
-
ca->bytes, count, ca->step[level], val);
|
|
557
|
-
}
|
|
558
|
-
else {
|
|
559
|
-
for (i=0; i<count; i++) {
|
|
560
|
-
addr = saddr * ca->dim[level] + i;
|
|
561
|
-
ca_block_fill_loop2(ca, level+1, addr, val);
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
static void
|
|
567
|
-
ca_block_fill_loop (CABlock *ca, int8_t level, ca_size_t saddr, char *val)
|
|
568
|
-
{
|
|
569
|
-
ca_size_t count = ca->count[level];
|
|
570
|
-
ca_size_t addr, i;
|
|
571
|
-
if ( level == ca->ndim - 1 ) {
|
|
572
|
-
if ( level == ca->maxdim_index ) {
|
|
573
|
-
addr = saddr * ca->dim[level];
|
|
574
|
-
mfill_step(ca_ptr_at_addr(ca, addr),
|
|
575
|
-
ca->bytes, count, ca->step[level], val);
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
for (i=0; i<count; i++) {
|
|
579
|
-
addr = saddr * ca->dim[level] + i;
|
|
580
|
-
mfill_step(ca_ptr_at_addr(ca, addr),
|
|
581
|
-
ca->bytes, ca->count[ca->maxdim_index],
|
|
582
|
-
ca->maxdim_step0, val);
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
}
|
|
587
|
-
else {
|
|
588
|
-
if ( level == ca->maxdim_index ) {
|
|
589
|
-
addr = saddr * ca->dim[level];
|
|
590
|
-
ca_block_fill_loop(ca, level+1, addr, val);
|
|
591
|
-
}
|
|
592
|
-
else {
|
|
593
|
-
for (i=0; i<count; i++) {
|
|
594
|
-
addr = saddr * ca->dim[level] + i;
|
|
595
|
-
ca_block_fill_loop(ca, level+1, addr, val);
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
static void
|
|
603
|
-
ca_block_fill (CABlock *ca, char *val)
|
|
604
|
-
{
|
|
605
|
-
ca_size_t addr = 0;
|
|
606
|
-
if ( ca->ndim <= 2 ) {
|
|
607
|
-
ca_block_fill_loop2(ca, 0, addr, val);
|
|
608
|
-
}
|
|
609
|
-
else {
|
|
610
|
-
ca_block_fill_loop(ca, 0, addr, val);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
/* -------------------------------------------------------------------- */
|
|
615
|
-
|
|
616
|
-
static void *
|
|
617
|
-
mcopy_step (void *dest, const void *src,
|
|
618
|
-
size_t bytes, size_t n, size_t dstep, size_t sstep)
|
|
619
|
-
{
|
|
620
|
-
if ( dstep == 1 && sstep == 1 ) {
|
|
621
|
-
size_t bytelen = bytes * n;
|
|
622
|
-
size_t words = bytelen / sizeof(int);
|
|
623
|
-
size_t rests = bytelen % sizeof(int);
|
|
624
|
-
int *sp = (int*) src;
|
|
625
|
-
int *dp = (int*) dest;
|
|
626
|
-
char *scp;
|
|
627
|
-
char *dcp;
|
|
628
|
-
ca_size_t i;
|
|
629
|
-
for (i=words; i; i--) {
|
|
630
|
-
*dp++ = *sp++;
|
|
631
|
-
}
|
|
632
|
-
scp = (char*)sp; dcp = (char*)dp;
|
|
633
|
-
for (i=rests; i; i--) {
|
|
634
|
-
*dcp++ = *scp++;
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
else if ( dstep >= 1 || sstep >= 1 ) {
|
|
638
|
-
switch ( bytes ) {
|
|
639
|
-
case 1: {
|
|
640
|
-
int8_t *sp = (int8_t*) src, *dp = (int8_t*) dest;
|
|
641
|
-
while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
|
|
642
|
-
break;
|
|
643
|
-
}
|
|
644
|
-
case 2: {
|
|
645
|
-
int16_t *sp = (int16_t*) src, *dp = (int16_t*) dest;
|
|
646
|
-
while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
|
|
647
|
-
break;
|
|
648
|
-
}
|
|
649
|
-
case 4: {
|
|
650
|
-
int32_t *sp = (int32_t*) src, *dp = (int32_t*) dest;
|
|
651
|
-
while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
|
|
652
|
-
break;
|
|
653
|
-
}
|
|
654
|
-
case 8: {
|
|
655
|
-
double *sp = (double*) src, *dp = (double*) dest;
|
|
656
|
-
while (n--) { *dp = *sp; dp+=dstep; sp+=sstep; }
|
|
657
|
-
break;
|
|
658
|
-
}
|
|
659
|
-
default: {
|
|
660
|
-
char *sp = (char*) src, *dp = (char*) dest;
|
|
661
|
-
while (n--) { memcpy(dp,sp,bytes); dp+=bytes*dstep; sp+=bytes*sstep; }
|
|
662
|
-
break;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
return dest;
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
static void *
|
|
671
|
-
mfill_step(void *dest, size_t bytes, size_t n, size_t dstep, const void *src)
|
|
672
|
-
{
|
|
673
|
-
switch ( bytes ) {
|
|
674
|
-
case 1: {
|
|
675
|
-
int8_t *dp = (int8_t*) dest;
|
|
676
|
-
int8_t v = *(int8_t*) src;
|
|
677
|
-
while (n--) { *dp = v; dp+=dstep; }
|
|
678
|
-
break;
|
|
679
|
-
}
|
|
680
|
-
case 2: {
|
|
681
|
-
int16_t *dp = (int16_t*) dest;
|
|
682
|
-
int16_t v = *(int16_t*) src;
|
|
683
|
-
while (n--) { *dp = v; dp+=dstep; }
|
|
684
|
-
break;
|
|
685
|
-
}
|
|
686
|
-
case 4: {
|
|
687
|
-
int32_t *dp = (int32_t*) dest;
|
|
688
|
-
int32_t v = *(int32_t*) src;
|
|
689
|
-
while (n--) { *dp = v; dp+=dstep; }
|
|
690
|
-
break;
|
|
691
|
-
}
|
|
692
|
-
case 8: {
|
|
693
|
-
double *dp = (double*) dest;
|
|
694
|
-
double v = *(double*) src;
|
|
695
|
-
while (n--) { *dp = v; dp+=dstep; }
|
|
696
|
-
break;
|
|
697
|
-
}
|
|
698
|
-
default: {
|
|
699
|
-
char *sp = (char*) src, *dp = (char*) dest;
|
|
700
|
-
while (n--) { memcpy(dp,sp,bytes); dp+=bytes*dstep; }
|
|
701
|
-
break;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
return dest;
|
|
242
|
+
return obj;
|
|
706
243
|
}
|
|
707
244
|
|
|
708
|
-
/* ---------------------------------------------------------------------- */
|
|
709
|
-
|
|
710
245
|
static VALUE
|
|
711
246
|
rb_cb_s_allocate (VALUE klass)
|
|
712
247
|
{
|
|
@@ -718,59 +253,42 @@ static VALUE
|
|
|
718
253
|
rb_cb_initialize_copy (VALUE self, VALUE other)
|
|
719
254
|
{
|
|
720
255
|
CABlock *ca, *cs;
|
|
721
|
-
ca_size_t shrink[CA_RANK_MAX];
|
|
722
|
-
int8_t i;
|
|
723
|
-
|
|
724
256
|
TypedData_Get_Struct(self, CABlock, &cablock_data_type, ca);
|
|
725
257
|
TypedData_Get_Struct(other, CABlock, &cablock_data_type, cs);
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
258
|
+
/* `self` was created by rb_cb_s_allocate (TypedData_Make_Struct) with
|
|
259
|
+
ca->_pool == NULL. Wire up the pool before ca_block_setup so the
|
|
260
|
+
tail-and-prefix branches in ca_block_setup / ca_stride_setup both
|
|
261
|
+
skip ALLOC_N. */
|
|
262
|
+
if ( ca_func[CA_OBJ_BLOCK].pool_init ) {
|
|
263
|
+
ca_array_pool_alloc(ca, CA_OBJ_BLOCK, cs->ndim);
|
|
264
|
+
}
|
|
265
|
+
ca_block_setup(ca, cs->parent, cs->ndim, cs->size0,
|
|
266
|
+
cs->start, cs->step, cs->count, cs->offset);
|
|
735
267
|
rb_ca_set_parent(self, rb_ca_parent(other));
|
|
736
|
-
rb_ca_data_type_inherit(self, rb_ca_parent(other));
|
|
737
|
-
|
|
738
268
|
return self;
|
|
739
269
|
}
|
|
740
270
|
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
271
|
+
/* Per-axis accessor macro: defines a method that returns the named
|
|
272
|
+
CABlock tail array (size0 / start / step / count) as a Ruby Array.
|
|
273
|
+
`offset` is a single Integer and uses its own accessor below. */
|
|
274
|
+
#define rb_cb_get_attr_ary(name) \
|
|
275
|
+
rb_cb_ ## name (VALUE self) \
|
|
276
|
+
{ \
|
|
277
|
+
volatile VALUE ary; \
|
|
278
|
+
CABlock *cb; \
|
|
279
|
+
int8_t i; \
|
|
280
|
+
TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb); \
|
|
281
|
+
ary = rb_ary_new2(cb->ndim); \
|
|
749
282
|
for (i=0; i<cb->ndim; i++) { \
|
|
750
283
|
rb_ary_store(ary, i, LONG2NUM(cb->name[i])); \
|
|
751
284
|
} \
|
|
752
285
|
return ary; \
|
|
753
286
|
}
|
|
754
287
|
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
def start
|
|
760
|
-
end
|
|
761
|
-
def step
|
|
762
|
-
end
|
|
763
|
-
def count
|
|
764
|
-
end
|
|
765
|
-
def offset
|
|
766
|
-
end
|
|
767
|
-
end
|
|
768
|
-
*/
|
|
769
|
-
|
|
770
|
-
static VALUE rb_cb_get_attr_ary(size0);
|
|
771
|
-
static VALUE rb_cb_get_attr_ary(start);
|
|
772
|
-
static VALUE rb_cb_get_attr_ary(step);
|
|
773
|
-
static VALUE rb_cb_get_attr_ary(count);
|
|
288
|
+
static VALUE rb_cb_get_attr_ary(size0)
|
|
289
|
+
static VALUE rb_cb_get_attr_ary(start)
|
|
290
|
+
static VALUE rb_cb_get_attr_ary(step)
|
|
291
|
+
static VALUE rb_cb_get_attr_ary(count)
|
|
774
292
|
|
|
775
293
|
static VALUE
|
|
776
294
|
rb_cb_offset (VALUE self)
|
|
@@ -780,13 +298,10 @@ rb_cb_offset (VALUE self)
|
|
|
780
298
|
return SIZE2NUM(cb->offset);
|
|
781
299
|
}
|
|
782
300
|
|
|
783
|
-
/*
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
end
|
|
788
|
-
*/
|
|
789
|
-
|
|
301
|
+
/* CABlock#idx2addr0(*idx) -- map a per-axis view index tuple to the
|
|
302
|
+
corresponding flat address into the parent (= "addr0").
|
|
303
|
+
Equivalent to following the start[] + step[] geometry; used to
|
|
304
|
+
project a view-local coordinate back onto the underlying buffer. */
|
|
790
305
|
static VALUE
|
|
791
306
|
rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
|
|
792
307
|
{
|
|
@@ -797,7 +312,7 @@ rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
|
|
|
797
312
|
|
|
798
313
|
TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
|
|
799
314
|
|
|
800
|
-
if (
|
|
315
|
+
if (argc != cb->ndim) {
|
|
801
316
|
rb_raise(rb_eArgError,
|
|
802
317
|
"invalid # of arguments (should be <%i>)", cb->ndim);
|
|
803
318
|
}
|
|
@@ -812,13 +327,9 @@ rb_cb_idx2addr0 (int argc, VALUE *argv, VALUE self)
|
|
|
812
327
|
return SIZE2NUM(addr + cb->offset);
|
|
813
328
|
}
|
|
814
329
|
|
|
815
|
-
/*
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
end
|
|
819
|
-
end
|
|
820
|
-
*/
|
|
821
|
-
|
|
330
|
+
/* CABlock#addr2addr0(addr) -- flat-address variant of idx2addr0: take
|
|
331
|
+
a view-local flat address, unravel it via ca_addr2index, and walk
|
|
332
|
+
start[]/step[] to the corresponding parent flat address. */
|
|
822
333
|
static VALUE
|
|
823
334
|
rb_cb_addr2addr0 (VALUE self, VALUE raddr)
|
|
824
335
|
{
|
|
@@ -829,7 +340,7 @@ rb_cb_addr2addr0 (VALUE self, VALUE raddr)
|
|
|
829
340
|
|
|
830
341
|
TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
|
|
831
342
|
|
|
832
|
-
ca_addr2index((CArray*)cb, addr, idx);
|
|
343
|
+
ca_addr2index((CArray *) cb, addr, idx);
|
|
833
344
|
|
|
834
345
|
addr = 0;
|
|
835
346
|
for (i=0; i<cb->ndim; i++) {
|
|
@@ -840,53 +351,22 @@ rb_cb_addr2addr0 (VALUE self, VALUE raddr)
|
|
|
840
351
|
return SIZE2NUM(addr + cb->offset);
|
|
841
352
|
}
|
|
842
353
|
|
|
843
|
-
|
|
844
|
-
/* yard:
|
|
845
|
-
class CABlock
|
|
846
|
-
def move (*index)
|
|
847
|
-
end
|
|
848
|
-
end
|
|
849
|
-
*/
|
|
850
|
-
|
|
851
|
-
static VALUE
|
|
852
|
-
rb_cb_move (int argc, VALUE *argv, VALUE self)
|
|
853
|
-
{
|
|
854
|
-
CABlock *cb;
|
|
855
|
-
ca_size_t start;
|
|
856
|
-
int8_t i;
|
|
857
|
-
|
|
858
|
-
TypedData_Get_Struct(self, CABlock, &cablock_data_type, cb);
|
|
859
|
-
|
|
860
|
-
if ( argc != cb->ndim ) {
|
|
861
|
-
rb_raise(rb_eArgError, "invalid # of arguments");
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
ca_update_mask(cb);
|
|
865
|
-
|
|
866
|
-
for (i=0; i<cb->ndim; i++) {
|
|
867
|
-
start = NUM2SIZE(argv[i]);
|
|
868
|
-
if ( start < 0 ) {
|
|
869
|
-
start += cb->size0[i];
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
if ( start < 0 || start + (cb->dim[i]-1) * cb->step[i] >= cb->size0[i] ) {
|
|
873
|
-
rb_raise(rb_eArgError, "%i-th index out of range", i);
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
cb->start[i] = start;
|
|
877
|
-
|
|
878
|
-
if ( cb->mask ) {
|
|
879
|
-
((CABlock*)(cb->mask))->start[i] = start;
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
return self;
|
|
884
|
-
}
|
|
885
|
-
|
|
886
354
|
void
|
|
887
|
-
Init_ca_obj_block ()
|
|
888
|
-
{
|
|
889
|
-
/* rb_cCABlock
|
|
355
|
+
Init_ca_obj_block (void)
|
|
356
|
+
{
|
|
357
|
+
/* rb_cCABlock and CA_OBJ_BLOCK are defined in ruby_carray.c /
|
|
358
|
+
carray_core.c; here we override the baseline ca_stride_func entry
|
|
359
|
+
with CABlock-specific free_object / clone / create_mask, plus the
|
|
360
|
+
pool hooks (6*ndim, sizeof(CABlock)) so ca_array_alloc reserves
|
|
361
|
+
room for the tail fields too. */
|
|
362
|
+
ca_block_func = ca_stride_func;
|
|
363
|
+
ca_block_func.free_object = free_ca_block;
|
|
364
|
+
ca_block_func.clone = ca_block_func_clone;
|
|
365
|
+
ca_block_func.create_mask = ca_block_func_create_mask;
|
|
366
|
+
ca_block_func.struct_size = sizeof(CABlock);
|
|
367
|
+
ca_block_func.pool_bytes = ca_block_pool_bytes;
|
|
368
|
+
ca_block_func.pool_init = ca_block_pool_init;
|
|
369
|
+
ca_func[CA_OBJ_BLOCK] = ca_block_func;
|
|
890
370
|
|
|
891
371
|
rb_define_const(rb_cObject, "CA_OBJ_BLOCK", INT2NUM(CA_OBJ_BLOCK));
|
|
892
372
|
|
|
@@ -899,8 +379,6 @@ Init_ca_obj_block ()
|
|
|
899
379
|
rb_define_method(rb_cCABlock, "count", rb_cb_count, 0);
|
|
900
380
|
rb_define_method(rb_cCABlock, "offset", rb_cb_offset, 0);
|
|
901
381
|
|
|
902
|
-
rb_define_method(rb_cCABlock, "move", rb_cb_move, -1);
|
|
903
|
-
|
|
904
382
|
rb_define_method(rb_cCABlock, "idx2addr0", rb_cb_idx2addr0, -1);
|
|
905
383
|
rb_define_method(rb_cCABlock, "index2addr0", rb_cb_idx2addr0, -1);
|
|
906
384
|
rb_define_method(rb_cCABlock, "addr2addr0", rb_cb_addr2addr0, 1);
|