carray 1.5.9 → 2.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/NEWS.md +10 -0
- data/TODO.md +1 -0
- data/carray.gemspec +1 -1
- data/ext/ca_iter_block.c +20 -5
- data/ext/ca_iter_dimension.c +21 -10
- data/ext/ca_iter_window.c +17 -5
- data/ext/ca_obj_array.c +73 -10
- data/ext/ca_obj_bitarray.c +21 -6
- data/ext/ca_obj_bitfield.c +21 -11
- data/ext/ca_obj_block.c +34 -10
- data/ext/ca_obj_fake.c +21 -6
- data/ext/ca_obj_farray.c +34 -5
- data/ext/ca_obj_field.c +23 -7
- data/ext/ca_obj_grid.c +36 -7
- data/ext/ca_obj_mapping.c +36 -7
- data/ext/ca_obj_object.c +35 -9
- data/ext/ca_obj_reduce.c +34 -5
- data/ext/ca_obj_refer.c +31 -10
- data/ext/ca_obj_repeat.c +35 -12
- data/ext/ca_obj_select.c +35 -9
- data/ext/ca_obj_shift.c +41 -12
- data/ext/ca_obj_transpose.c +36 -7
- data/ext/ca_obj_unbound_repeat.c +39 -14
- data/ext/ca_obj_window.c +46 -15
- data/ext/carray.h +97 -31
- data/ext/carray_access.c +25 -42
- data/ext/carray_attribute.c +35 -35
- data/ext/carray_call_cfunc.c +28 -28
- data/ext/carray_cast.c +25 -26
- data/ext/carray_cast_func.rb +1 -2
- data/ext/carray_conversion.c +7 -10
- data/ext/carray_copy.c +5 -5
- data/ext/carray_core.c +44 -7
- data/ext/carray_element.c +9 -9
- data/ext/carray_generate.c +7 -7
- data/ext/carray_iterator.c +33 -23
- data/ext/carray_loop.c +9 -9
- data/ext/carray_mask.c +38 -36
- data/ext/carray_math.rb +6 -6
- data/ext/carray_numeric.c +1 -1
- data/ext/carray_operator.c +31 -21
- data/ext/carray_order.c +216 -12
- data/ext/carray_sort_addr.c +2 -2
- data/ext/carray_stat.c +22 -22
- data/ext/carray_stat_proc.rb +13 -13
- data/ext/carray_test.c +8 -8
- data/ext/ruby_carray.c +7 -0
- data/ext/ruby_ccomplex.c +25 -11
- data/ext/version.h +6 -6
- data/lib/carray/inspect.rb +0 -3
- data/lib/carray/io/imagemagick.rb +8 -9
- data/lib/carray/mkmf.rb +1 -0
- data/lib/carray/time.rb +1 -1
- data/spec/Classes/ex1.rb +46 -0
- metadata +4 -6
data/ext/carray_conversion.c
CHANGED
@@ -23,7 +23,7 @@ rb_ca_to_a_loop (VALUE self, int32_t level, ca_size_t *idx, VALUE ary)
|
|
23
23
|
CArray *ca;
|
24
24
|
ca_size_t i;
|
25
25
|
|
26
|
-
|
26
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
27
27
|
|
28
28
|
if ( level == ca->ndim - 1 ) {
|
29
29
|
for (i=0; i<ca->dim[level]; i++) {
|
@@ -55,7 +55,7 @@ rb_ca_to_a (VALUE self)
|
|
55
55
|
volatile VALUE ary;
|
56
56
|
CArray *ca;
|
57
57
|
ca_size_t idx[CA_RANK_MAX];
|
58
|
-
|
58
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
59
59
|
ary = rb_ary_new2(ca->dim[0]);
|
60
60
|
ca_attach(ca);
|
61
61
|
rb_ca_to_a_loop(self, 0, idx, ary);
|
@@ -80,7 +80,7 @@ rb_ca_convert (int argc, VALUE *argv, VALUE self)
|
|
80
80
|
|
81
81
|
obj = rb_apply(self, rb_intern("template"), rb_ary_new4(argc, argv));
|
82
82
|
|
83
|
-
|
83
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
84
84
|
ca_attach(ca);
|
85
85
|
if ( ca_has_mask(ca) ) {
|
86
86
|
for (i=0; i<ca->elements; i++) {
|
@@ -114,7 +114,7 @@ rb_ca_dump_binary (int argc, VALUE *argv, VALUE self)
|
|
114
114
|
volatile VALUE io;
|
115
115
|
CArray *ca;
|
116
116
|
|
117
|
-
|
117
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
118
118
|
|
119
119
|
if ( ca_is_object_type(ca) ) {
|
120
120
|
rb_raise(rb_eCADataTypeError, "don't dump object array");
|
@@ -137,7 +137,6 @@ rb_ca_dump_binary (int argc, VALUE *argv, VALUE self)
|
|
137
137
|
}
|
138
138
|
ca_copy_data(ca, StringValuePtr(io));
|
139
139
|
StringValuePtr(io)[ca_length(ca)] = '\0';
|
140
|
-
OBJ_TAINT(io);
|
141
140
|
break;
|
142
141
|
#if RUBY_VERSION_CODE >= 190
|
143
142
|
case T_FILE: {
|
@@ -170,7 +169,6 @@ rb_ca_dump_binary (int argc, VALUE *argv, VALUE self)
|
|
170
169
|
if ( rb_respond_to(io, rb_intern("write") ) ) {
|
171
170
|
volatile VALUE buf = rb_str_new(NULL, ca_length(ca));
|
172
171
|
ca_copy_data(ca, StringValuePtr(buf));
|
173
|
-
OBJ_INFECT(buf, self);
|
174
172
|
rb_funcall(io, rb_intern("write"), 1, buf);
|
175
173
|
}
|
176
174
|
else {
|
@@ -204,7 +202,7 @@ rb_ca_load_binary (VALUE self, VALUE io)
|
|
204
202
|
{
|
205
203
|
CArray *ca;
|
206
204
|
|
207
|
-
|
205
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
208
206
|
|
209
207
|
if ( ca_is_object_type(ca) ) {
|
210
208
|
rb_raise(rb_eCADataTypeError, "don't load object array");
|
@@ -221,7 +219,6 @@ rb_ca_load_binary (VALUE self, VALUE io)
|
|
221
219
|
memcpy(ca->ptr, StringValuePtr(io), ca_length(ca));
|
222
220
|
ca_sync(ca);
|
223
221
|
ca_detach(ca);
|
224
|
-
OBJ_INFECT(self, io);
|
225
222
|
return self;
|
226
223
|
break;
|
227
224
|
default:
|
@@ -304,7 +301,7 @@ rb_ca_format (int argc, VALUE *argv, VALUE self)
|
|
304
301
|
ca_size_t i, j;
|
305
302
|
ID id_format = rb_intern("format");
|
306
303
|
|
307
|
-
|
304
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
308
305
|
|
309
306
|
obj = rb_ca_template_with_type(self, INT2NUM(CA_OBJECT), INT2NUM(0));
|
310
307
|
|
@@ -464,7 +461,7 @@ rb_test_ca_to_cptr (VALUE self)
|
|
464
461
|
double ****a;
|
465
462
|
int i, j, k, l;
|
466
463
|
|
467
|
-
|
464
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
468
465
|
|
469
466
|
ca_attach(ca);
|
470
467
|
|
data/ext/carray_copy.c
CHANGED
@@ -51,7 +51,7 @@ rb_ca_copy (VALUE self)
|
|
51
51
|
{
|
52
52
|
volatile VALUE obj;
|
53
53
|
CArray *ca;
|
54
|
-
|
54
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
55
55
|
obj = ca_wrap_struct(ca_copy(ca));
|
56
56
|
rb_ca_data_type_inherit(obj, self);
|
57
57
|
return obj;
|
@@ -116,7 +116,7 @@ rb_ca_template_method (int argc, VALUE *argv, VALUE self)
|
|
116
116
|
rb_scan_args(argc, argv, "01", (VALUE *) &rtype);
|
117
117
|
rb_scan_options(ropt, "bytes", &rbytes);
|
118
118
|
|
119
|
-
|
119
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
120
120
|
|
121
121
|
if ( NIL_P(rtype) ) { /* data_type not given */
|
122
122
|
co = ca_template_safe(ca);
|
@@ -170,7 +170,7 @@ rb_ca_template_n (int n, ...)
|
|
170
170
|
if ( ! rb_obj_is_carray(varg) ) {
|
171
171
|
rb_raise(rb_eRuntimeError, "[BUG] not-carray object given to rb_ca_template_n");
|
172
172
|
}
|
173
|
-
|
173
|
+
TypedData_Get_Struct(varg, CArray, &carray_data_type, ca);
|
174
174
|
if ( i == 0 ) {
|
175
175
|
obj = varg;
|
176
176
|
elements = ca->elements;
|
@@ -291,7 +291,7 @@ rb_ca_paste (VALUE self, VALUE roffset, VALUE rsrc)
|
|
291
291
|
|
292
292
|
rb_ca_modify(self);
|
293
293
|
|
294
|
-
|
294
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
295
295
|
|
296
296
|
Check_Type(roffset, T_ARRAY);
|
297
297
|
|
@@ -401,7 +401,7 @@ rb_ca_clip (VALUE self, VALUE roffset, VALUE rsrc)
|
|
401
401
|
ca_size_t offset[CA_RANK_MAX];
|
402
402
|
int i;
|
403
403
|
|
404
|
-
|
404
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
405
405
|
|
406
406
|
Check_Type(roffset, T_ARRAY);
|
407
407
|
|
data/ext/carray_core.c
CHANGED
@@ -22,6 +22,9 @@ const int ca_endian = CA_LITTLE_ENDIAN;
|
|
22
22
|
/* definition of variables for ca_func mechanism */
|
23
23
|
|
24
24
|
VALUE ca_class[CA_OBJ_TYPE_MAX];
|
25
|
+
const rb_data_type_t *ca_typeddata[CA_OBJ_TYPE_MAX];
|
26
|
+
VALUE ca_mask_class[CA_OBJ_TYPE_MAX];
|
27
|
+
const rb_data_type_t *ca_mask_typeddata[CA_OBJ_TYPE_MAX];
|
25
28
|
ca_operation_function_t ca_func[CA_OBJ_TYPE_MAX];
|
26
29
|
int ca_obj_num = 0;
|
27
30
|
|
@@ -254,38 +257,65 @@ ca_init_obj_type ()
|
|
254
257
|
/* CArray */
|
255
258
|
ca_func[CA_OBJ_ARRAY] = ca_array_func;
|
256
259
|
ca_class[CA_OBJ_ARRAY] = rb_cCArray;
|
260
|
+
ca_typeddata[CA_OBJ_ARRAY] = &carray_data_type;
|
261
|
+
ca_mask_class[CA_OBJ_ARRAY] = rb_cCArrayMask;
|
262
|
+
ca_mask_typeddata[CA_OBJ_ARRAY] = &carray_mask_data_type;
|
257
263
|
|
258
264
|
/* CAWrap */
|
259
265
|
ca_func[CA_OBJ_ARRAY_WRAP] = ca_wrap_func;
|
260
266
|
ca_class[CA_OBJ_ARRAY_WRAP] = rb_cCAWrap;
|
267
|
+
ca_typeddata[CA_OBJ_ARRAY_WRAP] = &cawrap_data_type;
|
268
|
+
ca_mask_class[CA_OBJ_ARRAY_WRAP] = rb_cCArrayMask;
|
269
|
+
ca_mask_typeddata[CA_OBJ_ARRAY_WRAP] = &carray_mask_data_type;
|
261
270
|
|
262
271
|
/* CAScalar */
|
263
272
|
ca_func[CA_OBJ_SCALAR] = ca_scalar_func;
|
264
273
|
ca_class[CA_OBJ_SCALAR] = rb_cCScalar;
|
274
|
+
ca_typeddata[CA_OBJ_SCALAR] = &cscalar_data_type;
|
275
|
+
ca_mask_class[CA_OBJ_SCALAR] = rb_cCArrayMask;
|
276
|
+
ca_mask_typeddata[CA_OBJ_SCALAR] = &carray_mask_data_type;
|
265
277
|
|
266
278
|
/* CARefer */
|
267
279
|
ca_func[CA_OBJ_REFER] = ca_refer_func;
|
268
280
|
ca_class[CA_OBJ_REFER] = rb_cCARefer;
|
281
|
+
ca_typeddata[CA_OBJ_REFER] = &carefer_data_type;
|
282
|
+
ca_mask_class[CA_OBJ_REFER] = rb_cCAReferMask;
|
283
|
+
ca_mask_typeddata[CA_OBJ_REFER] = &carefer_mask_data_type;
|
269
284
|
|
270
285
|
/* CABlock */
|
271
286
|
ca_func[CA_OBJ_BLOCK] = ca_block_func;
|
272
287
|
ca_class[CA_OBJ_BLOCK] = rb_cCABlock;
|
288
|
+
ca_typeddata[CA_OBJ_BLOCK] = &cablock_data_type;
|
289
|
+
ca_mask_class[CA_OBJ_BLOCK] = rb_cCABlockMask;
|
290
|
+
ca_mask_typeddata[CA_OBJ_BLOCK] = &cablock_mask_data_type;
|
273
291
|
|
274
292
|
/* CASelect */
|
275
293
|
ca_func[CA_OBJ_SELECT] = ca_select_func;
|
276
294
|
ca_class[CA_OBJ_SELECT] = rb_cCASelect;
|
295
|
+
ca_typeddata[CA_OBJ_SELECT] = &caselect_data_type;
|
296
|
+
ca_mask_class[CA_OBJ_SELECT] = rb_cCASelectMask;
|
297
|
+
ca_mask_typeddata[CA_OBJ_SELECT] = &caselect_mask_data_type;
|
277
298
|
|
278
299
|
/* CAObject */
|
279
300
|
ca_func[CA_OBJ_OBJECT] = ca_object_func;
|
280
301
|
ca_class[CA_OBJ_OBJECT] = rb_cCAObject;
|
302
|
+
ca_typeddata[CA_OBJ_OBJECT] = &caobject_data_type;
|
303
|
+
ca_mask_class[CA_OBJ_OBJECT] = rb_cCArrayMask;
|
304
|
+
ca_mask_typeddata[CA_OBJ_OBJECT] = &carray_mask_data_type;
|
281
305
|
|
282
306
|
/* CARepeat */
|
283
307
|
ca_func[CA_OBJ_REPEAT] = ca_repeat_func;
|
284
308
|
ca_class[CA_OBJ_REPEAT] = rb_cCARepeat;
|
309
|
+
ca_typeddata[CA_OBJ_REPEAT] = &carepeat_data_type;
|
310
|
+
ca_mask_class[CA_OBJ_REPEAT] = rb_cCARepeatMask;
|
311
|
+
ca_mask_typeddata[CA_OBJ_REPEAT] = &carepeat_mask_data_type;
|
285
312
|
|
286
313
|
/* CAUnboundRepeat */
|
287
314
|
ca_func[CA_OBJ_UNBOUND_REPEAT] = ca_ubrep_func;
|
288
315
|
ca_class[CA_OBJ_UNBOUND_REPEAT] = rb_cCAUnboundRepeat;
|
316
|
+
ca_typeddata[CA_OBJ_UNBOUND_REPEAT] = &caunboundrepeat_data_type;
|
317
|
+
ca_mask_class[CA_OBJ_UNBOUND_REPEAT] = rb_cCAUnboundRepeatMask;
|
318
|
+
ca_mask_typeddata[CA_OBJ_UNBOUND_REPEAT] = &caunboundrepeat_mask_data_type;
|
289
319
|
|
290
320
|
ca_obj_num = 9;
|
291
321
|
}
|
@@ -295,7 +325,11 @@ ca_init_obj_type ()
|
|
295
325
|
*/
|
296
326
|
|
297
327
|
int
|
298
|
-
ca_install_obj_type (VALUE klass,
|
328
|
+
ca_install_obj_type (VALUE klass,
|
329
|
+
const rb_data_type_t *typeddata,
|
330
|
+
VALUE mask_klass,
|
331
|
+
const rb_data_type_t *mask_typeddata,
|
332
|
+
ca_operation_function_t func)
|
299
333
|
{
|
300
334
|
int obj_type = ca_obj_num++;
|
301
335
|
|
@@ -309,6 +343,9 @@ ca_install_obj_type (VALUE klass, ca_operation_function_t func)
|
|
309
343
|
|
310
344
|
ca_class[obj_type] = klass;
|
311
345
|
ca_func[obj_type] = func;
|
346
|
+
ca_typeddata[obj_type] = typeddata;
|
347
|
+
ca_mask_class[obj_type] = mask_klass;
|
348
|
+
ca_mask_typeddata[obj_type] = mask_typeddata;
|
312
349
|
|
313
350
|
return obj_type;
|
314
351
|
}
|
@@ -344,7 +381,7 @@ ca_free (void *ap)
|
|
344
381
|
{
|
345
382
|
if ( ap ) {
|
346
383
|
CArray *ca = (CArray *) ap;
|
347
|
-
ca_func[ca->obj_type].free_object(
|
384
|
+
ca_func[ca->obj_type].free_object(ca); /* delegate */
|
348
385
|
}
|
349
386
|
}
|
350
387
|
|
@@ -367,7 +404,7 @@ VALUE
|
|
367
404
|
ca_wrap_struct (void *ap)
|
368
405
|
{
|
369
406
|
CArray *ca = (CArray *) ap;
|
370
|
-
return
|
407
|
+
return TypedData_Wrap_Struct(ca_class[ca->obj_type], ca_typeddata[ca->obj_type], ca);
|
371
408
|
}
|
372
409
|
|
373
410
|
/* ------------------------------------------------------------------- */
|
@@ -443,7 +480,7 @@ ca_test_cyclic_check(void *ap, void *ptr)
|
|
443
480
|
VALUE rval = *(VALUE*) ptr;
|
444
481
|
if ( rb_obj_is_carray(rval) ) {
|
445
482
|
CArray *cv;
|
446
|
-
|
483
|
+
TypedData_Get_Struct(rval, CArray, &carray_data_type, cv);
|
447
484
|
if ( ca_test_flag(cv, CA_FLAG_CYCLE_CHECK) ) {
|
448
485
|
rb_raise(rb_eRuntimeError, "cyclic reference is not allowed in CArray");
|
449
486
|
}
|
@@ -936,7 +973,7 @@ rb_ca_attach_i (VALUE self)
|
|
936
973
|
{
|
937
974
|
CArray *ca;
|
938
975
|
if ( rb_obj_is_carray(self) ) {
|
939
|
-
|
976
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
940
977
|
ca_attach(ca);
|
941
978
|
if ( ca_is_virtual(ca) ) {
|
942
979
|
CAVIRTUAL(ca)->nosync += 1;
|
@@ -952,7 +989,7 @@ rb_ca_sync_i (VALUE self)
|
|
952
989
|
{
|
953
990
|
CArray *ca;
|
954
991
|
if ( rb_obj_is_carray(self) ) {
|
955
|
-
|
992
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
956
993
|
if ( ca_is_virtual(ca) ) {
|
957
994
|
CAVIRTUAL(ca)->nosync -= 1;
|
958
995
|
ca_sync(ca);
|
@@ -969,7 +1006,7 @@ rb_ca_detach_i (VALUE self)
|
|
969
1006
|
{
|
970
1007
|
CArray *ca;
|
971
1008
|
if ( rb_obj_is_carray(self) ) {
|
972
|
-
|
1009
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
973
1010
|
if ( ca_is_virtual(ca) ) { /* virtual array */
|
974
1011
|
CAVIRTUAL(ca)->nosync -= 1;
|
975
1012
|
ca_detach(ca);
|
data/ext/carray_element.c
CHANGED
@@ -33,7 +33,7 @@ rb_ca_elem_swap (VALUE self, VALUE ridx1, VALUE ridx2)
|
|
33
33
|
|
34
34
|
rb_ca_modify(self);
|
35
35
|
|
36
|
-
|
36
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
37
37
|
|
38
38
|
ca_update_mask(ca);
|
39
39
|
has_mask = ( ca->mask ) ? 1 : 0;
|
@@ -143,7 +143,7 @@ rb_ca_elem_copy (VALUE self, VALUE ridx1, VALUE ridx2)
|
|
143
143
|
|
144
144
|
rb_ca_modify(self);
|
145
145
|
|
146
|
-
|
146
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
147
147
|
|
148
148
|
ca_update_mask(ca);
|
149
149
|
has_mask = ( ca->mask ) ? 1 : 0;
|
@@ -217,7 +217,7 @@ rb_ca_elem_store (VALUE self, VALUE ridx, VALUE obj)
|
|
217
217
|
|
218
218
|
rb_ca_modify(self);
|
219
219
|
|
220
|
-
|
220
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
221
221
|
|
222
222
|
if ( TYPE(ridx) == T_ARRAY ) {
|
223
223
|
for (i=0; i<ca->ndim; i++) {
|
@@ -251,7 +251,7 @@ rb_ca_elem_fetch (VALUE self, VALUE ridx)
|
|
251
251
|
int8_t i;
|
252
252
|
ca_size_t k;
|
253
253
|
|
254
|
-
|
254
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
255
255
|
|
256
256
|
if ( TYPE(ridx) == T_ARRAY ) {
|
257
257
|
for (i=0; i<ca->ndim; i++) {
|
@@ -291,7 +291,7 @@ rb_ca_elem_incr (VALUE self, VALUE ridx1)
|
|
291
291
|
|
292
292
|
rb_ca_modify(self);
|
293
293
|
|
294
|
-
|
294
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
295
295
|
|
296
296
|
if ( ! ca_is_integer_type(ca) ) {
|
297
297
|
rb_raise(rb_eCADataTypeError,
|
@@ -376,7 +376,7 @@ rb_ca_elem_decr (VALUE self, VALUE ridx1)
|
|
376
376
|
|
377
377
|
rb_ca_modify(self);
|
378
378
|
|
379
|
-
|
379
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
380
380
|
|
381
381
|
if ( ! ca_is_integer_type(ca) ) {
|
382
382
|
rb_raise(rb_eCADataTypeError,
|
@@ -454,7 +454,7 @@ rb_ca_elem_test_masked (VALUE self, VALUE ridx1)
|
|
454
454
|
ca_size_t k;
|
455
455
|
boolean8_t m = 0;
|
456
456
|
|
457
|
-
|
457
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
458
458
|
|
459
459
|
ca_update_mask(ca);
|
460
460
|
|
@@ -501,8 +501,8 @@ rb_ca_incr_addr (volatile VALUE self, volatile VALUE raddr)
|
|
501
501
|
self = rb_ca_wrap_writable(self, INT2NUM(CA_INT64));
|
502
502
|
raddr = rb_ca_wrap_readonly(raddr, INT2NUM(CA_INT64));
|
503
503
|
|
504
|
-
|
505
|
-
|
504
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
505
|
+
TypedData_Get_Struct(raddr, CArray, &carray_data_type, ci);
|
506
506
|
|
507
507
|
ca_attach_n(2, ca, ci);
|
508
508
|
|
data/ext/carray_generate.c
CHANGED
@@ -70,7 +70,7 @@ rb_ca_where (VALUE self)
|
|
70
70
|
|
71
71
|
bool0 = ( ! rb_ca_is_boolean_type(self) ) ? rb_ca_to_boolean(self) : self;
|
72
72
|
|
73
|
-
|
73
|
+
TypedData_Get_Struct(bool0, CArray, &carray_data_type, ca);
|
74
74
|
|
75
75
|
ca_attach(ca);
|
76
76
|
|
@@ -93,7 +93,7 @@ rb_ca_where (VALUE self)
|
|
93
93
|
|
94
94
|
/* create output array */
|
95
95
|
obj = rb_carray_new(CA_SIZE, 1, &count, 0, NULL);
|
96
|
-
|
96
|
+
TypedData_Get_Struct(obj, CArray, &carray_data_type, co);
|
97
97
|
|
98
98
|
/* store address which elements is true to output array */
|
99
99
|
p = (boolean8_t *) ca->ptr;
|
@@ -179,7 +179,7 @@ rb_ca_seq_bang_object (int argc, VALUE *argv, VALUE self)
|
|
179
179
|
VALUE *p;
|
180
180
|
ca_size_t i;
|
181
181
|
|
182
|
-
|
182
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
183
183
|
|
184
184
|
rb_scan_args((argc>2) ? 2 : argc, argv, "02", (VALUE *) &roffset, (VALUE *) &rstep);
|
185
185
|
|
@@ -269,7 +269,7 @@ rb_ca_seq_bang_method (int argc, VALUE *argv, VALUE self)
|
|
269
269
|
CArray *ca;
|
270
270
|
|
271
271
|
rb_ca_modify(self);
|
272
|
-
|
272
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
273
273
|
|
274
274
|
/* delegate to rb_ca_seq_bang_object if data_type is object */
|
275
275
|
if ( ca_is_object_type(ca) ) {
|
@@ -500,7 +500,7 @@ rb_ca_swap_bytes_bang (VALUE self)
|
|
500
500
|
}
|
501
501
|
}
|
502
502
|
else {
|
503
|
-
|
503
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
504
504
|
ca_attach(ca);
|
505
505
|
ca_swap_bytes(ca->ptr, ca->bytes, ca->elements);
|
506
506
|
ca_sync(ca);
|
@@ -509,7 +509,7 @@ rb_ca_swap_bytes_bang (VALUE self)
|
|
509
509
|
return self;
|
510
510
|
}
|
511
511
|
|
512
|
-
|
512
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
513
513
|
|
514
514
|
switch ( ca->data_type ) {
|
515
515
|
case CA_INT16:
|
@@ -702,7 +702,7 @@ rb_ca_trim_bang (int argc, VALUE *argv, VALUE self)
|
|
702
702
|
|
703
703
|
rb_ca_modify(self);
|
704
704
|
|
705
|
-
|
705
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
706
706
|
|
707
707
|
rb_scan_args(argc, argv, "21", (VALUE *) &rmin, (VALUE *) &rmax, (VALUE *) &rfval);
|
708
708
|
|
data/ext/carray_iterator.c
CHANGED
@@ -10,6 +10,17 @@
|
|
10
10
|
|
11
11
|
#include "carray.h"
|
12
12
|
|
13
|
+
const rb_data_type_t caiterator_data_type = {
|
14
|
+
.wrap_struct_name = "CAIterator",
|
15
|
+
.function = {
|
16
|
+
.dmark = ca_mark,
|
17
|
+
.dfree = ca_free,
|
18
|
+
.dsize = NULL,
|
19
|
+
.dcompact = NULL
|
20
|
+
},
|
21
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY
|
22
|
+
};
|
23
|
+
|
13
24
|
VALUE rb_cCAIterator;
|
14
25
|
|
15
26
|
int8_t
|
@@ -18,7 +29,7 @@ ca_iter_ndim (VALUE self)
|
|
18
29
|
int8_t ndim;
|
19
30
|
if ( TYPE(self) == T_DATA ) {
|
20
31
|
CAIterator *it;
|
21
|
-
|
32
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
22
33
|
ndim = it->ndim;
|
23
34
|
}
|
24
35
|
else {
|
@@ -34,7 +45,7 @@ ca_iter_dim (VALUE self, ca_size_t *dim)
|
|
34
45
|
int i;
|
35
46
|
if ( TYPE(self) == T_DATA ) {
|
36
47
|
CAIterator *it;
|
37
|
-
|
48
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
38
49
|
for (i=0; i<it->ndim; i++) {
|
39
50
|
dim[i] = it->dim[i];
|
40
51
|
}
|
@@ -56,7 +67,7 @@ ca_iter_elements (VALUE self)
|
|
56
67
|
int i, elements;
|
57
68
|
if ( TYPE(self) == T_DATA ) {
|
58
69
|
CAIterator *it;
|
59
|
-
|
70
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
60
71
|
elements = 1;
|
61
72
|
for (i=0; i<it->ndim; i++) {
|
62
73
|
elements *= it->dim[i];
|
@@ -87,8 +98,8 @@ ca_iter_kernel_at_addr (VALUE self, ca_size_t addr, VALUE rref)
|
|
87
98
|
if ( TYPE(self) == T_DATA ) {
|
88
99
|
CAIterator *it;
|
89
100
|
CArray *ref, *ker;
|
90
|
-
|
91
|
-
|
101
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
102
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, ref);
|
92
103
|
ker = it->kernel_at_addr(it, addr, ref);
|
93
104
|
rker = ca_wrap_struct(ker);
|
94
105
|
rb_ca_data_type_inherit(rker, rref);
|
@@ -108,8 +119,8 @@ ca_iter_kernel_at_index (VALUE self, ca_size_t *idx, VALUE rref)
|
|
108
119
|
if ( TYPE(self) == T_DATA ) {
|
109
120
|
CAIterator *it;
|
110
121
|
CArray *ref, *ker;
|
111
|
-
|
112
|
-
|
122
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
123
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, ref);
|
113
124
|
ker = it->kernel_at_index(it, idx, ref);
|
114
125
|
rker = ca_wrap_struct(ker);
|
115
126
|
rb_ca_data_type_inherit(rker, rref);
|
@@ -135,8 +146,8 @@ ca_iter_kernel_move_to_addr (VALUE self, ca_size_t addr, VALUE rref)
|
|
135
146
|
if ( TYPE(self) == T_DATA ) {
|
136
147
|
CAIterator *it;
|
137
148
|
CArray *ker;
|
138
|
-
|
139
|
-
|
149
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
150
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, ker);
|
140
151
|
it->kernel_move_to_addr(it, addr, ker);
|
141
152
|
}
|
142
153
|
else {
|
@@ -149,12 +160,11 @@ ca_iter_kernel_move_to_addr (VALUE self, ca_size_t addr, VALUE rref)
|
|
149
160
|
VALUE
|
150
161
|
ca_iter_kernel_move_to_index (VALUE self, ca_size_t *idx, VALUE rref)
|
151
162
|
{
|
152
|
-
VALUE rker;
|
153
163
|
if ( TYPE(self) == T_DATA ) {
|
154
164
|
CAIterator *it;
|
155
165
|
CArray *ker;
|
156
|
-
|
157
|
-
|
166
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
167
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, ker);
|
158
168
|
it->kernel_move_to_index(it, idx, ker);
|
159
169
|
}
|
160
170
|
else {
|
@@ -165,8 +175,8 @@ ca_iter_kernel_move_to_index (VALUE self, ca_size_t *idx, VALUE rref)
|
|
165
175
|
for (i=0; i<ndim; i++) {
|
166
176
|
rb_ary_store(vidx, i, SIZE2NUM(idx[i]));
|
167
177
|
}
|
168
|
-
|
169
|
-
|
178
|
+
rb_funcall(self, rb_intern("kernel_move_to_index"), 2,
|
179
|
+
vidx, rref);
|
170
180
|
}
|
171
181
|
return rref;
|
172
182
|
}
|
@@ -185,7 +195,7 @@ ca_iter_prepare_output (VALUE self, VALUE rtype, VALUE rbytes)
|
|
185
195
|
|
186
196
|
if ( TYPE(self) == T_DATA ) {
|
187
197
|
CAIterator *it;
|
188
|
-
|
198
|
+
TypedData_Get_Struct(self, CAIterator, &caiterator_data_type, it);
|
189
199
|
co = carray_new_safe(data_type, it->ndim, it->dim, bytes, NULL);
|
190
200
|
}
|
191
201
|
else {
|
@@ -393,7 +403,7 @@ rb_ca_iter_calculate (int argc, VALUE *argv, VALUE self)
|
|
393
403
|
elements = ca_iter_elements(self);
|
394
404
|
|
395
405
|
rref = ca_iter_reference(self);
|
396
|
-
|
406
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
|
397
407
|
|
398
408
|
if ( NIL_P(argv[0]) ) {
|
399
409
|
rtype = INT2NUM(cr->data_type);
|
@@ -408,7 +418,7 @@ rb_ca_iter_calculate (int argc, VALUE *argv, VALUE self)
|
|
408
418
|
argv++;
|
409
419
|
|
410
420
|
routput = ca_iter_prepare_output(self, rtype, rbytes);
|
411
|
-
|
421
|
+
TypedData_Get_Struct(routput, CArray, &carray_data_type, co);
|
412
422
|
|
413
423
|
ca_attach(cr);
|
414
424
|
|
@@ -416,7 +426,7 @@ rb_ca_iter_calculate (int argc, VALUE *argv, VALUE self)
|
|
416
426
|
|
417
427
|
rker = ca_iter_kernel_at_addr(self, 0, rref);
|
418
428
|
|
419
|
-
|
429
|
+
TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
|
420
430
|
ca_attach(ck);
|
421
431
|
|
422
432
|
if ( rb_block_given_p() ) {
|
@@ -491,7 +501,7 @@ rb_ca_iter_filter (int argc, VALUE *argv, VALUE self)
|
|
491
501
|
elements = ca_iter_elements(self);
|
492
502
|
rref = ca_iter_reference(self);
|
493
503
|
|
494
|
-
|
504
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
|
495
505
|
|
496
506
|
/* FIXME: check data_type validity */
|
497
507
|
|
@@ -511,11 +521,11 @@ rb_ca_iter_filter (int argc, VALUE *argv, VALUE self)
|
|
511
521
|
if ( rb_const_get(CLASS_OF(self), rb_intern("UNIFORM_KERNEL")) ) {
|
512
522
|
|
513
523
|
rker = ca_iter_kernel_at_addr(self, 0, rref);
|
514
|
-
|
524
|
+
TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
|
515
525
|
ca_allocate(ck);
|
516
526
|
|
517
527
|
rout = ca_iter_kernel_at_addr(self, 0, routput);
|
518
|
-
|
528
|
+
TypedData_Get_Struct(rker, CArray, &carray_data_type, cq);
|
519
529
|
ca_allocate(cq);
|
520
530
|
|
521
531
|
for (i=0; i<elements; i++) {
|
@@ -563,7 +573,7 @@ rb_ca_iter_evaluate (int argc, VALUE *argv, VALUE self)
|
|
563
573
|
elements = ca_iter_elements(self);
|
564
574
|
rref = ca_iter_reference(self);
|
565
575
|
|
566
|
-
|
576
|
+
TypedData_Get_Struct(rref, CArray, &carray_data_type, cr);
|
567
577
|
|
568
578
|
ca_attach(cr);
|
569
579
|
|
@@ -571,7 +581,7 @@ rb_ca_iter_evaluate (int argc, VALUE *argv, VALUE self)
|
|
571
581
|
|
572
582
|
rker = ca_iter_kernel_at_addr(self, 0, rref);
|
573
583
|
|
574
|
-
|
584
|
+
TypedData_Get_Struct(rker, CArray, &carray_data_type, ck);
|
575
585
|
|
576
586
|
ca_attach(ck);
|
577
587
|
|
data/ext/carray_loop.c
CHANGED
@@ -131,7 +131,7 @@ rb_ca_each_index_internal (VALUE self, int8_t level, VALUE ridx)
|
|
131
131
|
volatile VALUE ret = Qnil;
|
132
132
|
CArray *ca;
|
133
133
|
ca_size_t i;
|
134
|
-
|
134
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
135
135
|
if ( level == ca->ndim - 1 ) {
|
136
136
|
for (i=0; i<ca->dim[level]; i++) {
|
137
137
|
rb_ary_store(ridx, level, SIZE2NUM(i));
|
@@ -187,7 +187,7 @@ rb_ca_map_bang (VALUE self)
|
|
187
187
|
RETURN_ENUMERATOR(self, 0, 0);
|
188
188
|
#endif
|
189
189
|
rb_ca_modify(self);
|
190
|
-
|
190
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
191
191
|
ca_attach(ca);
|
192
192
|
for (i=0; i<elements; i++) {
|
193
193
|
obj = rb_yield(rb_ca_fetch_addr(self, i));
|
@@ -205,7 +205,7 @@ rb_ca_each_with_index_internal (VALUE self,
|
|
205
205
|
volatile VALUE ret = Qnil;
|
206
206
|
CArray *ca;
|
207
207
|
ca_size_t i;
|
208
|
-
|
208
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
209
209
|
if ( level == ca->ndim - 1 ) {
|
210
210
|
for (i=0; i<ca->dim[level]; i++) {
|
211
211
|
idx[level] = i;
|
@@ -252,7 +252,7 @@ rb_ca_map_with_index_bang_internal (VALUE self,
|
|
252
252
|
{
|
253
253
|
CArray *ca;
|
254
254
|
ca_size_t i;
|
255
|
-
|
255
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
256
256
|
if ( level == ca->ndim - 1 ) {
|
257
257
|
volatile VALUE obj;
|
258
258
|
for (i=0; i<ca->dim[level]; i++) {
|
@@ -289,7 +289,7 @@ rb_ca_map_with_index_bang (VALUE self)
|
|
289
289
|
RETURN_ENUMERATOR(self, 0, 0);
|
290
290
|
#endif
|
291
291
|
rb_ca_modify(self);
|
292
|
-
|
292
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
293
293
|
ca_attach(ca);
|
294
294
|
ridx = rb_ary_new2(ndim);
|
295
295
|
rb_ca_map_with_index_bang_internal(self, 0, idx, ridx);
|
@@ -305,7 +305,7 @@ rb_ca_map_index_bang_internal (VALUE self,
|
|
305
305
|
{
|
306
306
|
CArray *ca;
|
307
307
|
ca_size_t i;
|
308
|
-
|
308
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
309
309
|
if ( level == ca->ndim - 1 ) {
|
310
310
|
volatile VALUE obj;
|
311
311
|
for (i=0; i<ca->dim[level]; i++) {
|
@@ -341,7 +341,7 @@ rb_ca_map_index_bang (VALUE self)
|
|
341
341
|
RETURN_ENUMERATOR(self, 0, 0);
|
342
342
|
#endif
|
343
343
|
rb_ca_modify(self);
|
344
|
-
|
344
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
345
345
|
ca_attach(ca);
|
346
346
|
ridx = rb_ary_new2(ndim);
|
347
347
|
rb_ca_map_index_bang_internal(self, 0, idx, ridx);
|
@@ -367,7 +367,7 @@ rb_ca_map_with_addr_bang (VALUE self)
|
|
367
367
|
RETURN_ENUMERATOR(self, 0, 0);
|
368
368
|
#endif
|
369
369
|
rb_ca_modify(self);
|
370
|
-
|
370
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
371
371
|
ca_attach(ca);
|
372
372
|
for (i=0; i<elements; i++) {
|
373
373
|
obj = rb_yield_values(2, rb_ca_fetch_addr(self, i), SIZE2NUM(i));
|
@@ -396,7 +396,7 @@ rb_ca_map_addr_bang (VALUE self)
|
|
396
396
|
RETURN_ENUMERATOR(self, 0, 0);
|
397
397
|
#endif
|
398
398
|
rb_ca_modify(self);
|
399
|
-
|
399
|
+
TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
|
400
400
|
ca_attach(ca);
|
401
401
|
for (i=0; i<elements; i++) {
|
402
402
|
obj = rb_yield(SIZE2NUM(i));
|