numo-narray 0.9.1.5 → 0.9.2.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -5
  3. data/Rakefile +4 -63
  4. data/ext/numo/narray/array.c +19 -26
  5. data/ext/numo/narray/data.c +2 -8
  6. data/ext/numo/narray/depend.erb +6 -10
  7. data/ext/numo/narray/extconf.rb +23 -21
  8. data/ext/numo/narray/gen/cogen.rb +2 -2
  9. data/ext/numo/narray/gen/narray_def.rb +1 -1
  10. data/ext/numo/narray/gen/spec.rb +12 -6
  11. data/ext/numo/narray/gen/tmpl/accum_binary.c +4 -0
  12. data/ext/numo/narray/gen/tmpl/alloc_func.c +4 -1
  13. data/ext/numo/narray/gen/tmpl/allocate.c +1 -0
  14. data/ext/numo/narray/gen/tmpl/cast.c +7 -0
  15. data/ext/numo/narray/gen/tmpl/lib.c +1 -1
  16. data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -0
  17. data/ext/numo/narray/gen/tmpl_bit/binary.c +6 -0
  18. data/ext/numo/narray/gen/tmpl_bit/store_bit.c +6 -2
  19. data/ext/numo/narray/gen/tmpl_bit/unary.c +4 -0
  20. data/ext/numo/narray/index.c +5 -11
  21. data/ext/numo/narray/math.c +1 -1
  22. data/ext/numo/narray/narray.c +108 -11
  23. data/ext/numo/narray/ndloop.c +3 -3
  24. data/ext/numo/narray/numo/intern.h +1 -1
  25. data/ext/numo/narray/numo/narray.h +16 -12
  26. data/ext/numo/narray/numo/ndloop.h +1 -1
  27. data/ext/numo/narray/numo/template.h +8 -10
  28. data/ext/numo/narray/numo/types/complex.h +1 -1
  29. data/ext/numo/narray/numo/types/complex_macro.h +1 -1
  30. data/ext/numo/narray/numo/types/float_macro.h +1 -1
  31. data/ext/numo/narray/numo/types/int16.h +5 -2
  32. data/ext/numo/narray/numo/types/int32.h +0 -1
  33. data/ext/numo/narray/numo/types/int64.h +0 -1
  34. data/ext/numo/narray/numo/types/int8.h +1 -2
  35. data/ext/numo/narray/numo/types/uint16.h +5 -2
  36. data/ext/numo/narray/numo/types/uint32.h +0 -1
  37. data/ext/numo/narray/numo/types/uint64.h +0 -1
  38. data/ext/numo/narray/numo/types/uint8.h +1 -2
  39. data/ext/numo/narray/numo/types/xint_macro.h +2 -0
  40. data/ext/numo/narray/step.c +1 -1
  41. data/ext/numo/narray/struct.c +2 -2
  42. data/lib/numo/narray.rb +1 -7
  43. data/lib/numo/narray/extra.rb +42 -1
  44. data/numo-narray.gemspec +3 -8
  45. metadata +14 -34
@@ -94,7 +94,11 @@ static VALUE
94
94
  return <%=c_func%>_self(argc, argv, self);
95
95
  } else {
96
96
  v = rb_funcall(klass, id_cast, 1, self);
97
+ //<% if Gem::Version.create(RUBY_VERSION) < Gem::Version.create('2.7.0') %>
97
98
  return rb_funcall2(v, rb_intern("<%=name%>"), argc, argv);
99
+ //<% else %>
100
+ return rb_funcallv_kw(v, rb_intern("<%=name%>"), argc, argv, RB_PASS_CALLED_KEYWORDS);
101
+ //<% end %>
98
102
  }
99
103
  //<% end %>
100
104
  }
@@ -29,7 +29,9 @@ static void
29
29
  assert(na->base.type == NARRAY_DATA_T);
30
30
 
31
31
  if (na->ptr != NULL) {
32
- xfree(na->ptr);
32
+ if (na->owned) {
33
+ xfree(na->ptr);
34
+ }
33
35
  na->ptr = NULL;
34
36
  }
35
37
  if (na->base.size > 0) {
@@ -103,5 +105,6 @@ static VALUE
103
105
  na->base.shape = NULL;
104
106
  na->base.reduce = INT2FIX(0);
105
107
  na->ptr = NULL;
108
+ na->owned = FALSE;
106
109
  return TypedData_Wrap_Struct(klass, &<%=type_name%>_data_type, (void*)na);
107
110
  }
@@ -20,6 +20,7 @@ static VALUE
20
20
  }
21
21
  <% end %>
22
22
  NA_DATA_PTR(na) = ptr;
23
+ NA_DATA_OWNED(na) = TRUE;
23
24
  }
24
25
  break;
25
26
  case NARRAY_VIEW_T:
@@ -35,6 +35,13 @@ static VALUE
35
35
  }
36
36
  return v;
37
37
  }
38
+ if (rb_respond_to(obj,id_to_a)) {
39
+ obj = rb_funcall(obj,id_to_a,0);
40
+ if (TYPE(obj)!=T_ARRAY) {
41
+ rb_raise(rb_eTypeError, "`to_a' did not return Array");
42
+ }
43
+ return <%=find_tmpl("cast_array").c_func%>(obj);
44
+ }
38
45
  <% if is_object %>
39
46
  return robject_new_dim0(obj);
40
47
  <% else %>
@@ -3,7 +3,7 @@
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
4
 
5
5
  created on: 2017-03-11
6
- Copyright (C) 2017-2019 Masahiro Tanaka
6
+ Copyright (C) 2017-2020 Masahiro Tanaka
7
7
  */
8
8
 
9
9
  #include <ruby.h>
@@ -12,6 +12,7 @@ static VALUE
12
12
  if (na->size > 0 && ptr == NULL) {
13
13
  ptr = xmalloc(((na->size-1)/8/sizeof(BIT_DIGIT)+1)*sizeof(BIT_DIGIT));
14
14
  NA_DATA_PTR(na) = ptr;
15
+ NA_DATA_OWNED(na) = TRUE;
15
16
  }
16
17
  break;
17
18
  case NARRAY_VIEW_T:
@@ -21,6 +21,12 @@ static void
21
21
  STORE_BIT_STEP(a3, p3, s3, idx3, x);
22
22
  }
23
23
  } else {
24
+ a1 += p1/NB;
25
+ p1 %= NB;
26
+ a2 += p2/NB;
27
+ p2 %= NB;
28
+ a3 += p3/NB;
29
+ p3 %= NB;
24
30
  o1 = p1-p3;
25
31
  o2 = p2-p3;
26
32
  l1 = NB+o1;
@@ -2,7 +2,7 @@ static void
2
2
  <%=c_iter%>(na_loop_t *const lp)
3
3
  {
4
4
  size_t n;
5
- size_t p1, p3;
5
+ ssize_t p1, p3;
6
6
  ssize_t s1, s3;
7
7
  size_t *idx1, *idx3;
8
8
  int o1, l1, r1, len;
@@ -18,6 +18,10 @@ static void
18
18
  STORE_BIT_STEP(a3, p3, s3, idx3, x);
19
19
  }
20
20
  } else {
21
+ a1 += p1/NB;
22
+ p1 %= NB;
23
+ a3 += p3/NB;
24
+ p3 %= NB;
21
25
  o1 = p1-p3;
22
26
  l1 = NB+o1;
23
27
  r1 = NB-o1;
@@ -26,7 +30,7 @@ static void
26
30
  if ((int)n<len) len=n;
27
31
  if (o1>=0) x = *a1>>o1;
28
32
  else x = *a1<<-o1;
29
- if (p1+len>NB) x |= *(a1+1)<<r1;
33
+ if (p1+len>(ssize_t)NB) x |= *(a1+1)<<r1;
30
34
  a1++;
31
35
  *a3 = (x & (SLB(len)<<p3)) | (*a3 & ~(SLB(len)<<p3));
32
36
  a3++;
@@ -20,6 +20,10 @@ static void
20
20
  STORE_BIT_STEP(a3, p3, s3, idx3, y);
21
21
  }
22
22
  } else {
23
+ a1 += p1/NB;
24
+ p1 %= NB;
25
+ a3 += p3/NB;
26
+ p3 %= NB;
23
27
  o1 = p1-p3;
24
28
  l1 = NB+o1;
25
29
  r1 = NB-o1;
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  index.c
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  //#define NARRAY_C
7
7
 
@@ -1050,11 +1050,8 @@ static VALUE na_slice(int argc, VALUE *argv, VALUE self)
1050
1050
  # [10, 11, 99, 13, 14],
1051
1051
  # [15, 16, 99, 18, 19]]
1052
1052
  */
1053
- static VALUE na_aref(int argc, VALUE *argv, VALUE self)
1054
- {
1055
- // implemented in subclasses
1056
- return rb_f_notimplement(argc,argv,self);
1057
- }
1053
+ // implemented in subclasses
1054
+ #define na_aref rb_f_notimplement
1058
1055
 
1059
1056
  /*
1060
1057
  Multi-dimensional element assignment.
@@ -1094,11 +1091,8 @@ static VALUE na_aref(int argc, VALUE *argv, VALUE self)
1094
1091
  # [8, 9, 10, 11]]
1095
1092
 
1096
1093
  */
1097
- static VALUE na_aset(int argc, VALUE *argv, VALUE self)
1098
- {
1099
- // implemented in subclasses
1100
- return rb_f_notimplement(argc,argv,self);
1101
- }
1094
+ // implemented in subclasses
1095
+ #define na_aset rb_f_notimplement
1102
1096
 
1103
1097
  /*
1104
1098
  Multi-dimensional array indexing.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  math.c
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  #include <ruby.h>
7
7
  #include "numo/narray.h"
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  narray.c
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  #define NARRAY_C
7
7
  #include <ruby.h>
@@ -34,6 +34,7 @@ static ID id_count_false;
34
34
  static ID id_axis;
35
35
  static ID id_nan;
36
36
  static ID id_keepdims;
37
+ static ID id_source;
37
38
 
38
39
  VALUE cPointer;
39
40
 
@@ -605,6 +606,87 @@ na_s_eye(int argc, VALUE *argv, VALUE klass)
605
606
  #define READ 1
606
607
  #define WRITE 2
607
608
 
609
+ static void
610
+ na_set_pointer(VALUE self, char *ptr, size_t byte_size)
611
+ {
612
+ VALUE obj;
613
+ narray_t *na;
614
+
615
+ if (OBJ_FROZEN(self)) {
616
+ rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
617
+ }
618
+
619
+ GetNArray(self,na);
620
+
621
+ switch(NA_TYPE(na)) {
622
+ case NARRAY_DATA_T:
623
+ if (NA_SIZE(na) > 0) {
624
+ if (NA_DATA_PTR(na) != NULL && NA_DATA_OWNED(na)) {
625
+ xfree(NA_DATA_PTR(na));
626
+ }
627
+ NA_DATA_PTR(na) = ptr;
628
+ NA_DATA_OWNED(na) = FALSE;
629
+ }
630
+ return;
631
+ case NARRAY_VIEW_T:
632
+ obj = NA_VIEW_DATA(na);
633
+ if (OBJ_FROZEN(obj)) {
634
+ rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
635
+ }
636
+ GetNArray(obj,na);
637
+ switch(NA_TYPE(na)) {
638
+ case NARRAY_DATA_T:
639
+ if (NA_SIZE(na) > 0) {
640
+ if (NA_DATA_PTR(na) != NULL && NA_DATA_OWNED(na)) {
641
+ xfree(NA_DATA_PTR(na));
642
+ }
643
+ NA_DATA_PTR(na) = ptr;
644
+ NA_DATA_OWNED(na) = FALSE;
645
+ }
646
+ return;
647
+ default:
648
+ rb_raise(rb_eRuntimeError,"invalid NA_TYPE of view: %d",NA_TYPE(na));
649
+ }
650
+ default:
651
+ rb_raise(rb_eRuntimeError,"invalid NA_TYPE: %d",NA_TYPE(na));
652
+ }
653
+ }
654
+
655
+ static void
656
+ na_pointer_copy_on_write(VALUE self)
657
+ {
658
+ narray_t *na;
659
+ void *ptr;
660
+ VALUE velmsz;
661
+ size_t byte_size;
662
+
663
+ GetNArray(self,na);
664
+ if (NA_TYPE(na) == NARRAY_VIEW_T) {
665
+ self = NA_VIEW_DATA(na);
666
+ GetNArray(self,na);
667
+ }
668
+
669
+ ptr = NA_DATA_PTR(na);
670
+ if (ptr == NULL) {
671
+ return;
672
+ }
673
+
674
+ if (NA_DATA_OWNED(na)) {
675
+ return;
676
+ }
677
+
678
+ velmsz = rb_const_get(rb_obj_class(self), id_element_byte_size);
679
+ if (FIXNUM_P(velmsz)) {
680
+ byte_size = NA_SIZE(na) * NUM2SIZET(velmsz);
681
+ } else {
682
+ byte_size = ceil(NA_SIZE(na) * NUM2DBL(velmsz));
683
+ }
684
+ NA_DATA_PTR(na) = NULL;
685
+ rb_funcall(self, id_allocate, 0);
686
+ memcpy(NA_DATA_PTR(na), ptr, byte_size);
687
+ rb_ivar_set(self, id_source, Qnil);
688
+ }
689
+
608
690
  static char *
609
691
  na_get_pointer_for_rw(VALUE self, int flag)
610
692
  {
@@ -620,6 +702,9 @@ na_get_pointer_for_rw(VALUE self, int flag)
620
702
 
621
703
  switch(NA_TYPE(na)) {
622
704
  case NARRAY_DATA_T:
705
+ if (flag & WRITE) {
706
+ na_pointer_copy_on_write(self);
707
+ }
623
708
  ptr = NA_DATA_PTR(na);
624
709
  if (NA_SIZE(na) > 0 && ptr == NULL) {
625
710
  if (flag & READ) {
@@ -636,6 +721,9 @@ na_get_pointer_for_rw(VALUE self, int flag)
636
721
  if ((flag & WRITE) && OBJ_FROZEN(obj)) {
637
722
  rb_raise(rb_eRuntimeError, "cannot write to frozen NArray.");
638
723
  }
724
+ if (flag & WRITE) {
725
+ na_pointer_copy_on_write(self);
726
+ }
639
727
  GetNArray(obj,na);
640
728
  switch(NA_TYPE(na)) {
641
729
  case NARRAY_DATA_T:
@@ -1260,7 +1348,6 @@ nary_s_from_binary(int argc, VALUE *argv, VALUE type)
1260
1348
  {
1261
1349
  size_t len, str_len, byte_size;
1262
1350
  size_t *shape;
1263
- char *ptr;
1264
1351
  int i, nd, narg;
1265
1352
  VALUE vstr, vshape, vna;
1266
1353
  VALUE velmsz;
@@ -1278,8 +1365,8 @@ nary_s_from_binary(int argc, VALUE *argv, VALUE type)
1278
1365
  break;
1279
1366
  case T_ARRAY:
1280
1367
  nd = RARRAY_LEN(vshape);
1281
- if (nd == 0 || nd > NA_MAX_DIMENSION) {
1282
- rb_raise(nary_eDimensionError,"too long or empty shape (%d)", nd);
1368
+ if (nd > NA_MAX_DIMENSION) {
1369
+ rb_raise(nary_eDimensionError,"shape exceeds max dimension");
1283
1370
  }
1284
1371
  shape = ALLOCA_N(size_t,nd);
1285
1372
  len = 1;
@@ -1315,9 +1402,13 @@ nary_s_from_binary(int argc, VALUE *argv, VALUE type)
1315
1402
  }
1316
1403
 
1317
1404
  vna = nary_new(type, nd, shape);
1318
- ptr = na_get_pointer_for_write(vna);
1319
-
1320
- memcpy(ptr, RSTRING_PTR(vstr), byte_size);
1405
+ if (OBJ_FROZEN(vstr)) {
1406
+ na_set_pointer(vna, RSTRING_PTR(vstr), byte_size);
1407
+ rb_ivar_set(vna, id_source, vstr);
1408
+ } else {
1409
+ void *ptr = na_get_pointer_for_write(vna);
1410
+ memcpy(ptr, RSTRING_PTR(vstr), byte_size);
1411
+ }
1321
1412
 
1322
1413
  return vna;
1323
1414
  }
@@ -1333,7 +1424,6 @@ static VALUE
1333
1424
  nary_store_binary(int argc, VALUE *argv, VALUE self)
1334
1425
  {
1335
1426
  size_t size, str_len, byte_size, offset;
1336
- char *ptr;
1337
1427
  int narg;
1338
1428
  VALUE vstr, voffset;
1339
1429
  VALUE velmsz;
@@ -1363,8 +1453,13 @@ nary_store_binary(int argc, VALUE *argv, VALUE self)
1363
1453
  rb_raise(rb_eArgError, "string is too short to store");
1364
1454
  }
1365
1455
 
1366
- ptr = na_get_pointer_for_write(self);
1367
- memcpy(ptr, RSTRING_PTR(vstr)+offset, byte_size);
1456
+ if (OBJ_FROZEN(vstr)) {
1457
+ na_set_pointer(self, RSTRING_PTR(vstr)+offset, byte_size);
1458
+ rb_ivar_set(self, id_source, vstr);
1459
+ } else {
1460
+ void *ptr = na_get_pointer_for_write(self);
1461
+ memcpy(ptr, RSTRING_PTR(vstr)+offset, byte_size);
1462
+ }
1368
1463
 
1369
1464
  return SIZET2NUM(byte_size);
1370
1465
  }
@@ -1436,7 +1531,7 @@ static VALUE na_inplace( VALUE self );
1436
1531
  /*
1437
1532
  Load marshal data.
1438
1533
  @overload marshal_load(data)
1439
- @params [Array] Array containing marshal data.
1534
+ @param [Array] Array containing marshal data.
1440
1535
  @return [nil]
1441
1536
  */
1442
1537
  static VALUE
@@ -1470,6 +1565,7 @@ nary_marshal_load(VALUE self, VALUE a)
1470
1565
  ptr = na_get_pointer_for_write(self);
1471
1566
  memcpy(ptr, RARRAY_PTR(v), NA_SIZE(na)*sizeof(VALUE));
1472
1567
  } else {
1568
+ rb_str_freeze(v);
1473
1569
  nary_store_binary(1,&v,self);
1474
1570
  if (TEST_BYTE_SWAPPED(self)) {
1475
1571
  rb_funcall(na_inplace(self),id_to_host,0);
@@ -2009,6 +2105,7 @@ Init_narray()
2009
2105
  id_axis = rb_intern("axis");
2010
2106
  id_nan = rb_intern("nan");
2011
2107
  id_keepdims = rb_intern("keepdims");
2108
+ id_source = rb_intern("source");
2012
2109
 
2013
2110
  sym_reduce = ID2SYM(rb_intern("reduce"));
2014
2111
  sym_option = ID2SYM(rb_intern("option"));
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  ndloop.c
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
 
7
7
  #include <ruby.h>
@@ -164,7 +164,7 @@ print_ndloop(na_md_loop_t *lp) {
164
164
  for (i=0; i<lp->user.ndim; i++) {
165
165
  printf(" &user.args[%d].iter[%d] = 0x%"SZF"x\n", j,i, (size_t)&lp->user.args[j].iter[i]);
166
166
  printf(" user.args[%d].iter[%d].pos = %"SZF"u\n", j,i, lp->user.args[j].iter[i].pos);
167
- printf(" user.args[%d].iter[%d].step = %"SZF"u\n", j,i, lp->user.args[j].iter[i].step);
167
+ printf(" user.args[%d].iter[%d].step = %"SZF"d\n", j,i, lp->user.args[j].iter[i].step);
168
168
  printf(" user.args[%d].iter[%d].idx = 0x%"SZF"x\n", j,i, (size_t)lp->user.args[j].iter[i].idx);
169
169
  }
170
170
  }
@@ -174,7 +174,7 @@ print_ndloop(na_md_loop_t *lp) {
174
174
  for (i=0; i<=nd; i++) {
175
175
  printf(" &xargs[%d].iter[%d] = 0x%"SZF"x\n", j,i, (size_t)&LITER(lp,i,j));
176
176
  printf(" xargs[%d].iter[%d].pos = %"SZF"u\n", j,i, LITER(lp,i,j).pos);
177
- printf(" xargs[%d].iter[%d].step = %"SZF"u\n", j,i, LITER(lp,i,j).step);
177
+ printf(" xargs[%d].iter[%d].step = %"SZF"d\n", j,i, LITER(lp,i,j).step);
178
178
  printf(" xargs[%d].iter[%d].idx = 0x%"SZF"x\n", j,i, (size_t)LITER(lp,i,j).idx);
179
179
  }
180
180
  printf(" xargs[%d].bufcp = 0x%"SZF"x\n", j, (size_t)lp->xargs[j].bufcp);
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  intern.h
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  #ifndef INTERN_H
7
7
  #define INTERN_H
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  narray.h
3
3
  Ruby/Numo::NArray - Numerical Array class for Ruby
4
- Copyright (C) 1999-2019 Masahiro TANAKA
4
+ Copyright (C) 1999-2020 Masahiro TANAKA
5
5
  */
6
6
  #ifndef NARRAY_H
7
7
  #define NARRAY_H
@@ -13,8 +13,8 @@ extern "C" {
13
13
  #endif
14
14
  #endif
15
15
 
16
- #define NARRAY_VERSION "0.9.1.5"
17
- #define NARRAY_VERSION_CODE 915
16
+ #define NARRAY_VERSION "0.9.2.0"
17
+ #define NARRAY_VERSION_CODE 920
18
18
 
19
19
  #include <math.h>
20
20
  #include "numo/compat.h"
@@ -81,6 +81,8 @@ extern "C" {
81
81
  # ifndef PRIu64
82
82
  # define PRIu64 "llu"
83
83
  # endif
84
+ #else
85
+ # error ---->> numo/narray requires 8-byte integer. <<----
84
86
  #endif
85
87
 
86
88
  #if SIZEOF_LONG==4
@@ -96,22 +98,22 @@ extern "C" {
96
98
  # endif
97
99
  #elif SIZEOF_INT==4
98
100
  # define NUM2INT32(x) NUM2INT(x)
99
- # define INT322NUM(x) INT2NUM(x)
100
101
  # define NUM2UINT32(x) NUM2UINT(x)
101
- # define UINT322NUM(x) UINT2NUM(x)
102
+ # if SIZEOF_LONG > 4
103
+ # define INT322NUM(x) INT2FIX(x)
104
+ # define UINT322NUM(x) INT2FIX(x)
105
+ # else
106
+ # define INT322NUM(x) INT2NUM(x)
107
+ # define UINT322NUM(x) UINT2NUM(x)
108
+ # endif
102
109
  # ifndef PRId32
103
110
  # define PRId32 "d"
104
111
  # endif
105
112
  # ifndef PRIu32
106
113
  # define PRIu32 "u"
107
114
  # endif
108
- #endif
109
-
110
- #if SIZEOF_VALUE > 4
111
- # undef INT322NUM
112
- # undef UINT322NUM
113
- # define INT322NUM(x) INT2FIX(x)
114
- # define UINT322NUM(x) INT2FIX(x)
115
+ #else
116
+ # error ---->> numo/narray requires 4-byte integer. <<----
115
117
  #endif
116
118
 
117
119
  #ifndef HAVE_TYPE_BOOL
@@ -195,6 +197,7 @@ typedef struct RNArray {
195
197
  typedef struct RNArrayData {
196
198
  narray_t base;
197
199
  char *ptr;
200
+ bool owned;
198
201
  } narray_data_t;
199
202
 
200
203
 
@@ -323,6 +326,7 @@ _na_get_narray_t(VALUE obj, unsigned char na_type)
323
326
  #define NA_DATA(na) ((narray_data_t*)(na))
324
327
  #define NA_VIEW(na) ((narray_view_t*)(na))
325
328
  #define NA_DATA_PTR(na) (NA_DATA(na)->ptr)
329
+ #define NA_DATA_OWNED(na) (NA_DATA(na)->owned)
326
330
  #define NA_VIEW_DATA(na) (NA_VIEW(na)->data)
327
331
  #define NA_VIEW_OFFSET(na) (NA_VIEW(na)->offset)
328
332
  #define NA_VIEW_STRIDX(na) (NA_VIEW(na)->stridx)