numo-narray 0.9.0.3 → 0.9.0.4

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -6
  3. data/Rakefile +2 -10
  4. data/ext/numo/narray/array.c +1 -6
  5. data/ext/numo/narray/data.c +3 -9
  6. data/ext/numo/narray/depend.erb +1 -1
  7. data/ext/numo/narray/extconf.rb +0 -1
  8. data/ext/numo/narray/gen/def/bit.rb +2 -0
  9. data/ext/numo/narray/gen/def/dcomplex.rb +2 -0
  10. data/ext/numo/narray/gen/def/dfloat.rb +2 -0
  11. data/ext/numo/narray/gen/def/int16.rb +2 -0
  12. data/ext/numo/narray/gen/def/int32.rb +2 -0
  13. data/ext/numo/narray/gen/def/int64.rb +2 -0
  14. data/ext/numo/narray/gen/def/int8.rb +2 -0
  15. data/ext/numo/narray/gen/def/robject.rb +2 -0
  16. data/ext/numo/narray/gen/def/scomplex.rb +2 -0
  17. data/ext/numo/narray/gen/def/sfloat.rb +2 -0
  18. data/ext/numo/narray/gen/def/uint16.rb +2 -0
  19. data/ext/numo/narray/gen/def/uint32.rb +2 -0
  20. data/ext/numo/narray/gen/def/uint64.rb +2 -0
  21. data/ext/numo/narray/gen/def/uint8.rb +2 -0
  22. data/ext/numo/narray/gen/dtype.erb.c +7 -7
  23. data/ext/numo/narray/gen/spec.rb +24 -2
  24. data/ext/numo/narray/gen/tmpl/accum_binary.c +6 -0
  25. data/ext/numo/narray/gen/tmpl/aref.c +6 -4
  26. data/ext/numo/narray/gen/tmpl/aset.c +6 -4
  27. data/ext/numo/narray/gen/tmpl/binary.c +4 -0
  28. data/ext/numo/narray/gen/tmpl/binary2.c +4 -0
  29. data/ext/numo/narray/gen/tmpl/bincount.c +180 -0
  30. data/ext/numo/narray/gen/tmpl/cast.c +4 -0
  31. data/ext/numo/narray/gen/tmpl/cast_array.c +3 -64
  32. data/ext/numo/narray/gen/tmpl/cond_binary.c +4 -0
  33. data/ext/numo/narray/gen/tmpl/inspect.c +4 -0
  34. data/ext/numo/narray/gen/tmpl/pow.c +4 -0
  35. data/ext/numo/narray/gen/tmpl/qsort.c +1 -7
  36. data/ext/numo/narray/gen/tmpl/rand.c +13 -2
  37. data/ext/numo/narray/gen/tmpl/rand_norm.c +89 -16
  38. data/ext/numo/narray/gen/tmpl/store.c +4 -0
  39. data/ext/numo/narray/gen/tmpl/store_array.c +99 -2
  40. data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -1
  41. data/ext/numo/narray/gen/tmpl_bit/aref.c +6 -4
  42. data/ext/numo/narray/gen/tmpl_bit/aset.c +6 -4
  43. data/ext/numo/narray/gen/tmpl_bit/cast_array.c +3 -65
  44. data/ext/numo/narray/gen/tmpl_bit/mask.c +16 -1
  45. data/ext/numo/narray/gen/tmpl_bit/store_array.c +101 -2
  46. data/ext/numo/narray/gen/tmpl_bit/where.c +7 -23
  47. data/ext/numo/narray/gen/tmpl_bit/where2.c +58 -4
  48. data/ext/numo/narray/index.c +168 -166
  49. data/ext/numo/narray/kwarg.c +1 -6
  50. data/ext/numo/narray/math.c +8 -12
  51. data/ext/numo/narray/narray.c +231 -71
  52. data/ext/numo/narray/ndloop.c +86 -26
  53. data/ext/numo/narray/numo/intern.h +6 -10
  54. data/ext/numo/narray/numo/narray.h +83 -54
  55. data/ext/numo/narray/numo/ndloop.h +0 -5
  56. data/ext/numo/narray/numo/template.h +0 -5
  57. data/ext/numo/narray/numo/types/complex.h +1 -6
  58. data/ext/numo/narray/numo/types/complex_macro.h +30 -3
  59. data/ext/numo/narray/numo/types/dcomplex.h +18 -0
  60. data/ext/numo/narray/numo/types/dfloat.h +18 -0
  61. data/ext/numo/narray/numo/types/float_macro.h +25 -2
  62. data/ext/numo/narray/numo/types/robj_macro.h +2 -4
  63. data/ext/numo/narray/numo/types/scomplex.h +18 -0
  64. data/ext/numo/narray/numo/types/sfloat.h +18 -0
  65. data/ext/numo/narray/rand.c +0 -15
  66. data/ext/numo/narray/step.c +0 -5
  67. data/ext/numo/narray/struct.c +7 -12
  68. data/lib/erbpp/line_number.rb +4 -4
  69. data/lib/erbpp/narray_def.rb +16 -7
  70. data/lib/numo/narray.rb +2 -0
  71. data/lib/numo/narray/extra.rb +465 -0
  72. data/numo-narray.gemspec +2 -2
  73. data/spec/narray_spec.rb +4 -3
  74. metadata +13 -7
  75. data/ext/numo/narray/gen/tmpl/head.c +0 -25
@@ -2,11 +2,6 @@
2
2
  ndloop.c
3
3
  Numerical Array Extension for Ruby
4
4
  (C) Copyright 1999-2016 by Masahiro TANAKA
5
-
6
- This program is free software.
7
- You can distribute/modify this program
8
- under the same terms as Ruby itself.
9
- NO WARRANTY.
10
5
  */
11
6
 
12
7
  #include <ruby.h>
@@ -514,7 +509,7 @@ ndloop_check_shape(na_md_loop_t *lp, int nf_dim, narray_t *na)
514
509
  lp->n[i] = n;
515
510
  } else if (lp->n[i] != n) {
516
511
  // inconsistent array shape
517
- rb_raise(rb_eTypeError,"shape1[%d](=%"SZF"u) != shape2[%d](=%"SZF"u)",
512
+ rb_raise(nary_eShapeError,"shape1[%d](=%"SZF"u) != shape2[%d](=%"SZF"u)",
518
513
  i, lp->n[i], k, n);
519
514
  }
520
515
  }
@@ -1616,7 +1611,7 @@ loop_inspect(ndfunc_t *nf, na_md_loop_t *lp)
1616
1611
  }
1617
1612
  }
1618
1613
  }
1619
- loop_end:
1614
+ loop_end:
1620
1615
  ;
1621
1616
  }
1622
1617
 
@@ -1657,7 +1652,63 @@ na_ndloop_inspect(VALUE nary, na_text_func_t func, VALUE opt)
1657
1652
  //----------------------------------------------------------------------
1658
1653
 
1659
1654
  static void
1660
- loop_rarray_to_narray(ndfunc_t *nf, na_md_loop_t *lp)
1655
+ loop_store_subnarray(ndfunc_t *nf, na_md_loop_t *lp, int i0, size_t *c, VALUE a)
1656
+ {
1657
+ int nd = lp->ndim;
1658
+ int i, j;
1659
+ narray_t *na;
1660
+ int *dim_map;
1661
+ VALUE a_type;
1662
+
1663
+ a_type = CLASS_OF(LARG(lp,0).value);
1664
+ if (CLASS_OF(a) != a_type) {
1665
+ a = rb_funcall(a_type, rb_intern("cast"), 1, a);
1666
+ }
1667
+ GetNArray(a,na);
1668
+ if (na->ndim != nd-i0+1) {
1669
+ rb_raise(nary_eShapeError, "mismatched dimension of sub-narray: "
1670
+ "nd_src=%d, nd_dst=%d", na->ndim, nd-i0+1);
1671
+ }
1672
+ dim_map = ALLOCA_N(int, na->ndim);
1673
+ for (i=0; i<na->ndim; i++) {
1674
+ dim_map[i] = lp->trans_map[i+i0];
1675
+ //printf("dim_map[i=%d] = %d, i0=%d\n", i, dim_map[i], i0);
1676
+ }
1677
+ ndloop_set_stepidx(lp, 1, a, dim_map, NDL_READ);
1678
+ LARG(lp,1).shape = &(na->shape[na->ndim-1]);
1679
+
1680
+ // loop body
1681
+ for (i=i0;;) {
1682
+ LARG(lp,1).value = Qtrue;
1683
+ for (; i<nd; i++) {
1684
+ for (j=0; j<2; j++) {
1685
+ if (LITER(lp,i,j).idx) {
1686
+ LITER(lp,i+1,j).pos = LITER(lp,i,j).pos + LITER(lp,i,j).idx[c[i]];
1687
+ } else {
1688
+ LITER(lp,i+1,j).pos = LITER(lp,i,j).pos + LITER(lp,i,j).step*c[i];
1689
+ }
1690
+ }
1691
+ if (c[i] >= na->shape[i-i0]) {
1692
+ LARG(lp,1).value = Qfalse;
1693
+ }
1694
+ }
1695
+
1696
+ (*(nf->func))(&(lp->user));
1697
+
1698
+ for (;;) {
1699
+ if (i<=i0) goto loop_end;
1700
+ i--; c[i]++;
1701
+ if (c[i] < lp->n[i]) break;
1702
+ c[i] = 0;
1703
+ }
1704
+ }
1705
+ loop_end:
1706
+ LARG(lp,1).ptr = NULL;
1707
+ }
1708
+
1709
+
1710
+ static void
1711
+ loop_store_rarray(ndfunc_t *nf, na_md_loop_t *lp)
1661
1712
  {
1662
1713
  size_t *c;
1663
1714
  int i;
@@ -1670,38 +1721,47 @@ loop_rarray_to_narray(ndfunc_t *nf, na_md_loop_t *lp)
1670
1721
 
1671
1722
  // array at each dimension
1672
1723
  a = ALLOCA_N(VALUE, nd+1);
1673
- a[0] = LARG(lp,0).value;
1724
+ a[0] = LARG(lp,1).value;
1725
+
1726
+ //print_ndloop(lp);
1674
1727
 
1675
1728
  // loop body
1676
1729
  for (i=0;;) {
1677
1730
  for (; i<nd; i++) {
1678
- if (LITER(lp,i,1).idx) {
1679
- LITER(lp,i+1,1).pos = LITER(lp,i,1).pos + LITER(lp,i,1).idx[c[i]];
1731
+ if (LITER(lp,i,0).idx) {
1732
+ LITER(lp,i+1,0).pos = LITER(lp,i,0).pos + LITER(lp,i,0).idx[c[i]];
1680
1733
  } else {
1681
- LITER(lp,i+1,1).pos = LITER(lp,i,1).pos + LITER(lp,i,1).step*c[i];
1734
+ LITER(lp,i+1,0).pos = LITER(lp,i,0).pos + LITER(lp,i,0).step*c[i];
1682
1735
  }
1683
- //LITER(lp,i+1,0).pos = LITER(lp,i,0).pos + c[i];
1684
1736
  if (TYPE(a[i])==T_ARRAY) {
1685
1737
  if (c[i] < (size_t)RARRAY_LEN(a[i])) {
1686
1738
  a[i+1] = RARRAY_AREF(a[i],c[i]);
1687
1739
  } else {
1688
1740
  a[i+1] = Qnil;
1689
1741
  }
1690
- } else { // not Array -- what about narray?
1742
+ } else if (IsNArray(a[i])) {
1743
+ //printf("a[i=%d]=0x%lx\n",i,a[i]);
1744
+ loop_store_subnarray(nf,lp,i,c,a[i]);
1745
+ goto loop_next;
1746
+ } else {
1691
1747
  if (c[i]==0) {
1692
1748
  a[i+1] = a[i];
1693
1749
  } else {
1694
1750
  a[i+1] = Qnil;
1695
1751
  }
1696
1752
  }
1697
- //printf("c[i]=%d, i=%d\n",c[i],i);
1753
+ //printf("c[%d]=%lu\n",i,c[i]);
1698
1754
  }
1699
1755
 
1700
- //printf("a[i]=0x%x, i=%d\n",a[i],i);
1701
- LARG(lp,0).value = a[i];
1702
-
1703
- (*(nf->func))(&(lp->user));
1756
+ //printf("a[i=%d]=0x%lx\n",i,a[i]);
1757
+ if (IsNArray(a[i])) {
1758
+ loop_store_subnarray(nf,lp,i,c,a[i]);
1759
+ } else {
1760
+ LARG(lp,1).value = a[i];
1761
+ (*(nf->func))(&(lp->user));
1762
+ }
1704
1763
 
1764
+ loop_next:
1705
1765
  for (;;) {
1706
1766
  if (i<=0) goto loop_end;
1707
1767
  i--; c[i]++;
@@ -1709,12 +1769,12 @@ loop_rarray_to_narray(ndfunc_t *nf, na_md_loop_t *lp)
1709
1769
  c[i] = 0;
1710
1770
  }
1711
1771
  }
1712
- loop_end:
1772
+ loop_end:
1713
1773
  ;
1714
1774
  }
1715
1775
 
1716
1776
  VALUE
1717
- na_ndloop_cast_rarray_to_narray(ndfunc_t *nf, VALUE rary, VALUE nary)
1777
+ na_ndloop_store_rarray(ndfunc_t *nf, VALUE nary, VALUE rary)
1718
1778
  {
1719
1779
  na_md_loop_t lp;
1720
1780
  VALUE args;
@@ -1722,20 +1782,20 @@ na_ndloop_cast_rarray_to_narray(ndfunc_t *nf, VALUE rary, VALUE nary)
1722
1782
  //rb_p(args);
1723
1783
  if (na_debug_flag) print_ndfunc(nf);
1724
1784
 
1725
- args = rb_assoc_new(rary,nary);
1785
+ args = rb_assoc_new(nary,rary);
1726
1786
 
1727
1787
  // cast arguments to NArray
1728
1788
  //ndloop_cast_args(nf, args);
1729
1789
 
1730
1790
  // allocate ndloop struct
1731
- ndloop_alloc(&lp, nf, args, NULL, 0, loop_rarray_to_narray);
1791
+ ndloop_alloc(&lp, nf, args, NULL, 0, loop_store_rarray);
1732
1792
 
1733
1793
  return rb_ensure(ndloop_run, (VALUE)&lp, ndloop_release, (VALUE)&lp);
1734
1794
  }
1735
1795
 
1736
1796
 
1737
1797
  VALUE
1738
- na_ndloop_cast_rarray_to_narray2(ndfunc_t *nf, VALUE rary, VALUE nary, VALUE opt)
1798
+ na_ndloop_store_rarray2(ndfunc_t *nf, VALUE nary, VALUE rary, VALUE opt)
1739
1799
  {
1740
1800
  na_md_loop_t lp;
1741
1801
  VALUE args;
@@ -1744,13 +1804,13 @@ na_ndloop_cast_rarray_to_narray2(ndfunc_t *nf, VALUE rary, VALUE nary, VALUE opt
1744
1804
  if (na_debug_flag) print_ndfunc(nf);
1745
1805
 
1746
1806
  //args = rb_assoc_new(rary,nary);
1747
- args = rb_ary_new3(3,rary,nary,opt);
1807
+ args = rb_ary_new3(3,nary,rary,opt);
1748
1808
 
1749
1809
  // cast arguments to NArray
1750
1810
  //ndloop_cast_args(nf, args);
1751
1811
 
1752
1812
  // allocate ndloop struct
1753
- ndloop_alloc(&lp, nf, args, NULL, 0, loop_rarray_to_narray);
1813
+ ndloop_alloc(&lp, nf, args, NULL, 0, loop_store_rarray);
1754
1814
 
1755
1815
  return rb_ensure(ndloop_run, (VALUE)&lp, ndloop_release, (VALUE)&lp);
1756
1816
  }
@@ -2,11 +2,6 @@
2
2
  intern.h
3
3
  Numerical Array Extension for Ruby
4
4
  (C) Copyright 1999-2016 by Masahiro TANAKA
5
-
6
- This program is free software.
7
- You can distribute/modify this program
8
- under the same terms as Ruby itself.
9
- NO WARRANTY.
10
5
  */
11
6
  #ifndef INTERN_H
12
7
  #define INTERN_H
@@ -24,6 +19,7 @@ VALUE na_expand_dims(VALUE self, VALUE vdim);
24
19
  VALUE na_reduce_dimension(int argc, VALUE *argv, int naryc, VALUE *naryv);
25
20
 
26
21
  VALUE na_check_ladder(VALUE self, int start_dim);
22
+ VALUE na_check_contiguous(VALUE self);
27
23
  void na_setup_shape(narray_t *na, int ndim, size_t *shape);
28
24
 
29
25
  VALUE na_transpose_map(VALUE self, int *map);
@@ -70,8 +66,8 @@ VALUE na_ndloop3(ndfunc_t *nf, void *ptr, int argc, ...);
70
66
  VALUE na_ndloop4(ndfunc_t *nf, void *ptr, VALUE args);
71
67
 
72
68
  VALUE na_ndloop_cast_narray_to_rarray(ndfunc_t *nf, VALUE nary, VALUE fmt);
73
- VALUE na_ndloop_cast_rarray_to_narray(ndfunc_t *nf, VALUE rary, VALUE nary);
74
- VALUE na_ndloop_cast_rarray_to_narray2(ndfunc_t *nf, VALUE rary, VALUE nary, VALUE opt);
69
+ VALUE na_ndloop_store_rarray(ndfunc_t *nf, VALUE nary, VALUE rary);
70
+ VALUE na_ndloop_store_rarray2(ndfunc_t *nf, VALUE nary, VALUE rary, VALUE opt);
75
71
 
76
72
  VALUE na_ndloop_inspect(VALUE nary, na_text_func_t func, VALUE opt);
77
73
 
@@ -103,10 +99,10 @@ VALUE nary_init_accum_aref0(VALUE self, VALUE reduce);
103
99
  VALUE nary_mathcast(int argc, VALUE *argv);
104
100
 
105
101
 
106
- ssize_t
107
- na_get_scalar_position(VALUE self, int argc, VALUE *argv, ssize_t stride);
102
+ int
103
+ na_get_result_dimension(VALUE self, int argc, VALUE *argv, ssize_t stride, size_t *pos_idx);
108
104
  VALUE
109
- na_aref_main(int nidx, VALUE *idx, VALUE self, int keep_dim);
105
+ na_aref_main(int nidx, VALUE *idx, VALUE self, int keep_dim, int nd);
110
106
 
111
107
 
112
108
  #endif /* ifndef INTERN_H */
@@ -2,17 +2,12 @@
2
2
  narray.h
3
3
  Numerical Array Extension for Ruby
4
4
  (C) Copyright 1999-2016 by Masahiro TANAKA
5
-
6
- This program is free software.
7
- You can distribute/modify this program
8
- under the same terms as Ruby itself.
9
- NO WARRANTY.
10
5
  */
11
6
  #ifndef NARRAY_H
12
7
  #define NARRAY_H
13
8
 
14
- #define NARRAY_VERSION "0.9.0.3"
15
- #define NARRAY_VERSION_CODE 903
9
+ #define NARRAY_VERSION "0.9.0.4"
10
+ #define NARRAY_VERSION_CODE 904
16
11
 
17
12
  #include <math.h>
18
13
  #include "numo/compat.h"
@@ -94,7 +89,7 @@
94
89
  # endif
95
90
  #elif SIZEOF_INT==4
96
91
  # define NUM2INT32(x) NUM2INT(x)
97
- # define INT322NUM(x) UINT2NUM(x)
92
+ # define INT322NUM(x) INT2NUM(x)
98
93
  # define NUM2UINT32(x) NUM2UINT(x)
99
94
  # define UINT322NUM(x) UINT2NUM(x)
100
95
  # ifndef PRId32
@@ -201,6 +196,7 @@ typedef struct RNArrayView {
201
196
  } narray_view_t;
202
197
 
203
198
 
199
+ // filemap is unimplemented
204
200
  typedef struct RNArrayFileMap {
205
201
  narray_t base;
206
202
  char *ptr;
@@ -239,7 +235,7 @@ _na_get_narray_t(VALUE obj, unsigned char na_type)
239
235
  Check_Type(obj, T_DATA);
240
236
  na = (narray_t*)DATA_PTR(obj);
241
237
  if (na->type != na_type) {
242
- rb_bug("unknown type 0x%x (0x%x given)", na_type, na->type);
238
+ rb_bug("unknown type 0x%x (0x%x given)", na_type, na->type);
243
239
  }
244
240
  return na;
245
241
  }
@@ -260,38 +256,46 @@ _na_get_narray_t(VALUE obj, unsigned char na_type)
260
256
  #define SDX_SET_STRIDE(x,s) ((x).stride=((s)<<1)|0x1)
261
257
  #define SDX_SET_INDEX(x,idx) ((x).index=idx)
262
258
 
263
- #define RNARRAY(val) ((narray_t*)DATA_PTR(val))
264
- #define RNARRAY_DATA(val) ((narray_data_t*)DATA_PTR(val))
265
- #define RNARRAY_VIEW(val) ((narray_view_t*)DATA_PTR(val))
266
- #define RNARRAY_FILEMAP(val) ((narray_filemap_t*)DATA_PTR(val))
259
+ #define RNARRAY(val) ((narray_t*)DATA_PTR(val))
260
+ #define RNARRAY_DATA(val) ((narray_data_t*)DATA_PTR(val))
261
+ #define RNARRAY_VIEW(val) ((narray_view_t*)DATA_PTR(val))
262
+ #define RNARRAY_FILEMAP(val) ((narray_filemap_t*)DATA_PTR(val))
267
263
 
268
- #define RNARRAY_NDIM(val) (RNARRAY(val)->ndim)
269
- #define RNARRAY_TYPE(val) (RNARRAY(val)->type)
270
- #define RNARRAY_FLAG(val) (RNARRAY(val)->flag)
271
- #define RNARRAY_SIZE(val) (RNARRAY(val)->size)
272
- #define RNARRAY_SHAPE(val) (RNARRAY(val)->shape)
273
- #define RNARRAY_REDUCE(val) (RNARRAY(val)->reduce)
264
+ #define RNARRAY_NDIM(val) (RNARRAY(val)->ndim)
265
+ #define RNARRAY_TYPE(val) (RNARRAY(val)->type)
266
+ #define RNARRAY_FLAG(val) (RNARRAY(val)->flag)
267
+ #define RNARRAY_SIZE(val) (RNARRAY(val)->size)
268
+ #define RNARRAY_SHAPE(val) (RNARRAY(val)->shape)
269
+ #define RNARRAY_REDUCE(val) (RNARRAY(val)->reduce)
274
270
 
275
- #define RNARRAY_DATA_PTR(val) (RNARRAY_DATA(val)->ptr)
276
- #define RNARRAY_VIEW_DATA(val) (RNARRAY_VIEW(val)->data)
271
+ #define RNARRAY_DATA_PTR(val) (RNARRAY_DATA(val)->ptr)
272
+ #define RNARRAY_VIEW_DATA(val) (RNARRAY_VIEW(val)->data)
277
273
  #define RNARRAY_VIEW_OFFSET(val) (RNARRAY_VIEW(val)->offset)
278
274
  #define RNARRAY_VIEW_STRIDX(val) (RNARRAY_VIEW(val)->stridx)
279
275
 
280
- #define NA_NDIM(na) (((narray_t*)na)->ndim)
281
- #define NA_TYPE(na) (((narray_t*)na)->type)
282
- #define NA_FLAG(na) (((narray_t*)na)->flag)
283
- #define NA_FLAG0(na) (((narray_t*)na)->flag[0])
284
- #define NA_FLAG1(na) (((narray_t*)na)->flag[1])
285
- #define NA_SIZE(na) (((narray_t*)na)->size)
286
- #define NA_SHAPE(na) (((narray_t*)na)->shape)
287
- #define NA_REDUCE(na) (((narray_t*)na)->reduce)
276
+ #define NA_NDIM(na) (((narray_t*)na)->ndim)
277
+ #define NA_TYPE(na) (((narray_t*)na)->type)
278
+ #define NA_SIZE(na) (((narray_t*)na)->size)
279
+ #define NA_SHAPE(na) (((narray_t*)na)->shape)
280
+ #define NA_REDUCE(na) (((narray_t*)na)->reduce)
281
+
282
+ #define NA_FLAG(obj) (na_get_narray_t(obj)->flag)
283
+ #define NA_FLAG0(obj) (NA_FLAG(obj)[0])
284
+ #define NA_FLAG1(obj) (NA_FLAG(obj)[1])
285
+
286
+ #define NA_DATA(na) ((narray_data_t*)(na))
287
+ #define NA_VIEW(na) ((narray_view_t*)(na))
288
+ #define NA_DATA_PTR(na) (NA_DATA(na)->ptr)
289
+ #define NA_VIEW_DATA(na) (NA_VIEW(na)->data)
290
+ #define NA_VIEW_OFFSET(na) (NA_VIEW(na)->offset)
291
+ #define NA_VIEW_STRIDX(na) (NA_VIEW(na)->stridx)
288
292
 
289
- #define NA_DATA_PTR(na) (((narray_data_t*)na)->ptr)
290
- #define NA_VIEW_DATA(na) (((narray_view_t*)na)->data)
291
- #define NA_VIEW_OFFSET(na) (((narray_view_t*)na)->offset)
292
- #define NA_VIEW_STRIDX(na) (((narray_view_t*)na)->stridx)
293
+ #define NA_IS_INDEX_AT(na,i) (SDX_IS_INDEX(NA_VIEW_STRIDX(na)[i]))
294
+ #define NA_IS_STRIDE_AT(na,i) (SDX_IS_STRIDE(NA_VIEW_STRIDX(na)[i]))
295
+ #define NA_INDEX_AT(na,i) (SDX_GET_INDEX(NA_VIEW_STRIDX(na)[i]))
296
+ #define NA_STRIDE_AT(na,i) (SDX_GET_STRIDE(NA_VIEW_STRIDX(na)[i]))
293
297
 
294
- #define NA_FILEMAP_PTR(na) (((narray_filemap_t*)na)->ptr)
298
+ #define NA_FILEMAP_PTR(na) (((narray_filemap_t*)na)->ptr)
295
299
 
296
300
 
297
301
  #define NA_FL0_TEST(x,f) (NA_FLAG0(x)&(f))
@@ -306,10 +310,6 @@ _na_get_narray_t(VALUE obj, unsigned char na_type)
306
310
  #define NA_FL0_REVERSE(x,f) do {NA_FLAG0(x) ^= (f);} while(0)
307
311
  #define NA_FL1_REVERSE(x,f) do {NA_FLAG1(x) ^= (f);} while(0)
308
312
 
309
- #define NA_TEST_LOCK(x) NA_FL0_TEST(x,NA_FL_LOCK)
310
- #define NA_SET_LOCK(x) NA_FL0_SET(x,NA_FL_LOCK)
311
- #define NA_UNSET_LOCK(x) NA_FL0_UNSET(x,NA_FL_LOCK)
312
-
313
313
 
314
314
  /* FLAGS
315
315
  - row-major / column-major
@@ -319,31 +319,60 @@ _na_get_narray_t(VALUE obj, unsigned char na_type)
319
319
  - matrix or not
320
320
  */
321
321
 
322
- #define NA_FL_LOCK (0x1<<0)
323
- #define NA_FL_COLUMN_MAJOR (0x1<<1)
324
- #define NA_FL_BYTE_SWAPPED (0x1<<2)
325
- #define NA_FL_INPLACE (0x1<<3)
322
+ #define NA_FL0_BIG_ENDIAN (0x1<<0)
323
+ #define NA_FL0_COLUMN_MAJOR (0x1<<1)
324
+ #define NA_FL1_LOCK (0x1<<0)
325
+ #define NA_FL1_INPLACE (0x1<<1)
326
+
327
+ #define TEST_COLUMN_MAJOR(x) NA_FL0_TEST(x,NA_FL0_COLUMN_MAJOR)
328
+ #define SET_COLUMN_MAJOR(x) NA_FL0_SET(x,NA_FL0_COLUMN_MAJOR)
329
+ #define UNSET_COLUMN_MAJOR(x) NA_FL0_UNSET(x,NA_FL0_COLUMN_MAJOR)
326
330
 
327
- #define TEST_COLUMN_MAJOR(x) NA_FL0_TEST(x,NA_FL_COLUMN_MAJOR)
328
- #define TEST_ROW_MAJOR(x) (!NA_FL0_TEST(x,NA_FL_COLUMN_MAJOR))
329
- #define TEST_BYTE_SWAPPED(x) NA_FL0_TEST(x,NA_FL_BYTE_SWAPPED)
330
- #define TEST_HOST_ORDER(x) (!TEST_BYTE_SWAPPED(x))
331
+ #define TEST_ROW_MAJOR(x) (!TEST_COLUMN_MAJOR(x))
332
+ #define SET_ROW_MAJOR(x) UNSET_COLUMN_MAJOR(x)
333
+ #define UNSET_ROW_MAJOR(x) SET_COLUMN_MAJOR(x)
331
334
 
332
- #define TEST_INPLACE(x) NA_FL0_TEST(x,NA_FL_INPLACE)
333
- #define SET_INPLACE(x) NA_FL0_SET(x,NA_FL_INPLACE)
334
- #define UNSET_INPLACE(x) NA_FL0_UNSET(x,NA_FL_INPLACE)
335
+ #define TEST_BIG_ENDIAN(x) NA_FL0_TEST(x,NA_FL0_BIG_ENDIAN)
336
+ #define SET_BIG_ENDIAN(x) NA_FL0_SET(x,NA_FL0_BIG_ENDIAN)
337
+ #define UNSET_BIG_ENDIAN(x) NA_FL0_UNSET(x,NA_FL0_BIG_ENDIAN)
335
338
 
336
- #define REVERSE_BYTE_SWAPPED(x) NA_FL0_REVERSE((x),NA_FL_BYTE_SWAPPED)
339
+ #define TEST_LITTLE_ENDIAN(x) (!TEST_BIG_ENDIAN(x))
340
+ #define SET_LITTLE_ENDIAN(x) UNSET_BIG_ENDIAN(x)
341
+ #define UNSET_LITTLE_ENDIAN(x) SET_BIG_ENDIAN(x)
342
+
343
+ #define REVERSE_ENDIAN(x) NA_FL0_REVERSE((x),NA_FL0_BIG_ENDIAN)
344
+
345
+ #define TEST_LOCK(x) NA_FL1_TEST(x,NA_FL1_LOCK)
346
+ #define SET_LOCK(x) NA_FL1_SET(x,NA_FL1_LOCK)
347
+ #define UNSET_LOCK(x) NA_FL1_UNSET(x,NA_FL1_LOCK)
348
+
349
+ #define TEST_INPLACE(x) NA_FL1_TEST(x,NA_FL1_INPLACE)
350
+ #define SET_INPLACE(x) NA_FL1_SET(x,NA_FL1_INPLACE)
351
+ #define UNSET_INPLACE(x) NA_FL1_UNSET(x,NA_FL1_INPLACE)
337
352
 
338
353
  #ifdef DYNAMIC_ENDIAN
354
+ // not supported
339
355
  #else
340
356
  #ifdef WORDS_BIGENDIAN
341
- #else // LITTLE_ENDIAN
342
-
343
- #define TEST_NETWORK_ORDER(x) TEST_BYTE_SWAPPED(x)
344
- #define TEST_VACS_ORDER(x) TEST_HOST_ORDER(x)
357
+ #define TEST_HOST_ORDER(x) TEST_BIG_ENDIAN(x)
358
+ #define SET_HOST_ORDER(x) SET_BIG_ENDIAN(x)
359
+ #define UNSET_HOST_ORDER(x) UNSET_BIG_ENDIAN(x)
360
+ #define TEST_BYTE_SWAPPED(x) TEST_LITTLE_ENDIAN(x)
361
+ #define SET_BYTE_SWAPPED(x) SET_LITTLE_ENDIAN(x)
362
+ #define UNSET_BYTE_SWAPPED(x) UNSET_LITTLE_ENDIAN(x)
363
+ #define NA_FL0_INIT NA_FL0_BIG_ENDIAN
364
+ #else // LITTLE ENDIAN
365
+ #define TEST_HOST_ORDER(x) TEST_LITTLE_ENDIAN(x)
366
+ #define SET_HOST_ORDER(x) SET_LITTLE_ENDIAN(x)
367
+ #define UNSET_HOST_ORDER(x) UNSET_LITTLE_ENDIAN(x)
368
+ #define TEST_BYTE_SWAPPED(x) TEST_BIG_ENDIAN(x)
369
+ #define SET_BYTE_SWAPPED(x) SET_BIG_ENDIAN(x)
370
+ #define UNSET_BYTE_SWAPPED(x) UNSET_BIG_ENDIAN(x)
371
+ #define NA_FL0_INIT 0
345
372
  #endif
346
373
  #endif
374
+ #define NA_FL1_INIT 0
375
+
347
376
 
348
377
  #define IsNArray(obj) (rb_obj_is_kind_of(obj,cNArray)==Qtrue)
349
378