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_field.c
CHANGED
|
@@ -1,523 +1,77 @@
|
|
|
1
1
|
/* ---------------------------------------------------------------------------
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
CAField: a CAStride view that exposes one field of a fixlen-record
|
|
4
|
+
parent as an array of that field's type. Pure typedef of CAStride
|
|
5
|
+
(no extra state); shape matches the parent, with:
|
|
6
|
+
- base_offset = field offset in bytes within one record
|
|
7
|
+
- strides[k] = parent->bytes * Π_{i>k} parent->dim[i]
|
|
8
|
+
(row-major stride scaled by record size)
|
|
9
|
+
- data_type = field's element type (independent of parent's)
|
|
10
|
+
- bytes = field's element size
|
|
8
11
|
|
|
9
12
|
---------------------------------------------------------------------------- */
|
|
10
13
|
|
|
11
14
|
#include "carray.h"
|
|
15
|
+
#include "carray_internal.h" /* per-obj_type view constructors */
|
|
16
|
+
|
|
17
|
+
extern ca_operation_function_t ca_stride_func;
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
int8_t ndim;
|
|
17
|
-
int32_t flags;
|
|
18
|
-
ca_size_t bytes;
|
|
19
|
-
ca_size_t elements;
|
|
20
|
-
ca_size_t *dim;
|
|
21
|
-
char *ptr;
|
|
22
|
-
CArray *mask;
|
|
23
|
-
CArray *parent;
|
|
24
|
-
uint32_t attach;
|
|
25
|
-
uint8_t nosync;
|
|
26
|
-
/* -------------*/
|
|
27
|
-
ca_size_t offset;
|
|
28
|
-
} CAField;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const rb_data_type_t cafield_data_type = {
|
|
32
|
-
.parent = &cavirtual_data_type,
|
|
33
|
-
.wrap_struct_name = "CAField",
|
|
34
|
-
.function = {
|
|
35
|
-
.dmark = ca_mark,
|
|
36
|
-
.dfree = ca_free,
|
|
37
|
-
.dsize = NULL,
|
|
38
|
-
.dcompact = NULL
|
|
39
|
-
},
|
|
40
|
-
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
static int8_t CA_OBJ_FIELD;
|
|
44
|
-
|
|
45
|
-
static VALUE rb_cCAField;
|
|
46
|
-
|
|
47
|
-
/* yard:
|
|
48
|
-
class CAField < CAVirtual # :nodoc:
|
|
49
|
-
end
|
|
50
|
-
*/
|
|
19
|
+
int8_t CA_OBJ_FIELD;
|
|
20
|
+
VALUE rb_cCAField;
|
|
21
|
+
VALUE rb_cCAFieldMask;
|
|
51
22
|
|
|
52
23
|
/* ------------------------------------------------------------------- */
|
|
53
24
|
|
|
25
|
+
/* Build row-major byte-strides over the parent's record layout and
|
|
26
|
+
delegate to ca_stride_setup. `offset` becomes the CAStride
|
|
27
|
+
base_offset (in bytes). */
|
|
54
28
|
int
|
|
55
|
-
ca_field_setup (
|
|
29
|
+
ca_field_setup (CAStride *ca, CArray *parent,
|
|
56
30
|
ca_size_t offset, int8_t data_type, ca_size_t bytes)
|
|
57
31
|
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
/* check arguments */
|
|
32
|
+
ca_size_t strides[CA_RANK_MAX];
|
|
33
|
+
int8_t i;
|
|
62
34
|
|
|
63
35
|
CA_CHECK_DATA_TYPE(data_type);
|
|
64
36
|
CA_CHECK_BYTES(data_type, bytes);
|
|
37
|
+
|
|
65
38
|
if ( offset < 0 ) {
|
|
66
39
|
rb_raise(rb_eRuntimeError, "negative offset");
|
|
67
40
|
}
|
|
68
|
-
|
|
69
41
|
if ( data_type == CA_OBJECT ) {
|
|
70
42
|
rb_raise(rb_eCADataTypeError,
|
|
71
|
-
|
|
43
|
+
"CA_OBJECT can not to be a data_type for CAField");
|
|
72
44
|
}
|
|
73
|
-
|
|
74
45
|
if ( parent->bytes < offset + bytes ) {
|
|
75
46
|
rb_raise(rb_eRuntimeError, "offset or bytes out of range");
|
|
76
47
|
}
|
|
77
48
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
ca->ptr = NULL;
|
|
88
|
-
ca->mask = NULL;
|
|
89
|
-
ca->dim = ALLOC_N(ca_size_t, ndim);
|
|
90
|
-
|
|
91
|
-
ca->parent = parent;
|
|
92
|
-
ca->attach = 0;
|
|
93
|
-
ca->nosync = 0;
|
|
94
|
-
ca->offset = offset;
|
|
95
|
-
|
|
96
|
-
memcpy(ca->dim, parent->dim, ndim * sizeof(ca_size_t));
|
|
97
|
-
|
|
98
|
-
if ( ca_has_mask(parent) ) {
|
|
99
|
-
ca_create_mask(ca);
|
|
49
|
+
/* strides[k] = parent->bytes × Π_{i>k} parent->dim[i]. Same shape
|
|
50
|
+
as parent because each output element corresponds 1:1 to a
|
|
51
|
+
parent record. */
|
|
52
|
+
{
|
|
53
|
+
ca_size_t s = parent->bytes;
|
|
54
|
+
for (i = parent->ndim - 1; i >= 0; i--) {
|
|
55
|
+
strides[i] = s;
|
|
56
|
+
s *= parent->dim[i];
|
|
57
|
+
}
|
|
100
58
|
}
|
|
101
59
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
60
|
+
ca_stride_setup(ca, CA_OBJ_FIELD, parent,
|
|
61
|
+
data_type, bytes,
|
|
62
|
+
parent->ndim, parent->dim, strides, offset);
|
|
105
63
|
|
|
106
64
|
return 0;
|
|
107
65
|
}
|
|
108
66
|
|
|
109
|
-
|
|
67
|
+
CAStride *
|
|
110
68
|
ca_field_new (CArray *parent, ca_size_t offset, int8_t data_type, ca_size_t bytes)
|
|
111
69
|
{
|
|
112
|
-
|
|
70
|
+
CAStride *ca = (CAStride *) ca_array_alloc(CA_OBJ_FIELD, parent->ndim);
|
|
113
71
|
ca_field_setup(ca, parent, offset, data_type, bytes);
|
|
114
72
|
return ca;
|
|
115
73
|
}
|
|
116
74
|
|
|
117
|
-
static void
|
|
118
|
-
free_ca_field (void *ap)
|
|
119
|
-
{
|
|
120
|
-
CAField *ca = (CAField *) ap;
|
|
121
|
-
if ( ca != NULL ) {
|
|
122
|
-
ca_free(ca->mask);
|
|
123
|
-
xfree(ca->dim);
|
|
124
|
-
xfree(ca);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
static void ca_field_attach (CAField *ca);
|
|
129
|
-
static void ca_field_sync (CAField *ca);
|
|
130
|
-
static void ca_field_fill (CAField *ca, char *ptr);
|
|
131
|
-
|
|
132
|
-
/* ------------------------------------------------------------------- */
|
|
133
|
-
|
|
134
|
-
static void *
|
|
135
|
-
ca_field_func_clone (void *ap)
|
|
136
|
-
{
|
|
137
|
-
CAField *ca = (CAField *) ap;
|
|
138
|
-
return ca_field_new(ca->parent, ca->offset, ca->data_type, ca->bytes);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
static char *
|
|
142
|
-
ca_field_func_ptr_at_addr (void *ap, ca_size_t addr)
|
|
143
|
-
{
|
|
144
|
-
CAField *ca = (CAField *) ap;
|
|
145
|
-
if ( ! ca->ptr ) {
|
|
146
|
-
ca_size_t idx[CA_RANK_MAX];
|
|
147
|
-
ca_addr2index((CArray *)ca, addr, idx);
|
|
148
|
-
return ca_ptr_at_index(ca, idx);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
return ca->ptr + ca->bytes * addr;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
static char *
|
|
156
|
-
ca_field_func_ptr_at_index (void *ap, ca_size_t *idx)
|
|
157
|
-
{
|
|
158
|
-
CAField *ca = (CAField *) ap;
|
|
159
|
-
if ( ! ca->ptr ) {
|
|
160
|
-
ca_size_t *dim = ca->dim;
|
|
161
|
-
int8_t i;
|
|
162
|
-
ca_size_t n;
|
|
163
|
-
n = idx[0]; /* n = idx[0]*dim[1]*dim[2]*...*dim[ndim-1] */
|
|
164
|
-
for (i=1; i<ca->ndim; i++) { /* + idx[1]*dim[1]*dim[2]*...*dim[ndim-1] */
|
|
165
|
-
n = dim[i]*n+idx[i]; /* ... + idx[ndim-2]*dim[1] + idx[ndim-1] */
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if ( ca->parent->ptr == NULL ) {
|
|
169
|
-
return (void *)((char *) ca_ptr_at_addr(ca->parent, n) + ca->offset);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
return ca->parent->ptr + ca->parent->bytes * n + ca->offset;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
return ca_func[CA_OBJ_ARRAY].ptr_at_index(ca, idx);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
static void
|
|
181
|
-
ca_field_func_fetch_index (void *ap, ca_size_t *idx, void *ptr)
|
|
182
|
-
{
|
|
183
|
-
CAField *ca = (CAField *) ap;
|
|
184
|
-
if ( ca->parent->bytes <= 32 ) {
|
|
185
|
-
char v[32];
|
|
186
|
-
ca_fetch_index(ca->parent, idx, v);
|
|
187
|
-
memcpy(ptr, v + ca->offset, ca->bytes);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
char *v = malloc_with_check(ca->parent->bytes);
|
|
191
|
-
ca_fetch_index(ca->parent, idx, v);
|
|
192
|
-
memcpy(ptr, v + ca->offset, ca->bytes);
|
|
193
|
-
free(v);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
static void
|
|
198
|
-
ca_field_func_store_index (void *ap, ca_size_t *idx, void *ptr)
|
|
199
|
-
{
|
|
200
|
-
CAField *ca = (CAField *) ap;
|
|
201
|
-
if ( ca->parent->bytes <= 32 ) {
|
|
202
|
-
char v[32];
|
|
203
|
-
ca_fetch_index(ca->parent, idx, v);
|
|
204
|
-
memcpy(v + ca->offset, ptr, ca->bytes);
|
|
205
|
-
ca_store_index(ca->parent, idx, v);
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
char *v = malloc_with_check(ca->parent->bytes);
|
|
209
|
-
ca_fetch_index(ca->parent, idx, v);
|
|
210
|
-
memcpy(v + ca->offset, ptr, ca->bytes);
|
|
211
|
-
ca_store_index(ca->parent, idx, v);
|
|
212
|
-
free(v);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
static void
|
|
217
|
-
ca_field_func_allocate (void *ap)
|
|
218
|
-
{
|
|
219
|
-
CAField *ca = (CAField *) ap;
|
|
220
|
-
ca_attach(ca->parent);
|
|
221
|
-
/* ca->ptr = ALLOC_N(char, ca_length(ca)); */
|
|
222
|
-
ca->ptr = malloc_with_check(ca_length(ca));
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
static void
|
|
226
|
-
ca_field_func_attach (void *ap)
|
|
227
|
-
{
|
|
228
|
-
void ca_field_attach (CAField *cb);
|
|
229
|
-
|
|
230
|
-
CAField *ca = (CAField *) ap;
|
|
231
|
-
ca_attach(ca->parent);
|
|
232
|
-
/* ca->ptr = ALLOC_N(char, ca_length(ca)); */
|
|
233
|
-
ca->ptr = malloc_with_check(ca_length(ca));
|
|
234
|
-
ca_field_attach(ca);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
static void
|
|
238
|
-
ca_field_func_sync (void *ap)
|
|
239
|
-
{
|
|
240
|
-
CAField *ca = (CAField *) ap;
|
|
241
|
-
ca_field_sync(ca);
|
|
242
|
-
ca_sync(ca->parent);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
static void
|
|
246
|
-
ca_field_func_detach (void *ap)
|
|
247
|
-
{
|
|
248
|
-
CAField *ca = (CAField *) ap;
|
|
249
|
-
free(ca->ptr);
|
|
250
|
-
ca->ptr = NULL;
|
|
251
|
-
ca_detach(ca->parent);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
static void
|
|
255
|
-
ca_field_func_copy_data (void *ap, void *ptr)
|
|
256
|
-
{
|
|
257
|
-
CAField *ca = (CAField *) ap;
|
|
258
|
-
char *ptr0 = ca->ptr;
|
|
259
|
-
ca_attach(ca->parent);
|
|
260
|
-
ca->ptr = ptr;
|
|
261
|
-
ca_field_attach(ca);
|
|
262
|
-
ca->ptr = ptr0;
|
|
263
|
-
ca_detach(ca->parent);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
static void
|
|
267
|
-
ca_field_func_sync_data (void *ap, void *ptr)
|
|
268
|
-
{
|
|
269
|
-
CAField *ca = (CAField *) ap;
|
|
270
|
-
char *ptr0 = ca->ptr;
|
|
271
|
-
ca_attach(ca->parent);
|
|
272
|
-
ca->ptr = ptr;
|
|
273
|
-
ca_field_sync(ca);
|
|
274
|
-
ca->ptr = ptr0;
|
|
275
|
-
ca_sync(ca->parent);
|
|
276
|
-
ca_detach(ca->parent);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
static void
|
|
280
|
-
ca_field_func_fill_data (void *ap, void *ptr)
|
|
281
|
-
{
|
|
282
|
-
CAField *ca = (CAField *) ap;
|
|
283
|
-
ca_attach(ca->parent);
|
|
284
|
-
ca_field_fill(ca, ptr);
|
|
285
|
-
ca_sync(ca->parent);
|
|
286
|
-
ca_detach(ca->parent);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
static void
|
|
290
|
-
ca_field_func_create_mask (void *ap)
|
|
291
|
-
{
|
|
292
|
-
CAField *ca = (CAField *) ap;
|
|
293
|
-
ca_update_mask(ca->parent);
|
|
294
|
-
if ( ! ca->parent->mask ) {
|
|
295
|
-
ca_create_mask(ca->parent);
|
|
296
|
-
}
|
|
297
|
-
ca->mask =
|
|
298
|
-
(CArray *) ca_refer_new(ca->parent->mask,
|
|
299
|
-
CA_BOOLEAN, ca->ndim, ca->dim, 0, 0);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
ca_operation_function_t ca_field_func = {
|
|
303
|
-
-1, /* CA_OBJ_FIELD */
|
|
304
|
-
CA_VIRTUAL_ARRAY,
|
|
305
|
-
free_ca_field,
|
|
306
|
-
ca_field_func_clone,
|
|
307
|
-
ca_field_func_ptr_at_addr,
|
|
308
|
-
ca_field_func_ptr_at_index,
|
|
309
|
-
NULL,
|
|
310
|
-
ca_field_func_fetch_index,
|
|
311
|
-
NULL,
|
|
312
|
-
ca_field_func_store_index,
|
|
313
|
-
ca_field_func_allocate,
|
|
314
|
-
ca_field_func_attach,
|
|
315
|
-
ca_field_func_sync,
|
|
316
|
-
ca_field_func_detach,
|
|
317
|
-
ca_field_func_copy_data,
|
|
318
|
-
ca_field_func_sync_data,
|
|
319
|
-
ca_field_func_fill_data,
|
|
320
|
-
ca_field_func_create_mask,
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
/* ------------------------------------------------------------------- */
|
|
324
|
-
|
|
325
|
-
static void
|
|
326
|
-
ca_field_attach (CAField *ca)
|
|
327
|
-
{
|
|
328
|
-
ca_size_t pbytes = ca->parent->bytes;
|
|
329
|
-
ca_size_t bytes = ca->bytes;
|
|
330
|
-
ca_size_t n = ca->elements;
|
|
331
|
-
|
|
332
|
-
switch ( ca->data_type ) {
|
|
333
|
-
case CA_BOOLEAN:
|
|
334
|
-
case CA_INT8:
|
|
335
|
-
case CA_UINT8:
|
|
336
|
-
{
|
|
337
|
-
char *p = ca_ptr_at_addr(ca, 0);
|
|
338
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
339
|
-
while ( n-- ) {
|
|
340
|
-
*p = *q;
|
|
341
|
-
p += 1; q += pbytes;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
break;
|
|
345
|
-
case CA_INT16:
|
|
346
|
-
case CA_UINT16:
|
|
347
|
-
{
|
|
348
|
-
int16_t *p = (int16_t*) ca_ptr_at_addr(ca, 0);
|
|
349
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
350
|
-
while ( n-- ) {
|
|
351
|
-
*p = *(int16_t*) q;
|
|
352
|
-
p += 1; q += pbytes;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
break;
|
|
356
|
-
case CA_INT32:
|
|
357
|
-
case CA_UINT32:
|
|
358
|
-
case CA_FLOAT32:
|
|
359
|
-
{
|
|
360
|
-
int32_t *p = (int32_t*) ca_ptr_at_addr(ca, 0);
|
|
361
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
362
|
-
while ( n-- ) {
|
|
363
|
-
*p = *(int32_t*) q;
|
|
364
|
-
p += 1; q += pbytes;
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
break;
|
|
368
|
-
case CA_INT64:
|
|
369
|
-
case CA_UINT64:
|
|
370
|
-
case CA_FLOAT64:
|
|
371
|
-
{
|
|
372
|
-
float64_t *p = (float64_t*) ca_ptr_at_addr(ca, 0);
|
|
373
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
374
|
-
while ( n-- ) {
|
|
375
|
-
*p = *(float64_t*) q;
|
|
376
|
-
p += 1; q += pbytes;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
break;
|
|
380
|
-
default:
|
|
381
|
-
{
|
|
382
|
-
char *p = ca_ptr_at_addr(ca, 0);
|
|
383
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
384
|
-
while ( n-- ) {
|
|
385
|
-
memcpy(p, q, ca->bytes);
|
|
386
|
-
p += bytes; q += pbytes;
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
static void
|
|
393
|
-
ca_field_sync (CAField *ca)
|
|
394
|
-
{
|
|
395
|
-
ca_size_t pbytes = ca->parent->bytes;
|
|
396
|
-
ca_size_t bytes = ca->bytes;
|
|
397
|
-
ca_size_t n = ca->elements;
|
|
398
|
-
|
|
399
|
-
switch ( ca->data_type ) {
|
|
400
|
-
case CA_BOOLEAN:
|
|
401
|
-
case CA_INT8:
|
|
402
|
-
case CA_UINT8:
|
|
403
|
-
{
|
|
404
|
-
char *p = ca_ptr_at_addr(ca, 0);
|
|
405
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
406
|
-
while ( n-- ) {
|
|
407
|
-
*q = *p;
|
|
408
|
-
p += 1; q += pbytes;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
break;
|
|
412
|
-
case CA_INT16:
|
|
413
|
-
case CA_UINT16:
|
|
414
|
-
{
|
|
415
|
-
int16_t *p = (int16_t*) ca_ptr_at_addr(ca, 0);
|
|
416
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
417
|
-
while ( n-- ) {
|
|
418
|
-
*(int16_t*) q = *p;
|
|
419
|
-
p += 1; q += pbytes;
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
break;
|
|
423
|
-
case CA_INT32:
|
|
424
|
-
case CA_UINT32:
|
|
425
|
-
case CA_FLOAT32:
|
|
426
|
-
{
|
|
427
|
-
int32_t *p = (int32_t*) ca_ptr_at_addr(ca, 0);
|
|
428
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
429
|
-
while ( n-- ) {
|
|
430
|
-
*(int32_t*) q = *p;
|
|
431
|
-
p += 1; q += pbytes;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
break;
|
|
435
|
-
case CA_INT64:
|
|
436
|
-
case CA_UINT64:
|
|
437
|
-
case CA_FLOAT64:
|
|
438
|
-
{
|
|
439
|
-
float64_t *p = (float64_t*) ca_ptr_at_addr(ca, 0);
|
|
440
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
441
|
-
while ( n-- ) {
|
|
442
|
-
*(float64_t*) q = *p;
|
|
443
|
-
p += 1; q += pbytes;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
break;
|
|
447
|
-
default:
|
|
448
|
-
{
|
|
449
|
-
char *p = ca_ptr_at_addr(ca, 0);
|
|
450
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
451
|
-
while ( n-- ) {
|
|
452
|
-
memcpy(q, p, ca->bytes);
|
|
453
|
-
p += bytes; q += pbytes;
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
static void
|
|
460
|
-
ca_field_fill (CAField *ca, char *ptr)
|
|
461
|
-
{
|
|
462
|
-
ca_size_t pbytes = ca->parent->bytes;
|
|
463
|
-
ca_size_t n = ca->elements;
|
|
464
|
-
char *q = (char *) ca_ptr_at_addr(ca->parent, 0) + ca->offset;
|
|
465
|
-
|
|
466
|
-
switch ( ca->data_type ) {
|
|
467
|
-
case CA_BOOLEAN:
|
|
468
|
-
case CA_INT8:
|
|
469
|
-
case CA_UINT8:
|
|
470
|
-
{
|
|
471
|
-
char *p = ptr;
|
|
472
|
-
while ( n-- ) {
|
|
473
|
-
*q = *p;
|
|
474
|
-
q += pbytes;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
break;
|
|
478
|
-
case CA_INT16:
|
|
479
|
-
case CA_UINT16:
|
|
480
|
-
{
|
|
481
|
-
int16_t *p = (int16_t*) ptr;
|
|
482
|
-
while ( n-- ) {
|
|
483
|
-
*(int16_t*) q = *p;
|
|
484
|
-
q += pbytes;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
break;
|
|
488
|
-
case CA_INT32:
|
|
489
|
-
case CA_UINT32:
|
|
490
|
-
case CA_FLOAT32:
|
|
491
|
-
{
|
|
492
|
-
int32_t *p = (int32_t*) ptr;
|
|
493
|
-
while ( n-- ) {
|
|
494
|
-
*(int32_t*) q = *p;
|
|
495
|
-
q += pbytes;
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
break;
|
|
499
|
-
case CA_INT64:
|
|
500
|
-
case CA_UINT64:
|
|
501
|
-
case CA_FLOAT64:
|
|
502
|
-
{
|
|
503
|
-
float64_t *p = (float64_t*) ptr;
|
|
504
|
-
while ( n-- ) {
|
|
505
|
-
*(float64_t*) q = *p;
|
|
506
|
-
q += pbytes;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
break;
|
|
510
|
-
default:
|
|
511
|
-
{
|
|
512
|
-
while ( n-- ) {
|
|
513
|
-
memcpy(q, ptr, ca->bytes);
|
|
514
|
-
q += pbytes;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
}
|
|
520
|
-
|
|
521
75
|
/* ------------------------------------------------------------------- */
|
|
522
76
|
|
|
523
77
|
VALUE
|
|
@@ -525,49 +79,22 @@ rb_ca_field_new (VALUE cary, ca_size_t offset, int8_t data_type, ca_size_t bytes
|
|
|
525
79
|
{
|
|
526
80
|
volatile VALUE obj;
|
|
527
81
|
CArray *parent;
|
|
528
|
-
|
|
82
|
+
CAStride *ca;
|
|
529
83
|
rb_check_carray_object(cary);
|
|
530
84
|
TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
|
|
531
|
-
ca
|
|
85
|
+
ca = ca_field_new(parent, offset, data_type, bytes);
|
|
532
86
|
obj = ca_wrap_struct(ca);
|
|
533
87
|
rb_ca_set_parent(obj, cary);
|
|
534
88
|
return obj;
|
|
535
89
|
}
|
|
536
90
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
static VALUE
|
|
545
|
-
rb_ca_field_initialize_copy (VALUE self, VALUE other)
|
|
546
|
-
{
|
|
547
|
-
CAField *ca, *cs;
|
|
548
|
-
|
|
549
|
-
TypedData_Get_Struct(self, CAField, &cafield_data_type, ca);
|
|
550
|
-
TypedData_Get_Struct(other, CAField, &cafield_data_type, cs);
|
|
551
|
-
|
|
552
|
-
ca_field_setup(ca, cs->parent, cs->offset, cs->data_type, cs->bytes);
|
|
553
|
-
|
|
554
|
-
return self;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/* ----------------------------------------------------------------------- */
|
|
558
|
-
|
|
559
|
-
/* yard:
|
|
560
|
-
class CArray
|
|
561
|
-
# call-seq:
|
|
562
|
-
# CArray#field(offset, data_type[, :bytes=>bytes])
|
|
563
|
-
# CArray#field(offset, data_class)
|
|
564
|
-
# CArray#field(offset, template)
|
|
565
|
-
#
|
|
566
|
-
def field (offset, data_type)
|
|
567
|
-
end
|
|
568
|
-
end
|
|
569
|
-
*/
|
|
570
|
-
|
|
91
|
+
/* CArray#field(offset, data_type, bytes: nil) -- returns a CAField view of
|
|
92
|
+
the field at `offset` (in bytes) within each record of `self`. If
|
|
93
|
+
`data_type` is a CArray, the result is wrapped in a CARefer that
|
|
94
|
+
adopts its element type and trailing dimensions (= struct-of-array
|
|
95
|
+
subview). If it is a data_class (e.g. CAStruct subclass), the
|
|
96
|
+
CAField is wrapped in a CARecord so encode/decode dispatch is
|
|
97
|
+
carried. One-arg form delegates to rb_ca_face_field. */
|
|
571
98
|
VALUE
|
|
572
99
|
rb_ca_field (int argc, VALUE *argv, VALUE self)
|
|
573
100
|
{
|
|
@@ -577,7 +104,7 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
|
|
|
577
104
|
ca_size_t offset, bytes;
|
|
578
105
|
|
|
579
106
|
if ( argc == 1 ) {
|
|
580
|
-
return
|
|
107
|
+
return rb_ca_face_field(self, argv[0]);
|
|
581
108
|
}
|
|
582
109
|
|
|
583
110
|
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
|
@@ -600,7 +127,6 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
|
|
|
600
127
|
data_type = CA_FIXLEN;
|
|
601
128
|
bytes = ct->bytes * ct->elements;
|
|
602
129
|
obj = rb_ca_field_new(self, offset, data_type, bytes);
|
|
603
|
-
rb_ca_data_type_inherit(obj, rtype);
|
|
604
130
|
ndim = ca->ndim + ct->ndim;
|
|
605
131
|
for (i=0; i<ca->ndim; i++) {
|
|
606
132
|
dim[i] = ca->dim[i];
|
|
@@ -613,28 +139,55 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
|
|
|
613
139
|
else {
|
|
614
140
|
rb_ca_guess_type_and_bytes(rtype, rbytes, &data_type, &bytes);
|
|
615
141
|
obj = rb_ca_field_new(self, offset, data_type, bytes);
|
|
616
|
-
|
|
142
|
+
/* When rtype is a data_class, wrap the CAField in a CARecord so the
|
|
143
|
+
view carries the encode/decode dispatch. */
|
|
144
|
+
if ( rb_obj_is_data_class(rtype) ) {
|
|
145
|
+
obj = rb_funcall(rb_const_get(rb_cObject, rb_intern("CARecord")),
|
|
146
|
+
rb_intern("wrap"), 2, obj, rtype);
|
|
147
|
+
}
|
|
617
148
|
}
|
|
618
149
|
|
|
619
150
|
return obj;
|
|
620
151
|
}
|
|
621
152
|
|
|
153
|
+
/* Pure CAStride subclasses share castride_data_type, so no custom
|
|
154
|
+
allocator is needed — ALLOC(CAStride) via rb_cs_s_allocate is
|
|
155
|
+
already correct for CAField too. */
|
|
156
|
+
|
|
157
|
+
static VALUE
|
|
158
|
+
rb_ca_field_initialize_copy (VALUE self, VALUE other)
|
|
159
|
+
{
|
|
160
|
+
CAStride *ca, *cs;
|
|
161
|
+
|
|
162
|
+
TypedData_Get_Struct(self, CAStride, &castride_data_type, ca);
|
|
163
|
+
TypedData_Get_Struct(other, CAStride, &castride_data_type, cs);
|
|
164
|
+
|
|
165
|
+
if ( ca_func[CA_OBJ_FIELD].pool_init ) {
|
|
166
|
+
ca_array_pool_alloc(ca, CA_OBJ_FIELD, cs->parent->ndim);
|
|
167
|
+
}
|
|
168
|
+
/* Reconstruct from the source's base_offset / data_type / bytes;
|
|
169
|
+
ca_field_setup recomputes strides from parent's shape. */
|
|
170
|
+
ca_field_setup(ca, cs->parent, cs->base_offset, cs->data_type, cs->bytes);
|
|
171
|
+
|
|
172
|
+
return self;
|
|
173
|
+
}
|
|
622
174
|
|
|
623
175
|
void
|
|
624
|
-
Init_ca_obj_field ()
|
|
176
|
+
Init_ca_obj_field (void)
|
|
625
177
|
{
|
|
626
|
-
rb_cCAField
|
|
178
|
+
/* rb_cCAField and rb_cCAFieldMask are declared upfront in
|
|
179
|
+
ruby_carray.c so their inheritance chain (CAField < CAStride <
|
|
180
|
+
CAView < CArray) is established before this Init runs. */
|
|
627
181
|
|
|
628
|
-
CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField,
|
|
629
|
-
&
|
|
630
|
-
|
|
631
|
-
|
|
182
|
+
CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField,
|
|
183
|
+
&castride_data_type,
|
|
184
|
+
rb_cCAFieldMask,
|
|
185
|
+
&castride_mask_data_type,
|
|
186
|
+
&ca_stride_func, sizeof(ca_stride_func));
|
|
632
187
|
rb_define_const(rb_cObject, "CA_OBJ_FIELD", INT2NUM(CA_OBJ_FIELD));
|
|
633
188
|
|
|
634
189
|
rb_define_method(rb_cCArray, "field", rb_ca_field, -1);
|
|
635
190
|
|
|
636
|
-
rb_define_alloc_func(rb_cCAField, rb_ca_field_s_allocate);
|
|
637
191
|
rb_define_method(rb_cCAField, "initialize_copy",
|
|
638
192
|
rb_ca_field_initialize_copy, 1);
|
|
639
193
|
}
|
|
640
|
-
|