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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +10 -0
  3. data/TODO.md +1 -0
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_iter_block.c +20 -5
  6. data/ext/ca_iter_dimension.c +21 -10
  7. data/ext/ca_iter_window.c +17 -5
  8. data/ext/ca_obj_array.c +73 -10
  9. data/ext/ca_obj_bitarray.c +21 -6
  10. data/ext/ca_obj_bitfield.c +21 -11
  11. data/ext/ca_obj_block.c +34 -10
  12. data/ext/ca_obj_fake.c +21 -6
  13. data/ext/ca_obj_farray.c +34 -5
  14. data/ext/ca_obj_field.c +23 -7
  15. data/ext/ca_obj_grid.c +36 -7
  16. data/ext/ca_obj_mapping.c +36 -7
  17. data/ext/ca_obj_object.c +35 -9
  18. data/ext/ca_obj_reduce.c +34 -5
  19. data/ext/ca_obj_refer.c +31 -10
  20. data/ext/ca_obj_repeat.c +35 -12
  21. data/ext/ca_obj_select.c +35 -9
  22. data/ext/ca_obj_shift.c +41 -12
  23. data/ext/ca_obj_transpose.c +36 -7
  24. data/ext/ca_obj_unbound_repeat.c +39 -14
  25. data/ext/ca_obj_window.c +46 -15
  26. data/ext/carray.h +97 -31
  27. data/ext/carray_access.c +25 -42
  28. data/ext/carray_attribute.c +35 -35
  29. data/ext/carray_call_cfunc.c +28 -28
  30. data/ext/carray_cast.c +25 -26
  31. data/ext/carray_cast_func.rb +1 -2
  32. data/ext/carray_conversion.c +7 -10
  33. data/ext/carray_copy.c +5 -5
  34. data/ext/carray_core.c +44 -7
  35. data/ext/carray_element.c +9 -9
  36. data/ext/carray_generate.c +7 -7
  37. data/ext/carray_iterator.c +33 -23
  38. data/ext/carray_loop.c +9 -9
  39. data/ext/carray_mask.c +38 -36
  40. data/ext/carray_math.rb +6 -6
  41. data/ext/carray_numeric.c +1 -1
  42. data/ext/carray_operator.c +31 -21
  43. data/ext/carray_order.c +216 -12
  44. data/ext/carray_sort_addr.c +2 -2
  45. data/ext/carray_stat.c +22 -22
  46. data/ext/carray_stat_proc.rb +13 -13
  47. data/ext/carray_test.c +8 -8
  48. data/ext/ruby_carray.c +7 -0
  49. data/ext/ruby_ccomplex.c +25 -11
  50. data/ext/version.h +6 -6
  51. data/lib/carray/inspect.rb +0 -3
  52. data/lib/carray/io/imagemagick.rb +8 -9
  53. data/lib/carray/mkmf.rb +1 -0
  54. data/lib/carray/time.rb +1 -1
  55. data/spec/Classes/ex1.rb +46 -0
  56. metadata +4 -6
@@ -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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(varg, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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, ca_operation_function_t func)
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(ap); /* delegate */
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 Data_Wrap_Struct(ca_class[ca->obj_type], ca_mark, ca_free, ca);
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
- Data_Get_Struct(rval, CArray, cv);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
505
- Data_Get_Struct(raddr, CArray, ci);
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
 
@@ -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
- Data_Get_Struct(bool0, CArray, ca);
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
- Data_Get_Struct(obj, CArray, co);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
 
@@ -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
- Data_Get_Struct(self, CAIterator, it);
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
- Data_Get_Struct(self, CAIterator, it);
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
- Data_Get_Struct(self, CAIterator, it);
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
- Data_Get_Struct(self, CAIterator, it);
91
- Data_Get_Struct(rref, CArray, ref);
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
- Data_Get_Struct(self, CAIterator, it);
112
- Data_Get_Struct(rref, CArray, ref);
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
- Data_Get_Struct(self, CAIterator, it);
139
- Data_Get_Struct(rref, CArray, ker);
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
- Data_Get_Struct(self, CAIterator, it);
157
- Data_Get_Struct(rref, CArray, ker);
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
- rker = rb_funcall(self, rb_intern("kernel_move_to_index"), 2,
169
- vidx, rref);
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
- Data_Get_Struct(self, CAIterator, it);
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
- Data_Get_Struct(rref, CArray, cr);
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
- Data_Get_Struct(routput, CArray, co);
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
- Data_Get_Struct(rker, CArray, ck);
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
- Data_Get_Struct(rref, CArray, cr);
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
- Data_Get_Struct(rker, CArray, ck);
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
- Data_Get_Struct(rker, CArray, cq);
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
- Data_Get_Struct(rref, CArray, cr);
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
- Data_Get_Struct(rker, CArray, ck);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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
- Data_Get_Struct(self, CArray, ca);
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));