numo-narray 0.9.0.3 → 0.9.0.4

Sign up to get free protection for your applications and to get access to all the features.
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