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/ca_obj_fake.c CHANGED
@@ -25,6 +25,18 @@ typedef struct {
25
25
  uint8_t nosync;
26
26
  } CAFake;
27
27
 
28
+ const rb_data_type_t cafake_data_type = {
29
+ .parent = &cavirtual_data_type,
30
+ .wrap_struct_name = "CAFake",
31
+ .function = {
32
+ .dmark = ca_mark,
33
+ .dfree = ca_free,
34
+ .dsize = NULL,
35
+ .dcompact = NULL
36
+ },
37
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
38
+ };
39
+
28
40
  static int8_t CA_OBJ_FAKE;
29
41
 
30
42
  static VALUE rb_cCAFake;
@@ -319,7 +331,7 @@ rb_ca_fake_new (VALUE cary, int8_t data_type, ca_size_t bytes)
319
331
  CArray *parent;
320
332
  CAFake *ca;
321
333
  rb_check_carray_object(cary);
322
- Data_Get_Struct(cary, CArray, parent);
334
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
323
335
  ca = ca_fake_new(parent, data_type, bytes);
324
336
  obj = ca_wrap_struct(ca);
325
337
  rb_ca_set_parent(obj, cary);
@@ -341,7 +353,7 @@ rb_ca_fake (int argc, VALUE *argv, VALUE self)
341
353
  int8_t data_type;
342
354
  ca_size_t bytes;
343
355
 
344
- Data_Get_Struct(self, CArray, ca);
356
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
345
357
 
346
358
  rb_scan_args(argc, argv, "11", (VALUE *) &rtype, (VALUE *) &ropt);
347
359
  rb_scan_options(ropt, "bytes", &rbytes);
@@ -369,7 +381,7 @@ static VALUE
369
381
  rb_ca_fake_s_allocate (VALUE klass)
370
382
  {
371
383
  CAFake *ca;
372
- return Data_Make_Struct(klass, CAFake, ca_mark, ca_free, ca);
384
+ return TypedData_Make_Struct(klass, CAFake, &cafake_data_type, ca);
373
385
  }
374
386
 
375
387
  static VALUE
@@ -377,8 +389,8 @@ rb_ca_fake_initialize_copy (VALUE self, VALUE other)
377
389
  {
378
390
  CAFake *ca, *cs;
379
391
 
380
- Data_Get_Struct(self, CAFake, ca);
381
- Data_Get_Struct(other, CAFake, cs);
392
+ TypedData_Get_Struct(self, CAFake, &cafake_data_type, ca);
393
+ TypedData_Get_Struct(other, CAFake, &cafake_data_type, cs);
382
394
 
383
395
  ca_fake_setup(ca, cs->parent, cs->data_type, cs->bytes);
384
396
 
@@ -390,7 +402,10 @@ Init_ca_obj_fake ()
390
402
  {
391
403
  rb_cCAFake = rb_define_class("CAFake", rb_cCAVirtual);
392
404
 
393
- CA_OBJ_FAKE = ca_install_obj_type(rb_cCAFake, ca_fake_func);
405
+ CA_OBJ_FAKE = ca_install_obj_type(rb_cCAFake,
406
+ &cafake_data_type,
407
+ rb_cCArrayMask,
408
+ &carray_data_type, ca_fake_func);
394
409
  rb_define_const(rb_cObject, "CA_OBJ_FAKE", INT2NUM(CA_OBJ_FAKE));
395
410
 
396
411
  rb_define_method(rb_cCArray, "fake", rb_ca_fake, -1);
data/ext/ca_obj_farray.c CHANGED
@@ -27,9 +27,34 @@ typedef struct {
27
27
  ca_size_t step;
28
28
  } CAFarray;
29
29
 
30
+ const rb_data_type_t cafarray_data_type = {
31
+ .parent = &cavirtual_data_type,
32
+ .wrap_struct_name = "CAFarray",
33
+ .function = {
34
+ .dmark = ca_mark,
35
+ .dfree = ca_free,
36
+ .dsize = NULL,
37
+ .dcompact = NULL
38
+ },
39
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
40
+ };
41
+
42
+ const rb_data_type_t cafarray_mask_data_type = {
43
+ .parent = &cavirtual_data_type,
44
+ .wrap_struct_name = "CAFarrayMask",
45
+ .function = {
46
+ .dmark = NULL,
47
+ .dfree = ca_free_nop,
48
+ .dsize = NULL,
49
+ .dcompact = NULL
50
+ },
51
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
52
+ };
53
+
30
54
  static int8_t CA_OBJ_FARRAY;
31
55
 
32
56
  static VALUE rb_cCAFarray;
57
+ static VALUE rb_cCAFarrayMask;
33
58
 
34
59
  /* yard:
35
60
  class CAFArray < CAVirtual # :nodoc:
@@ -419,7 +444,7 @@ rb_ca_farray_new (VALUE cary)
419
444
  CArray *parent;
420
445
  CAFarray *ca;
421
446
  rb_check_carray_object(cary);
422
- Data_Get_Struct(cary, CArray, parent);
447
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
423
448
  ca = ca_farray_new(parent);
424
449
  obj = ca_wrap_struct(ca);
425
450
  rb_ca_set_parent(obj, cary);
@@ -445,7 +470,7 @@ static VALUE
445
470
  rb_ca_farray_s_allocate (VALUE klass)
446
471
  {
447
472
  CAFarray *ca;
448
- return Data_Make_Struct(klass, CAFarray, ca_mark, ca_free, ca);
473
+ return TypedData_Make_Struct(klass, CAFarray, &cafarray_data_type, ca);
449
474
  }
450
475
 
451
476
  static VALUE
@@ -453,8 +478,8 @@ rb_ca_farray_initialize_copy (VALUE self, VALUE other)
453
478
  {
454
479
  CAFarray *ca, *cs;
455
480
 
456
- Data_Get_Struct(self, CAFarray, ca);
457
- Data_Get_Struct(other, CAFarray, cs);
481
+ TypedData_Get_Struct(self, CAFarray, &cafarray_data_type, ca);
482
+ TypedData_Get_Struct(other, CAFarray, &cafarray_data_type, cs);
458
483
 
459
484
  ca_farray_setup(ca, cs->parent);
460
485
 
@@ -465,8 +490,12 @@ void
465
490
  Init_ca_obj_farray ()
466
491
  {
467
492
  rb_cCAFarray = rb_define_class("CAFarray", rb_cCAVirtual);
493
+ rb_cCAFarrayMask = rb_define_class("CAFarrayMask", rb_cCAFarray);
468
494
 
469
- CA_OBJ_FARRAY = ca_install_obj_type(rb_cCAFarray, ca_farray_func);
495
+ CA_OBJ_FARRAY = ca_install_obj_type(rb_cCAFarray,
496
+ &cafarray_data_type,
497
+ rb_cCAFarrayMask,
498
+ &cafarray_mask_data_type, ca_farray_func);
470
499
  rb_define_const(rb_cObject, "CA_OBJ_FARRAY", INT2NUM(CA_OBJ_FARRAY));
471
500
 
472
501
  rb_define_method(rb_cCArray, "farray", rb_ca_farray, 0);
data/ext/ca_obj_field.c CHANGED
@@ -27,6 +27,19 @@ typedef struct {
27
27
  ca_size_t offset;
28
28
  } CAField;
29
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
+
30
43
  static int8_t CA_OBJ_FIELD;
31
44
 
32
45
  static VALUE rb_cCAField;
@@ -514,7 +527,7 @@ rb_ca_field_new (VALUE cary, ca_size_t offset, int8_t data_type, ca_size_t bytes
514
527
  CArray *parent;
515
528
  CAField *ca;
516
529
  rb_check_carray_object(cary);
517
- Data_Get_Struct(cary, CArray, parent);
530
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
518
531
  ca = ca_field_new(parent, offset, data_type, bytes);
519
532
  obj = ca_wrap_struct(ca);
520
533
  rb_ca_set_parent(obj, cary);
@@ -525,7 +538,7 @@ static VALUE
525
538
  rb_ca_field_s_allocate (VALUE klass)
526
539
  {
527
540
  CAField *ca;
528
- return Data_Make_Struct(klass, CAField, ca_mark, ca_free, ca);
541
+ return TypedData_Make_Struct(klass, CAField, &cafield_data_type, ca);
529
542
  }
530
543
 
531
544
  static VALUE
@@ -533,8 +546,8 @@ rb_ca_field_initialize_copy (VALUE self, VALUE other)
533
546
  {
534
547
  CAField *ca, *cs;
535
548
 
536
- Data_Get_Struct(self, CAField, ca);
537
- Data_Get_Struct(other, CAField, cs);
549
+ TypedData_Get_Struct(self, CAField, &cafield_data_type, ca);
550
+ TypedData_Get_Struct(other, CAField, &cafield_data_type, cs);
538
551
 
539
552
  ca_field_setup(ca, cs->parent, cs->offset, cs->data_type, cs->bytes);
540
553
 
@@ -567,7 +580,7 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
567
580
  return rb_ca_field_as_member(self, argv[0]);
568
581
  }
569
582
 
570
- Data_Get_Struct(self, CArray, ca);
583
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
571
584
 
572
585
  /* CArray#field(offset, data_type[, :bytes=>bytes]) */
573
586
  /* CArray#field(offset, data_class) */
@@ -583,7 +596,7 @@ rb_ca_field (int argc, VALUE *argv, VALUE self)
583
596
  ca_size_t dim[CA_RANK_MAX];
584
597
  int8_t ndim;
585
598
  int8_t i, j;
586
- Data_Get_Struct(rtype, CArray, ct);
599
+ TypedData_Get_Struct(rtype, CArray, &carray_data_type, ct);
587
600
  data_type = CA_FIXLEN;
588
601
  bytes = ct->bytes * ct->elements;
589
602
  obj = rb_ca_field_new(self, offset, data_type, bytes);
@@ -612,7 +625,10 @@ Init_ca_obj_field ()
612
625
  {
613
626
  rb_cCAField = rb_define_class("CAField", rb_cCAVirtual);
614
627
 
615
- CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField, ca_field_func);
628
+ CA_OBJ_FIELD = ca_install_obj_type(rb_cCAField,
629
+ &cafield_data_type,
630
+ rb_cCArrayMask,
631
+ &carray_mask_data_type, ca_field_func);
616
632
  rb_define_const(rb_cObject, "CA_OBJ_FIELD", INT2NUM(CA_OBJ_FIELD));
617
633
 
618
634
  rb_define_method(rb_cCArray, "field", rb_ca_field, -1);
data/ext/ca_obj_grid.c CHANGED
@@ -28,7 +28,32 @@ typedef struct {
28
28
  int8_t *contig;
29
29
  } CAGrid;
30
30
 
31
+ const rb_data_type_t cagrid_data_type = {
32
+ .parent = &cavirtual_data_type,
33
+ .wrap_struct_name = "CAGrid",
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
+ const rb_data_type_t cagrid_mask_data_type = {
44
+ .parent = &cagrid_data_type,
45
+ .wrap_struct_name = "CAGridMask",
46
+ .function = {
47
+ .dmark = NULL,
48
+ .dfree = ca_free_nop,
49
+ .dsize = NULL,
50
+ .dcompact = NULL
51
+ },
52
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
53
+ };
54
+
31
55
  static VALUE rb_cCAGrid;
56
+ static VALUE rb_cCAGridMask;
32
57
 
33
58
  /* yard:
34
59
  class CAGrid < CAVirtual # :nodoc:
@@ -593,7 +618,7 @@ rb_ca_grid_new (VALUE cary, ca_size_t *dim, CArray **grid)
593
618
  CArray *parent;
594
619
  CAGrid *ca;
595
620
  rb_check_carray_object(cary);
596
- Data_Get_Struct(cary, CArray, parent);
621
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
597
622
  ca = ca_grid_new(parent, dim, grid);
598
623
  obj = ca_wrap_struct(ca);
599
624
  rb_ca_set_parent(obj, cary);
@@ -619,7 +644,7 @@ rb_ca_grid (int argc, VALUE *argv, VALUE self)
619
644
  CArray *grid[CA_RANK_MAX];
620
645
  ca_size_t i;
621
646
 
622
- Data_Get_Struct(self, CArray, ca);
647
+ TypedData_Get_Struct(self, CArray, &carray_data_type,ca);
623
648
 
624
649
  ridx = rb_ary_new4(argc, argv);
625
650
 
@@ -635,7 +660,7 @@ rb_ca_grid (int argc, VALUE *argv, VALUE self)
635
660
  for (i=0; i<rndim; i++) {
636
661
  rval = rb_ary_entry(ridx, i);
637
662
  if ( rb_obj_is_carray(rval) ) {
638
- Data_Get_Struct(rval, CArray, cv);
663
+ TypedData_Get_Struct(rval, CArray, &carray_data_type, cv);
639
664
  rdim[i] = 1;
640
665
  for (k=0; k<cv->ndim; k++) {
641
666
  rdim[i] *= ca->dim[j];
@@ -702,7 +727,7 @@ static VALUE
702
727
  rb_ca_grid_s_allocate (VALUE klass)
703
728
  {
704
729
  CAGrid *ca;
705
- return Data_Make_Struct(klass, CAGrid, ca_mark, ca_free, ca);
730
+ return TypedData_Make_Struct(klass, CAGrid, &cagrid_data_type, ca);
706
731
  }
707
732
 
708
733
  static VALUE
@@ -710,8 +735,8 @@ rb_ca_grid_initialize_copy (VALUE self, VALUE other)
710
735
  {
711
736
  CAGrid *ca, *cs;
712
737
 
713
- Data_Get_Struct(self, CAGrid, ca);
714
- Data_Get_Struct(other, CAGrid, cs);
738
+ TypedData_Get_Struct(self, CAGrid, &cagrid_data_type, ca);
739
+ TypedData_Get_Struct(other, CAGrid, &cagrid_data_type, cs);
715
740
 
716
741
  /* share grid info */
717
742
  ca_grid_setup(ca, cs->parent, cs->dim, cs->grid, cs->contig, 1);
@@ -725,8 +750,12 @@ void
725
750
  Init_ca_obj_grid ()
726
751
  {
727
752
  rb_cCAGrid = rb_define_class("CAGrid", rb_cCAVirtual);
753
+ rb_cCAGridMask = rb_define_class("CAGridMask", rb_cCAGrid);
728
754
 
729
- CA_OBJ_GRID = ca_install_obj_type(rb_cCAGrid, ca_grid_func);
755
+ CA_OBJ_GRID = ca_install_obj_type(rb_cCAGrid,
756
+ &cagrid_data_type,
757
+ rb_cCAGridMask,
758
+ &cagrid_mask_data_type, ca_grid_func);
730
759
  rb_define_const(rb_cObject, "CA_OBJ_GRID", INT2NUM(CA_OBJ_GRID));
731
760
 
732
761
  rb_define_method(rb_cCArray, "grid", rb_ca_grid, -1);
data/ext/ca_obj_mapping.c CHANGED
@@ -33,9 +33,34 @@ typedef struct {
33
33
  CArray *mapper;
34
34
  } CAMapping;
35
35
 
36
+ const rb_data_type_t camapping_data_type = {
37
+ .parent = &cavirtual_data_type,
38
+ .wrap_struct_name = "CAMapping",
39
+ .function = {
40
+ .dmark = ca_mark,
41
+ .dfree = ca_free,
42
+ .dsize = NULL,
43
+ .dcompact = NULL
44
+ },
45
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
46
+ };
47
+
48
+ const rb_data_type_t camapping_mask_data_type = {
49
+ .parent = &camapping_data_type,
50
+ .wrap_struct_name = "CAMappingMask",
51
+ .function = {
52
+ .dmark = NULL,
53
+ .dfree = ca_free_nop,
54
+ .dsize = NULL,
55
+ .dcompact = NULL
56
+ },
57
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
58
+ };
59
+
36
60
  static int8_t CA_OBJ_MAPPING;
37
61
 
38
- static VALUE rb_cCAMapping;
62
+ VALUE rb_cCAMapping;
63
+ VALUE rb_cCAMappingMask;
39
64
 
40
65
  /* yard:
41
66
  class CAMapping < CAVirtual # :nodoc:
@@ -553,7 +578,7 @@ rb_ca_mapping_new (VALUE cary, CArray *mapper)
553
578
  CArray *parent;
554
579
  CAMapping *ca;
555
580
  rb_check_carray_object(cary);
556
- Data_Get_Struct(cary, CArray, parent);
581
+ TypedData_Get_Struct(cary, CArray, &carray_data_type, parent);
557
582
  ca = ca_mapping_new(parent, mapper);
558
583
  obj = ca_wrap_struct(ca);
559
584
  rb_ca_set_parent(obj, cary);
@@ -568,7 +593,7 @@ rb_ca_mapping (int argc, VALUE *argv, VALUE self)
568
593
  volatile VALUE obj;
569
594
  CArray *ca;
570
595
  CArray *mapper;
571
- Data_Get_Struct(self, CArray, ca);
596
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
572
597
 
573
598
  rb_scan_args(argc, argv, "1", (VALUE *) &rmapper);
574
599
  rb_check_carray_object(rmapper);
@@ -584,7 +609,7 @@ static VALUE
584
609
  rb_ca_mapping_s_allocate (VALUE klass)
585
610
  {
586
611
  CAMapping *ca;
587
- return Data_Make_Struct(klass, CAMapping, ca_mark, ca_free, ca);
612
+ return TypedData_Make_Struct(klass, CAMapping, &camapping_data_type, ca);
588
613
  }
589
614
 
590
615
  static VALUE
@@ -592,8 +617,8 @@ rb_ca_mapping_initialize_copy (VALUE self, VALUE other)
592
617
  {
593
618
  CAMapping *ca, *cs;
594
619
 
595
- Data_Get_Struct(self, CAMapping, ca);
596
- Data_Get_Struct(other, CAMapping, cs);
620
+ TypedData_Get_Struct(self, CAMapping, &camapping_data_type, ca);
621
+ TypedData_Get_Struct(other, CAMapping, &camapping_data_type, cs);
597
622
 
598
623
  /* share mapper info */
599
624
  ca_mapping_setup(ca, cs->parent, cs->mapper, 1);
@@ -605,8 +630,12 @@ void
605
630
  Init_ca_obj_mapping ()
606
631
  {
607
632
  rb_cCAMapping = rb_define_class("CAMapping", rb_cCAVirtual);
633
+ rb_cCAMappingMask = rb_define_class("CAMappingMask", rb_cCAMapping);
608
634
 
609
- CA_OBJ_MAPPING = ca_install_obj_type(rb_cCAMapping, ca_mapping_func);
635
+ CA_OBJ_MAPPING = ca_install_obj_type(rb_cCAMapping,
636
+ &camapping_data_type,
637
+ rb_cCAMappingMask,
638
+ &camapping_mask_data_type, ca_mapping_func);
610
639
  rb_define_const(rb_cObject, "CA_OBJ_MAPPING", INT2NUM(CA_OBJ_MAPPING));
611
640
 
612
641
  rb_define_alloc_func(rb_cCAMapping, rb_ca_mapping_s_allocate);
data/ext/ca_obj_object.c CHANGED
@@ -36,6 +36,18 @@
36
36
 
37
37
  #include "carray.h"
38
38
 
39
+ const rb_data_type_t caobject_data_type = {
40
+ .parent = &cavirtual_data_type,
41
+ .wrap_struct_name = "CAObject",
42
+ .function = {
43
+ .dmark = ca_mark,
44
+ .dfree = ca_free,
45
+ .dsize = NULL,
46
+ .dcompact = NULL
47
+ },
48
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
49
+ };
50
+
39
51
  VALUE rb_cCAObject;
40
52
 
41
53
 
@@ -47,8 +59,19 @@ VALUE rb_cCAObject;
47
59
 
48
60
  /* ---------------------------------------------------------------------- */
49
61
 
62
+ const rb_data_type_t caobjectmask_data_type = {
63
+ .wrap_struct_name = "CAObjectMask",
64
+ .function = {
65
+ .dmark = ca_mark,
66
+ .dfree = ca_free,
67
+ .dsize = NULL,
68
+ .dcompact = NULL
69
+ },
70
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
71
+ };
72
+
50
73
  static int8_t CA_OBJ_OBJECT_MASK;
51
- static VALUE rb_cCAObjectMask;
74
+ VALUE rb_cCAObjectMask;
52
75
 
53
76
  /* yard:
54
77
  class CAObjectMask < CAVirtual # :nodoc:
@@ -277,7 +300,7 @@ static VALUE
277
300
  rb_ca_objmask_s_allocate (VALUE klass)
278
301
  {
279
302
  CAObjectMask *ca;
280
- return Data_Make_Struct(klass, CAObjectMask, ca_mark, ca_free, ca);
303
+ return TypedData_Make_Struct(klass, CAObjectMask, &caobject_data_type, ca);
281
304
  }
282
305
 
283
306
  static VALUE
@@ -285,8 +308,8 @@ rb_ca_objmask_initialize_copy (VALUE self, VALUE other)
285
308
  {
286
309
  CAObjectMask *ca, *cs;
287
310
 
288
- Data_Get_Struct(self, CAObjectMask, ca);
289
- Data_Get_Struct(other, CAObjectMask, cs);
311
+ TypedData_Get_Struct(self, CAObjectMask, &caobjectmask_data_type, ca);
312
+ TypedData_Get_Struct(other, CAObjectMask, &caobjectmask_data_type, cs);
290
313
 
291
314
  carray_setup((CArray *)ca, CA_BOOLEAN, cs->ndim, cs->dim, 0, NULL);
292
315
  ca->obj_type = CA_OBJ_OBJECT_MASK;
@@ -674,8 +697,8 @@ rb_ca_object_initialize_copy (VALUE self, VALUE other)
674
697
  volatile VALUE data;
675
698
  CAObject *ca, *cs;
676
699
 
677
- Data_Get_Struct(self, CAObject, ca);
678
- Data_Get_Struct(other, CAObject, cs);
700
+ TypedData_Get_Struct(self, CAObject, &caobject_data_type, ca);
701
+ TypedData_Get_Struct(other, CAObject, &caobject_data_type, cs);
679
702
 
680
703
  ca_object_setup(ca, cs->data_type, cs->ndim, cs->dim, cs->bytes);
681
704
  ca->self = self;
@@ -724,7 +747,7 @@ rb_ca_object_initialize (int argc, VALUE *argv, VALUE self)
724
747
  dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
725
748
  }
726
749
 
727
- Data_Get_Struct(self, CAObject, ca);
750
+ TypedData_Get_Struct(self, CAObject, &caobject_data_type, ca);
728
751
  ca_object_setup(ca, data_type, ndim, dim, bytes);
729
752
  ca->self = self;
730
753
 
@@ -739,7 +762,7 @@ rb_ca_object_initialize (int argc, VALUE *argv, VALUE self)
739
762
 
740
763
  if ( ! NIL_P(rparent) ) {
741
764
  CArray *cp;
742
- Data_Get_Struct(rparent, CArray, cp);
765
+ TypedData_Get_Struct(rparent, CArray, &carray_data_type, cp);
743
766
  ca->parent = cp;
744
767
  rb_ca_set_parent(self, rparent);
745
768
  }
@@ -754,7 +777,10 @@ Init_ca_obj_object ()
754
777
  {
755
778
  rb_cCAObjectMask = rb_define_class("CAObjectMask", rb_cCArray);
756
779
 
757
- CA_OBJ_OBJECT_MASK = ca_install_obj_type(rb_cCAObjectMask, ca_objmask_func);
780
+ CA_OBJ_OBJECT_MASK = ca_install_obj_type(rb_cCAObjectMask,
781
+ &caobjectmask_data_type,
782
+ rb_cCArrayMask,
783
+ &carray_data_type, ca_objmask_func);
758
784
  rb_define_const(rb_cObject, "CA_OBJ_OBJECT_MASK", INT2NUM(CA_OBJ_OBJECT_MASK));
759
785
 
760
786
  rb_define_alloc_func(rb_cCAObjectMask, rb_ca_objmask_s_allocate);
data/ext/ca_obj_reduce.c CHANGED
@@ -10,9 +10,34 @@
10
10
 
11
11
  #include "carray.h"
12
12
 
13
+ const rb_data_type_t careduce_data_type = {
14
+ .parent = &cavirtual_data_type,
15
+ .wrap_struct_name = "CAReduce",
16
+ .function = {
17
+ .dmark = ca_mark,
18
+ .dfree = ca_free,
19
+ .dsize = NULL,
20
+ .dcompact = NULL
21
+ },
22
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
23
+ };
24
+
25
+ const rb_data_type_t careduce_mask_data_type = {
26
+ .parent = &careduce_data_type,
27
+ .wrap_struct_name = "CAReduceMask",
28
+ .function = {
29
+ .dmark = NULL,
30
+ .dfree = ca_free_nop,
31
+ .dsize = NULL,
32
+ .dcompact = NULL
33
+ },
34
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
+ };
36
+
13
37
  static int8_t CA_OBJ_REDUCE;
14
38
 
15
- static VALUE rb_cCAReduce;
39
+ VALUE rb_cCAReduce;
40
+ VALUE rb_cCAReduceMask;
16
41
 
17
42
  /* yard:
18
43
  class CAReduce < CAVirtual # :nodoc:
@@ -265,7 +290,7 @@ static VALUE
265
290
  rb_ca_reduce_s_allocate (VALUE klass)
266
291
  {
267
292
  CAReduce *ca;
268
- return Data_Make_Struct(klass, CAReduce, ca_mark, ca_free, ca);
293
+ return TypedData_Make_Struct(klass, CAReduce, &careduce_data_type, ca);
269
294
  }
270
295
 
271
296
  static VALUE
@@ -273,8 +298,8 @@ rb_ca_reduce_initialize_copy (VALUE self, VALUE other)
273
298
  {
274
299
  CAReduce *ca, *cs;
275
300
 
276
- Data_Get_Struct(self, CAReduce, ca);
277
- Data_Get_Struct(other, CAReduce, cs);
301
+ TypedData_Get_Struct(self, CAReduce, &careduce_data_type, ca);
302
+ TypedData_Get_Struct(other, CAReduce, &careduce_data_type, cs);
278
303
 
279
304
  ca_reduce_setup(ca, cs->parent, cs->count, cs->offset);
280
305
 
@@ -285,8 +310,12 @@ void
285
310
  Init_ca_obj_reduce ()
286
311
  {
287
312
  rb_cCAReduce = rb_define_class("CAReduce", rb_cCAVirtual);
313
+ rb_cCAReduceMask = rb_define_class("CAReduceMask", rb_cCAReduce);
288
314
 
289
- CA_OBJ_REDUCE = ca_install_obj_type(rb_cCAReduce, ca_reduce_func);
315
+ CA_OBJ_REDUCE = ca_install_obj_type(rb_cCAReduce,
316
+ &careduce_data_type,
317
+ rb_cCAReduceMask,
318
+ &careduce_mask_data_type, ca_reduce_func);
290
319
  rb_define_const(rb_cObject, "CA_OBJ_REDUCE", INT2NUM(CA_OBJ_REDUCE));
291
320
 
292
321
  rb_define_alloc_func(rb_cCAReduce, rb_ca_reduce_s_allocate);
data/ext/ca_obj_refer.c CHANGED
@@ -10,7 +10,32 @@
10
10
 
11
11
  #include "carray.h"
12
12
 
13
+ const rb_data_type_t carefer_data_type = {
14
+ .parent = &cavirtual_data_type,
15
+ .wrap_struct_name = "CARefer",
16
+ .function = {
17
+ .dmark = ca_mark,
18
+ .dfree = ca_free,
19
+ .dsize = NULL,
20
+ .dcompact = NULL
21
+ },
22
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
23
+ };
24
+
25
+ const rb_data_type_t carefer_mask_data_type = {
26
+ .parent = &carefer_data_type,
27
+ .wrap_struct_name = "CAReferMask",
28
+ .function = {
29
+ .dmark = NULL,
30
+ .dfree = ca_free_nop,
31
+ .dsize = NULL,
32
+ .dcompact = NULL
33
+ },
34
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
+ };
36
+
13
37
  VALUE rb_cCARefer;
38
+ VALUE rb_cCAReferMask;
14
39
 
15
40
  /* yard:
16
41
  class CARefer < CAVirtual # :nodoc:
@@ -140,13 +165,12 @@ static char *
140
165
  ca_refer_func_ptr_at_addr (void *ap, ca_size_t addr)
141
166
  {
142
167
  CARefer *ca = (CARefer *) ap;
143
- ca_size_t major, minor;
168
+ ca_size_t minor;
144
169
  switch ( ca->is_deformed ) {
145
170
  case 0:
146
171
  case 1:
147
172
  return ca->ptr + ca->bytes * addr;
148
173
  case -2:
149
- major = (addr * ca->bytes) / ca->parent->bytes;
150
174
  minor = (addr * ca->bytes) % ca->parent->bytes;
151
175
  return ca->ptr + ca->bytes * addr + minor;
152
176
  case 2:
@@ -470,7 +494,7 @@ static VALUE
470
494
  rb_ca_refer_s_allocate (VALUE klass)
471
495
  {
472
496
  CARefer *ca;
473
- return Data_Make_Struct(klass, CARefer, ca_mark, ca_free, ca);
497
+ return TypedData_Make_Struct(klass, CARefer, &carefer_data_type, ca);
474
498
  }
475
499
 
476
500
  static VALUE
@@ -478,8 +502,8 @@ rb_ca_refer_initialize_copy (VALUE self, VALUE other)
478
502
  {
479
503
  CARefer *ca, *cs;
480
504
 
481
- Data_Get_Struct(self, CARefer, ca);
482
- Data_Get_Struct(other, CARefer, cs);
505
+ TypedData_Get_Struct(self, CARefer, &carefer_data_type, ca);
506
+ TypedData_Get_Struct(other, CARefer, &carefer_data_type, cs);
483
507
 
484
508
  ca_refer_setup(ca, cs->parent, cs->data_type, cs->ndim, cs->dim,
485
509
  cs->bytes, cs->offset);
@@ -515,7 +539,7 @@ rb_ca_refer (int argc, VALUE *argv, VALUE self)
515
539
  ca_size_t bytes, offset = 0;
516
540
  int8_t i;
517
541
 
518
- Data_Get_Struct(self, CArray, ca);
542
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
519
543
 
520
544
  if ( argc == 0 ) { /* CArray#refer() */
521
545
  data_type = ca->data_type;
@@ -531,7 +555,6 @@ rb_ca_refer (int argc, VALUE *argv, VALUE self)
531
555
  }
532
556
  else {
533
557
  volatile VALUE rtype, rdim, ropt, rbytes = Qnil, roffset = Qnil;
534
- ca_size_t elements;
535
558
 
536
559
  ropt = rb_pop_options(&argc, &argv);
537
560
  rb_scan_args(argc, argv, "11", (VALUE *) &rtype, (VALUE *) &rdim);
@@ -556,10 +579,8 @@ rb_ca_refer (int argc, VALUE *argv, VALUE self)
556
579
  Check_Type(rdim, T_ARRAY);
557
580
  ndim = RARRAY_LEN(rdim);
558
581
 
559
- elements = 1;
560
582
  for (i=0; i<ndim; i++) {
561
583
  dim[i] = NUM2SIZE(rb_ary_entry(rdim, i));
562
- elements *= dim[i];
563
584
  }
564
585
 
565
586
  if ( ! NIL_P(roffset) ) {
@@ -587,7 +608,7 @@ rb_ca_refer_new (VALUE self,
587
608
  CArray *ca;
588
609
  int8_t i;
589
610
 
590
- Data_Get_Struct(self, CArray, ca);
611
+ TypedData_Get_Struct(self, CArray, &carray_data_type, ca);
591
612
 
592
613
  rdim = rb_ary_new2(ndim);
593
614
  for (i=0; i<ndim; i++) {