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
data/ext/carray_order.c CHANGED
@@ -152,7 +152,7 @@ rb_ca_project (int argc, VALUE *argv, VALUE self)
152
152
 
153
153
  rb_scan_args(argc, argv, "12", (VALUE *)&ridx, (VALUE *) &vlfval, (VALUE *) &vufval);
154
154
 
155
- Data_Get_Struct(self, CArray, ca);
155
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
156
156
 
157
157
  rb_check_carray_object(ridx);
158
158
  ci = ca_wrap_readonly(ridx, CA_SIZE);
@@ -235,7 +235,7 @@ rb_ca_reverse_bang (VALUE self)
235
235
 
236
236
  rb_ca_modify(self);
237
237
 
238
- Data_Get_Struct(self, CArray, ca);
238
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
239
239
  ca_attach(ca);
240
240
 
241
241
  switch ( ca->data_type ) {
@@ -391,7 +391,7 @@ rb_ca_sort_bang (VALUE self)
391
391
 
392
392
  rb_ca_modify(self);
393
393
 
394
- Data_Get_Struct(self, CArray, ca);
394
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
395
395
  ca_attach(ca);
396
396
 
397
397
  if ( ca_is_fixlen_type(ca) ) {
@@ -447,7 +447,7 @@ rb_ca_binary_search (VALUE self, volatile VALUE rval)
447
447
  volatile VALUE out;
448
448
  CArray *ca;
449
449
  char *val;
450
- Data_Get_Struct(self, CArray, ca);
450
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
451
451
 
452
452
  /* FIXME : treat mask */
453
453
  /*
@@ -471,7 +471,7 @@ rb_ca_binary_search (VALUE self, volatile VALUE rval)
471
471
  CArray *cv, *co;
472
472
  char *ptr, *val;
473
473
  ca_size_t i, idx;
474
- Data_Get_Struct(rval, CArray, cv);
474
+ TypedData_Get_Struct(rval, CArray, &carray_data_type, cv);
475
475
  if ( ca->data_type != cv->data_type ) {
476
476
  cv = ca_wrap_readonly(rval, ca->data_type);
477
477
  }
@@ -704,7 +704,7 @@ rb_ca_linear_search (int argc, VALUE *argv, VALUE self)
704
704
 
705
705
  rb_scan_args(argc, argv, "11", (VALUE *) &value, (VALUE *) &veps);
706
706
 
707
- Data_Get_Struct(self, CArray, ca);
707
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
708
708
 
709
709
  ca_attach(ca);
710
710
 
@@ -825,7 +825,7 @@ rb_ca_linear_search_nearest (VALUE self, VALUE value)
825
825
  CArray *ca;
826
826
  ca_size_t addr;
827
827
 
828
- Data_Get_Struct(self, CArray, ca);
828
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
829
829
 
830
830
  ca_attach(ca);
831
831
 
@@ -959,6 +959,9 @@ linear_index (ca_size_t n, double *y, double yy, double *idx)
959
959
  return 0;
960
960
  }
961
961
 
962
+
963
+ /* ----------------------------------------------------------------- */
964
+
962
965
  static VALUE
963
966
  rb_ca_binary_search_linear_index (volatile VALUE self, volatile VALUE vx)
964
967
  {
@@ -970,7 +973,7 @@ rb_ca_binary_search_linear_index (volatile VALUE self, volatile VALUE vx)
970
973
  double *po;
971
974
  ca_size_t i;
972
975
 
973
- Data_Get_Struct(self, CArray, ca);
976
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
974
977
 
975
978
  if ( rb_ca_is_any_masked(self) ) {
976
979
  rb_raise(rb_eRuntimeError, "self should not have any masked elements");
@@ -1037,7 +1040,7 @@ rb_ca_binary_search_linear_index_vectorized (volatile VALUE self, volatile VALUE
1037
1040
  ca_size_t odim[CA_DIM_MAX];
1038
1041
  ca_size_t i, k;
1039
1042
 
1040
- Data_Get_Struct(self, CArray, ca);
1043
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1041
1044
 
1042
1045
  if ( rb_ca_is_any_masked(self) ) {
1043
1046
  rb_raise(rb_eRuntimeError, "self should not have any masked elements");
@@ -1121,6 +1124,200 @@ rb_ca_binary_search_linear_index_vectorized (volatile VALUE self, volatile VALUE
1121
1124
 
1122
1125
  /* ----------------------------------------------------------------- */
1123
1126
 
1127
+ static ca_size_t
1128
+ linear_index_linear (ca_size_t n, double *y, double yy, double *idx)
1129
+ {
1130
+ ca_size_t a, b, c, x1;
1131
+ double ya, yb, yc;
1132
+ double y1, y2;
1133
+ double rest;
1134
+ int k;
1135
+
1136
+ /* linear search method */
1137
+
1138
+ for (k=0; k<n-1; k++) {
1139
+ if ( (yy - y[k])*(yy - y[k+1]) <= 0 ) {
1140
+ x1 = k;
1141
+ goto found;
1142
+ }
1143
+ }
1144
+
1145
+ *idx = -1;
1146
+ return -1;
1147
+
1148
+ found:
1149
+
1150
+ y1 = y[x1];
1151
+ y2 = y[x1+1];
1152
+ rest = (yy-y1)/(y2-y1);
1153
+
1154
+ *idx = rest + (double) x1;
1155
+ return 0;
1156
+ }
1157
+
1158
+ static VALUE
1159
+ rb_ca_linear_search_linear_index (volatile VALUE self, volatile VALUE vx)
1160
+ {
1161
+ volatile VALUE out, out0;
1162
+ CArray *ca, *sc, *cx, *co0, *co;
1163
+ ca_size_t n;
1164
+ double *x;
1165
+ double *px;
1166
+ double *po;
1167
+ ca_size_t i;
1168
+
1169
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1170
+
1171
+ if ( rb_ca_is_any_masked(self) ) {
1172
+ rb_raise(rb_eRuntimeError, "self should not have any masked elements");
1173
+ }
1174
+
1175
+ sc = ca_wrap_readonly(self, CA_FLOAT64);
1176
+ cx = ca_wrap_readonly(vx, CA_FLOAT64);
1177
+
1178
+ co0 = carray_new(ca->data_type, cx->ndim, cx->dim, 0, NULL);
1179
+ out = out0 = ca_wrap_struct(co0);
1180
+ co = ca_wrap_writable(out, CA_FLOAT64);
1181
+
1182
+ ca_attach_n(3, sc, cx, co);
1183
+
1184
+ n = sc->elements;
1185
+ x = (double*) sc->ptr;
1186
+ px = (double*) cx->ptr;
1187
+ po = (double*) co->ptr;
1188
+
1189
+ ca_update_mask(cx);
1190
+ if ( cx->mask ) {
1191
+ boolean8_t *mx, *mo;
1192
+ ca_create_mask(co);
1193
+ mx = (boolean8_t *) cx->mask->ptr;
1194
+ mo = (boolean8_t *) co->mask->ptr;
1195
+ for (i=0; i<cx->elements; i++) {
1196
+ if ( ! *mx ) {
1197
+ if ( linear_index_linear(n, x, *px, po) < 0 )
1198
+ *mo = 1;
1199
+ }
1200
+ else {
1201
+ *mo = 1;
1202
+ }
1203
+ mx++; mo++; px++, po++;
1204
+ }
1205
+ }
1206
+ else {
1207
+ for (i=0; i<cx->elements; i++) {
1208
+ linear_index_linear(n, x, *px, po);
1209
+ px++; po++;
1210
+ }
1211
+ }
1212
+
1213
+ ca_sync(co);
1214
+ ca_detach_n(3, sc, cx, co);
1215
+
1216
+ if ( rb_ca_is_scalar(vx) ) {
1217
+ return rb_funcall(out0, rb_intern("[]"), 1, INT2NUM(0));
1218
+ }
1219
+ else {
1220
+ return out0;
1221
+ }
1222
+ }
1223
+
1224
+ static VALUE
1225
+ rb_ca_linear_search_linear_index_vectorized (volatile VALUE self, volatile VALUE vx)
1226
+ {
1227
+ volatile VALUE out, out0;
1228
+ CArray *ca, *sc, *cx, *co0, *co;
1229
+ double *x;
1230
+ double *px;
1231
+ double *po;
1232
+ ca_size_t nseri, nlist;
1233
+ ca_size_t odim[CA_DIM_MAX];
1234
+ ca_size_t i, k;
1235
+
1236
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1237
+
1238
+ if ( rb_ca_is_any_masked(self) ) {
1239
+ rb_raise(rb_eRuntimeError, "self should not have any masked elements");
1240
+ }
1241
+
1242
+ sc = ca_wrap_readonly(self, CA_FLOAT64);
1243
+ cx = ca_wrap_readonly(vx, CA_FLOAT64);
1244
+
1245
+ if ( sc->ndim < 2 ) {
1246
+ rb_raise(rb_eRuntimeError, "ndim of self should be larger than 2");
1247
+ }
1248
+
1249
+ if ( cx->ndim > CA_DIM_MAX ) {
1250
+ rb_raise(rb_eRuntimeError, "2nd argument carray has too large dimension");
1251
+ }
1252
+
1253
+ nseri = 1;
1254
+ for (i=0; i<sc->ndim-1; i++) {
1255
+ nseri *= sc->dim[i];
1256
+ }
1257
+ nlist = sc->dim[sc->ndim-1];
1258
+
1259
+ if ( rb_ca_is_scalar(vx) ) {
1260
+ for (i=0; i<sc->ndim-1; i++) {
1261
+ odim[i] = sc->dim[i];
1262
+ }
1263
+ co0 = carray_new(ca->data_type, sc->ndim-1, odim, 0, NULL);
1264
+ }
1265
+ else {
1266
+ for (i=0; i<sc->ndim-1; i++) {
1267
+ odim[i] = sc->dim[i];
1268
+ }
1269
+ memcpy(&odim[sc->ndim], cx->dim, cx->ndim*sizeof(ca_size_t));
1270
+ co0 = carray_new(ca->data_type, sc->ndim-1 + cx->ndim, odim, 0, NULL);
1271
+ }
1272
+
1273
+ out = out0 = ca_wrap_struct(co0);
1274
+ co = ca_wrap_writable(out, CA_FLOAT64);
1275
+
1276
+ ca_attach_n(3, sc, cx, co);
1277
+
1278
+ x = (double*) sc->ptr;
1279
+ po = (double*) co->ptr;
1280
+
1281
+ ca_update_mask(cx);
1282
+ if ( cx->mask ) {
1283
+ boolean8_t *mx, *mo;
1284
+ ca_create_mask(co);
1285
+ mx = (boolean8_t *) cx->mask->ptr;
1286
+ mo = (boolean8_t *) co->mask->ptr;
1287
+ for (k=0; k<nseri; k++) {
1288
+ px = (double*) cx->ptr;
1289
+ for (i=0; i<cx->elements; i++) {
1290
+ if ( ! *mx ) {
1291
+ if ( linear_index_linear(nlist, x, *px, po) < 0)
1292
+ *mo = 1;
1293
+ }
1294
+ else {
1295
+ *mo = 1;
1296
+ }
1297
+ mx++; mo++; px++, po++;
1298
+ }
1299
+ x += nlist;
1300
+ }
1301
+ }
1302
+ else {
1303
+ for (k=0; k<nseri; k++) {
1304
+ px = (double*) cx->ptr;
1305
+ for (i=0; i<cx->elements; i++) {
1306
+ linear_index_linear(nlist, x, *px, po);
1307
+ px++; po++;
1308
+ }
1309
+ x += nlist;
1310
+ }
1311
+ }
1312
+
1313
+ ca_sync(co);
1314
+ ca_detach_n(3, sc, cx, co);
1315
+
1316
+ return out0;
1317
+ }
1318
+
1319
+ /* ----------------------------------------------------------------- */
1320
+
1124
1321
  static int
1125
1322
  fetch_linear_addr (ca_size_t n, double *y, double idx, double *val)
1126
1323
  {
@@ -1128,6 +1325,7 @@ fetch_linear_addr (ca_size_t n, double *y, double idx, double *val)
1128
1325
  double w;
1129
1326
 
1130
1327
  if ( idx < 0 || idx > n - 1 ) {
1328
+ *val = 0.0/0.0;
1131
1329
  return -1;
1132
1330
  }
1133
1331
 
@@ -1154,7 +1352,7 @@ rb_ca_fetch_linear_addr (volatile VALUE self, volatile VALUE vx)
1154
1352
  ca_size_t i;
1155
1353
  boolean8_t *mx, *mo;
1156
1354
 
1157
- Data_Get_Struct(self, CArray, ca);
1355
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1158
1356
 
1159
1357
  if ( rb_ca_is_any_masked(self) ) {
1160
1358
  rb_raise(rb_eRuntimeError, "self should not have any masked elements");
@@ -1250,7 +1448,7 @@ rb_ca_find_linear_addr_vectorized (volatile VALUE self, volatile VALUE vx)
1250
1448
  ca_size_t i, k;
1251
1449
  boolean8_t *mx, *mo;
1252
1450
 
1253
- Data_Get_Struct(self, CArray, ca);
1451
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1254
1452
 
1255
1453
  if ( rb_ca_is_any_masked(self) ) {
1256
1454
  rb_raise(rb_eRuntimeError, "self should not have any masked elements");
@@ -1352,7 +1550,7 @@ rb_ca_fetch_linear_addr_vectorized (volatile VALUE self, volatile VALUE vx)
1352
1550
  ca_size_t i, k;
1353
1551
  boolean8_t *mx, *mo;
1354
1552
 
1355
- Data_Get_Struct(self, CArray, ca);
1553
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1356
1554
 
1357
1555
  if ( rb_ca_is_any_masked(self) ) {
1358
1556
  rb_raise(rb_eRuntimeError, "self should not have any masked elements");
@@ -1471,6 +1669,12 @@ Init_carray_order ()
1471
1669
  rb_define_method(rb_cCArray, "vectorized_section",
1472
1670
  rb_ca_binary_search_linear_index_vectorized, 1);
1473
1671
 
1672
+ rb_define_method(rb_cCArray, "section_linear",
1673
+ rb_ca_linear_search_linear_index, 1);
1674
+
1675
+ rb_define_method(rb_cCArray, "vectorized_section_linear",
1676
+ rb_ca_linear_search_linear_index_vectorized, 1);
1677
+
1474
1678
  rb_define_method(rb_cCArray, "fetch_linear_addr",
1475
1679
  rb_ca_fetch_linear_addr, 1);
1476
1680
 
@@ -191,7 +191,7 @@ rb_ca_s_sort_addr (int argc, VALUE *argv, VALUE self)
191
191
 
192
192
  for (j=0; j<argc; j++) {
193
193
  CArray *ca;
194
- Data_Get_Struct(argv[j], CArray, ca);
194
+ TypedData_Get_Struct(argv[j], CArray, &carray_data_type, ca);
195
195
  base->ca[j] = ca;
196
196
  ca_attach(ca);
197
197
  }
@@ -211,7 +211,7 @@ rb_ca_s_sort_addr (int argc, VALUE *argv, VALUE self)
211
211
  #endif
212
212
 
213
213
  out = rb_ca_template_with_type(argv[0], INT2NUM(CA_SIZE), INT2NUM(0));
214
- Data_Get_Struct(out, CArray, co);
214
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
215
215
  q = (ca_size_t *) co->ptr;
216
216
 
217
217
  for (i=0; i<elements; i++) {
data/ext/carray_stat.c CHANGED
@@ -89,7 +89,7 @@ rb_ca_cummin (int argc, VALUE *argv, VALUE self)
89
89
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
90
90
  }
91
91
 
92
- Data_Get_Struct(self, CArray, ca);
92
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
93
93
 
94
94
  co = ca_template(ca);
95
95
  obj = ca_wrap_struct(co);
@@ -196,7 +196,7 @@ rb_ca_cummax (int argc, VALUE *argv, VALUE self)
196
196
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
197
197
  }
198
198
 
199
- Data_Get_Struct(self, CArray, ca);
199
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
200
200
 
201
201
  co = ca_template(ca);
202
202
  obj = ca_wrap_struct(co);
@@ -288,7 +288,7 @@ rb_ca_cumprod (int argc, VALUE *argv, VALUE self)
288
288
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
289
289
  }
290
290
 
291
- Data_Get_Struct(self, CArray, ca);
291
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
292
292
 
293
293
  if ( ca_is_complex_type(ca) ) {
294
294
  co = carray_new(CA_CMPLX128, ca->ndim, ca->dim, 0, NULL);
@@ -381,7 +381,7 @@ rb_ca_wsum (int argc, VALUE *argv, VALUE self)
381
381
  rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
382
382
  }
383
383
 
384
- Data_Get_Struct(self, CArray, ca);
384
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
385
385
  cw = ca_wrap_readonly(weight, ca->data_type);
386
386
 
387
387
  ca_check_same_elements(ca, cw);
@@ -490,7 +490,7 @@ rb_ca_cumwsum (int argc, VALUE *argv, VALUE self)
490
490
  rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
491
491
  }
492
492
 
493
- Data_Get_Struct(self, CArray, ca);
493
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
494
494
  cw = ca_wrap_readonly(weight, ca->data_type);
495
495
 
496
496
  ca_check_same_elements(ca, cw);
@@ -595,7 +595,7 @@ rb_ca_wmean (int argc, VALUE *argv, VALUE self)
595
595
  rb_scan_args(argc, argv, "12", (VALUE *) &weight, (VALUE *) &rmin_count, (VALUE *) &rfval);
596
596
  }
597
597
 
598
- Data_Get_Struct(self, CArray, ca);
598
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
599
599
  cw = ca_wrap_readonly(weight, ca->data_type);
600
600
 
601
601
  ca_check_same_elements(ca, cw);
@@ -712,7 +712,7 @@ rb_ca_variancep (int argc, VALUE *argv, VALUE self)
712
712
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
713
713
  }
714
714
 
715
- Data_Get_Struct(self, CArray, ca);
715
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
716
716
 
717
717
  if ( ca->elements == 0 ) {
718
718
  return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
@@ -815,7 +815,7 @@ rb_ca_variance (int argc, VALUE *argv, VALUE self)
815
815
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
816
816
  }
817
817
 
818
- Data_Get_Struct(self, CArray, ca);
818
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
819
819
 
820
820
  if ( ca->elements == 0 ) {
821
821
  return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
@@ -863,7 +863,7 @@ rb_ca_count_true (int argc, VALUE *argv, VALUE self)
863
863
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
864
864
  }
865
865
 
866
- Data_Get_Struct(self, CArray, ca);
866
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
867
867
 
868
868
  if ( ! ca_is_boolean_type(ca) ) {
869
869
  rb_raise(rb_eCADataTypeError,
@@ -932,7 +932,7 @@ rb_ca_count_false (int argc, VALUE *argv, VALUE self)
932
932
  rb_scan_args(argc, argv, "02", (VALUE *) &rmin_count, (VALUE *) &rfval);
933
933
  }
934
934
 
935
- Data_Get_Struct(self, CArray, ca);
935
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
936
936
 
937
937
  if ( ! ca_is_boolean_type(ca) ) {
938
938
  rb_raise(rb_eCADataTypeError,
@@ -1109,7 +1109,7 @@ rb_ca_count_equal (int argc, VALUE *argv, VALUE self)
1109
1109
 
1110
1110
  rb_scan_args(argc, argv, "12", (VALUE *) &value, (VALUE *) &rmin_count, (VALUE *) &rfval);
1111
1111
 
1112
- Data_Get_Struct(self, CArray, ca);
1112
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1113
1113
 
1114
1114
  if ( ca->elements == 0 ) {
1115
1115
  return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
@@ -1204,7 +1204,7 @@ rb_ca_count_equiv (int argc, VALUE *argv, VALUE self)
1204
1204
  rb_scan_args(argc, argv, "22", (VALUE *) &value, (VALUE *) &reps, (VALUE *) &rmin_count, (VALUE *) &rfval);
1205
1205
  }
1206
1206
 
1207
- Data_Get_Struct(self, CArray, ca);
1207
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1208
1208
 
1209
1209
  if ( ca->elements == 0 ) {
1210
1210
  return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
@@ -1295,7 +1295,7 @@ rb_ca_count_close (int argc, VALUE *argv, VALUE self)
1295
1295
  rb_scan_args(argc, argv, "22", (VALUE *) &value, (VALUE *) &aeps, (VALUE *) &rmin_count, (VALUE *) &rfval);
1296
1296
  }
1297
1297
 
1298
- Data_Get_Struct(self, CArray, ca);
1298
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1299
1299
 
1300
1300
  if ( ca->elements == 0 ) {
1301
1301
  return ( NIL_P(rfval) ) ? CA_UNDEF : rfval;
@@ -1420,7 +1420,7 @@ rb_ca_all_equal_p (int argc, VALUE *argv, VALUE self)
1420
1420
 
1421
1421
  rb_scan_args(argc, argv, "1", (VALUE *) &value);
1422
1422
 
1423
- Data_Get_Struct(self, CArray, ca);
1423
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1424
1424
 
1425
1425
  ca_attach(ca);
1426
1426
 
@@ -1493,7 +1493,7 @@ rb_ca_all_equiv_p (int argc, VALUE *argv, VALUE self)
1493
1493
 
1494
1494
  rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &reps);
1495
1495
 
1496
- Data_Get_Struct(self, CArray, ca);
1496
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1497
1497
 
1498
1498
  ca_attach(ca);
1499
1499
 
@@ -1561,7 +1561,7 @@ rb_ca_all_close_p (int argc, VALUE *argv, VALUE self)
1561
1561
 
1562
1562
  rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &aeps);
1563
1563
 
1564
- Data_Get_Struct(self, CArray, ca);
1564
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1565
1565
 
1566
1566
  ca_attach(ca);
1567
1567
 
@@ -1673,7 +1673,7 @@ rb_ca_any_equal_p (int argc, VALUE *argv, VALUE self)
1673
1673
 
1674
1674
  rb_scan_args(argc, argv, "1", (VALUE *) &value);
1675
1675
 
1676
- Data_Get_Struct(self, CArray, ca);
1676
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1677
1677
 
1678
1678
  ca_attach(ca);
1679
1679
 
@@ -1746,7 +1746,7 @@ rb_ca_any_equiv_p (int argc, VALUE *argv, VALUE self)
1746
1746
 
1747
1747
  rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &reps);
1748
1748
 
1749
- Data_Get_Struct(self, CArray, ca);
1749
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1750
1750
 
1751
1751
  ca_attach(ca);
1752
1752
 
@@ -1814,7 +1814,7 @@ rb_ca_any_close_p (int argc, VALUE *argv, VALUE self)
1814
1814
 
1815
1815
  rb_scan_args(argc, argv, "2", (VALUE *) &value, (VALUE *) &aeps);
1816
1816
 
1817
- Data_Get_Struct(self, CArray, ca);
1817
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1818
1818
 
1819
1819
  ca_attach(ca);
1820
1820
 
@@ -1902,7 +1902,7 @@ rb_ca_histogram (int argc, VALUE *argv, VALUE self)
1902
1902
 
1903
1903
  rb_scan_args(argc, argv, "3", &vnum, &vmin, &vmax);
1904
1904
 
1905
- Data_Get_Struct(self, CArray, ca);
1905
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1906
1906
 
1907
1907
  icls = NUM2SIZE(vnum);
1908
1908
 
@@ -2019,7 +2019,7 @@ rb_ca_grade (int argc, VALUE *argv, VALUE self)
2019
2019
  vmax = rb_funcall(self, rb_intern("max"), 0);
2020
2020
  }
2021
2021
 
2022
- Data_Get_Struct(self, CArray, ca);
2022
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
2023
2023
 
2024
2024
  icls = NUM2LONG(vnum);
2025
2025
 
@@ -2028,7 +2028,7 @@ rb_ca_grade (int argc, VALUE *argv, VALUE self)
2028
2028
  }
2029
2029
 
2030
2030
  out = rb_carray_new_safe(CA_SIZE, ca->ndim, ca->dim, 0, NULL);
2031
- Data_Get_Struct(out, CArray, sa);
2031
+ TypedData_Get_Struct(out, CArray, &carray_data_type, sa);
2032
2032
 
2033
2033
  ca_attach(ca);
2034
2034
 
@@ -1343,7 +1343,7 @@ rb_ca_stat_1d (VALUE self, VALUE rmc, VALUE vfval,
1343
1343
  boolean8_t *m;
1344
1344
  ca_size_t mc;
1345
1345
 
1346
- Data_Get_Struct(self, CArray, ca);
1346
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1347
1347
 
1348
1348
  if ( ! ca_proc[ca->data_type] ) {
1349
1349
  rb_raise(rb_eCADataTypeError,
@@ -1411,7 +1411,7 @@ rb_ca_stat_nd_contig (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1411
1411
  CArray *ca, *co;
1412
1412
  ca_size_t mc, ndim;
1413
1413
 
1414
- Data_Get_Struct(self, CArray, ca);
1414
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1415
1415
 
1416
1416
  if ( ! ca_proc[ca->data_type] ) {
1417
1417
  rb_raise(rb_eCADataTypeError,
@@ -1425,7 +1425,7 @@ rb_ca_stat_nd_contig (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1425
1425
  }
1426
1426
 
1427
1427
  out = rb_carray_new(data_type, ndim, ca->dim, 0, NULL);
1428
- Data_Get_Struct(out, CArray, co);
1428
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1429
1429
 
1430
1430
  if ( ca_has_mask(ca) ) {
1431
1431
  ca_create_mask(co);
@@ -1515,7 +1515,7 @@ rb_ca_stat_nd_discrete (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1515
1515
  ca_size_t mc;
1516
1516
  ca_size_t i, k;
1517
1517
 
1518
- Data_Get_Struct(self, CArray, ca);
1518
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1519
1519
 
1520
1520
  for (i=0; i<ca->ndim; i++) {
1521
1521
  dm[i] = 0;
@@ -1542,7 +1542,7 @@ rb_ca_stat_nd_discrete (VALUE self, VALUE vaxis, VALUE rmc, VALUE vfval,
1542
1542
  }
1543
1543
 
1544
1544
  out = rb_carray_new(data_type, out_ndim, out_dim, 0, NULL);
1545
- Data_Get_Struct(out, CArray, co);
1545
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1546
1546
 
1547
1547
  first = carray_new(CA_SIZE, out_ndim, out_dim, 0, NULL);
1548
1548
  first->ptr = realloc(first->ptr, first->bytes*(first->elements+1));
@@ -1619,7 +1619,7 @@ rb_ca_stat_general (int argc, VALUE *argv, VALUE self,
1619
1619
  vfval = CA_NIL, vaxis;
1620
1620
  CArray *ca;
1621
1621
 
1622
- Data_Get_Struct(self, CArray, ca);
1622
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1623
1623
 
1624
1624
  ropt = rb_pop_options(&argc, &argv);
1625
1625
  rb_scan_options(ropt,
@@ -1746,7 +1746,7 @@ static VALUE
1746
1746
  rb_ca_min (int argc, VALUE *argv, VALUE self)
1747
1747
  {
1748
1748
  CArray *ca;
1749
- Data_Get_Struct(self, CArray, ca);
1749
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1750
1750
  return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_min);
1751
1751
  }
1752
1752
 
@@ -1760,7 +1760,7 @@ static VALUE
1760
1760
  rb_ca_max (int argc, VALUE *argv, VALUE self)
1761
1761
  {
1762
1762
  CArray *ca;
1763
- Data_Get_Struct(self, CArray, ca);
1763
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1764
1764
  return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_max);
1765
1765
  }
1766
1766
 
@@ -1774,7 +1774,7 @@ static VALUE
1774
1774
  rb_ca_accum (int argc, VALUE *argv, VALUE self)
1775
1775
  {
1776
1776
  CArray *ca;
1777
- Data_Get_Struct(self, CArray, ca);
1777
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1778
1778
  return rb_ca_stat_general(argc, argv, self, ca->data_type, ca_proc_accum);
1779
1779
  }
1780
1780
 
@@ -1788,7 +1788,7 @@ rb_ca_stat_type2 (int argc, VALUE *argv, VALUE self,
1788
1788
 
1789
1789
  rb_scan_args(argc, argv, "02", (VALUE *) &rmc, (VALUE *) &rfval);
1790
1790
 
1791
- Data_Get_Struct(self, CArray, ca);
1791
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1792
1792
 
1793
1793
  if ( ! ca_proc[ca->data_type] ) {
1794
1794
  rb_raise(rb_eCADataTypeError,
@@ -1797,7 +1797,7 @@ rb_ca_stat_type2 (int argc, VALUE *argv, VALUE self,
1797
1797
  }
1798
1798
 
1799
1799
  out = rb_carray_new(data_type, 1, &ca->elements, 0, NULL);
1800
- Data_Get_Struct(out, CArray, co);
1800
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1801
1801
 
1802
1802
  if ( ca->elements == 0 ) {
1803
1803
  ;
@@ -1893,7 +1893,7 @@ rb_ca_dimstat_type2 (int argc, VALUE *argv, VALUE self,
1893
1893
 
1894
1894
  rb_scan_args(argc, argv, "12", (VALUE *) &rndim, (VALUE *) &rmc, (VALUE *) &rfval);
1895
1895
 
1896
- Data_Get_Struct(self, CArray, ca);
1896
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
1897
1897
 
1898
1898
  if ( ! ca_proc[ca->data_type] ) {
1899
1899
  rb_raise(rb_eCADataTypeError,
@@ -1914,7 +1914,7 @@ rb_ca_dimstat_type2 (int argc, VALUE *argv, VALUE self,
1914
1914
  odim[ndim] = ca->elements/n;
1915
1915
 
1916
1916
  out = rb_carray_new(data_type, ndim+1, odim, 0, NULL);
1917
- Data_Get_Struct(out, CArray, co);
1917
+ TypedData_Get_Struct(out, CArray, &carray_data_type, co);
1918
1918
 
1919
1919
  if ( ca_has_mask(ca) ) {
1920
1920
  ca_create_mask(co);