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.
- checksums.yaml +4 -4
- data/README.md +12 -6
- data/Rakefile +2 -10
- data/ext/numo/narray/array.c +1 -6
- data/ext/numo/narray/data.c +3 -9
- data/ext/numo/narray/depend.erb +1 -1
- data/ext/numo/narray/extconf.rb +0 -1
- data/ext/numo/narray/gen/def/bit.rb +2 -0
- data/ext/numo/narray/gen/def/dcomplex.rb +2 -0
- data/ext/numo/narray/gen/def/dfloat.rb +2 -0
- data/ext/numo/narray/gen/def/int16.rb +2 -0
- data/ext/numo/narray/gen/def/int32.rb +2 -0
- data/ext/numo/narray/gen/def/int64.rb +2 -0
- data/ext/numo/narray/gen/def/int8.rb +2 -0
- data/ext/numo/narray/gen/def/robject.rb +2 -0
- data/ext/numo/narray/gen/def/scomplex.rb +2 -0
- data/ext/numo/narray/gen/def/sfloat.rb +2 -0
- data/ext/numo/narray/gen/def/uint16.rb +2 -0
- data/ext/numo/narray/gen/def/uint32.rb +2 -0
- data/ext/numo/narray/gen/def/uint64.rb +2 -0
- data/ext/numo/narray/gen/def/uint8.rb +2 -0
- data/ext/numo/narray/gen/dtype.erb.c +7 -7
- data/ext/numo/narray/gen/spec.rb +24 -2
- data/ext/numo/narray/gen/tmpl/accum_binary.c +6 -0
- data/ext/numo/narray/gen/tmpl/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl/binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/binary2.c +4 -0
- data/ext/numo/narray/gen/tmpl/bincount.c +180 -0
- data/ext/numo/narray/gen/tmpl/cast.c +4 -0
- data/ext/numo/narray/gen/tmpl/cast_array.c +3 -64
- data/ext/numo/narray/gen/tmpl/cond_binary.c +4 -0
- data/ext/numo/narray/gen/tmpl/inspect.c +4 -0
- data/ext/numo/narray/gen/tmpl/pow.c +4 -0
- data/ext/numo/narray/gen/tmpl/qsort.c +1 -7
- data/ext/numo/narray/gen/tmpl/rand.c +13 -2
- data/ext/numo/narray/gen/tmpl/rand_norm.c +89 -16
- data/ext/numo/narray/gen/tmpl/store.c +4 -0
- data/ext/numo/narray/gen/tmpl/store_array.c +99 -2
- data/ext/numo/narray/gen/tmpl_bit/allocate.c +1 -1
- data/ext/numo/narray/gen/tmpl_bit/aref.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/aset.c +6 -4
- data/ext/numo/narray/gen/tmpl_bit/cast_array.c +3 -65
- data/ext/numo/narray/gen/tmpl_bit/mask.c +16 -1
- data/ext/numo/narray/gen/tmpl_bit/store_array.c +101 -2
- data/ext/numo/narray/gen/tmpl_bit/where.c +7 -23
- data/ext/numo/narray/gen/tmpl_bit/where2.c +58 -4
- data/ext/numo/narray/index.c +168 -166
- data/ext/numo/narray/kwarg.c +1 -6
- data/ext/numo/narray/math.c +8 -12
- data/ext/numo/narray/narray.c +231 -71
- data/ext/numo/narray/ndloop.c +86 -26
- data/ext/numo/narray/numo/intern.h +6 -10
- data/ext/numo/narray/numo/narray.h +83 -54
- data/ext/numo/narray/numo/ndloop.h +0 -5
- data/ext/numo/narray/numo/template.h +0 -5
- data/ext/numo/narray/numo/types/complex.h +1 -6
- data/ext/numo/narray/numo/types/complex_macro.h +30 -3
- data/ext/numo/narray/numo/types/dcomplex.h +18 -0
- data/ext/numo/narray/numo/types/dfloat.h +18 -0
- data/ext/numo/narray/numo/types/float_macro.h +25 -2
- data/ext/numo/narray/numo/types/robj_macro.h +2 -4
- data/ext/numo/narray/numo/types/scomplex.h +18 -0
- data/ext/numo/narray/numo/types/sfloat.h +18 -0
- data/ext/numo/narray/rand.c +0 -15
- data/ext/numo/narray/step.c +0 -5
- data/ext/numo/narray/struct.c +7 -12
- data/lib/erbpp/line_number.rb +4 -4
- data/lib/erbpp/narray_def.rb +16 -7
- data/lib/numo/narray.rb +2 -0
- data/lib/numo/narray/extra.rb +465 -0
- data/numo-narray.gemspec +2 -2
- data/spec/narray_spec.rb +4 -3
- metadata +13 -7
- data/ext/numo/narray/gen/tmpl/head.c +0 -25
@@ -61,10 +61,15 @@ static VALUE
|
|
61
61
|
static VALUE
|
62
62
|
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
63
63
|
{
|
64
|
+
<% if !is_object %>
|
64
65
|
VALUE klass, v;
|
66
|
+
<% end %>
|
65
67
|
if (argc < 1) {
|
66
68
|
rb_raise(rb_eArgError,"wrong number of arguments (%d for >=1)",argc);
|
67
69
|
}
|
70
|
+
<% if is_object %>
|
71
|
+
return <%=c_func%>_self(argc, argv, self);
|
72
|
+
<% else %>
|
68
73
|
klass = na_upcast(CLASS_OF(self),CLASS_OF(argv[0]));
|
69
74
|
if (klass==cT) {
|
70
75
|
return <%=c_func%>_self(argc, argv, self);
|
@@ -72,4 +77,5 @@ static VALUE
|
|
72
77
|
v = rb_funcall(klass, id_cast, 1, self);
|
73
78
|
return rb_funcall2(v, rb_intern("<%=method%>"), argc, argv);
|
74
79
|
}
|
80
|
+
<% end %>
|
75
81
|
}
|
@@ -9,6 +9,7 @@
|
|
9
9
|
+dim0+, +dim1+, ... includes other than Numeric index, e.g., Range
|
10
10
|
or Array or true.
|
11
11
|
|
12
|
+
@example
|
12
13
|
a = Numo::DFloat.new(4,5).seq
|
13
14
|
=> Numo::DFloat#shape=[4,5]
|
14
15
|
[[0, 1, 2, 3, 4],
|
@@ -38,12 +39,13 @@
|
|
38
39
|
static VALUE
|
39
40
|
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
40
41
|
{
|
41
|
-
|
42
|
+
int nd;
|
43
|
+
size_t pos;
|
42
44
|
char *ptr;
|
43
45
|
|
44
|
-
|
45
|
-
if (
|
46
|
-
return na_aref_main(argc, argv, self, 0);
|
46
|
+
nd = na_get_result_dimension(self, argc, argv, sizeof(dtype), &pos);
|
47
|
+
if (nd) {
|
48
|
+
return na_aref_main(argc, argv, self, 0, nd);
|
47
49
|
} else {
|
48
50
|
ptr = na_get_pointer_for_read(self) + pos;
|
49
51
|
return m_extract(ptr);
|
@@ -8,6 +8,7 @@
|
|
8
8
|
--- Replace element(s) at +dim0+, +dim1+, ... (index/range/array/true
|
9
9
|
for each dimention). Broadcasting mechanism is applied.
|
10
10
|
|
11
|
+
@example
|
11
12
|
a = Numo::DFloat.new(3,4).seq
|
12
13
|
=> Numo::DFloat#shape=[3,4]
|
13
14
|
[[0, 1, 2, 3],
|
@@ -39,7 +40,8 @@
|
|
39
40
|
static VALUE
|
40
41
|
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
41
42
|
{
|
42
|
-
|
43
|
+
int nd;
|
44
|
+
size_t pos;
|
43
45
|
char *ptr;
|
44
46
|
VALUE a;
|
45
47
|
|
@@ -47,9 +49,9 @@ static VALUE
|
|
47
49
|
if (argc==0) {
|
48
50
|
<%=c_func.sub(/_aset/,"_store")%>(self, argv[argc]);
|
49
51
|
} else {
|
50
|
-
|
51
|
-
if (
|
52
|
-
a = na_aref_main(argc, argv, self, 0);
|
52
|
+
nd = na_get_result_dimension(self, argc, argv, sizeof(dtype), &pos);
|
53
|
+
if (nd) {
|
54
|
+
a = na_aref_main(argc, argv, self, 0, nd);
|
53
55
|
<%=c_func.sub(/_aset/,"_store")%>(a, argv[argc]);
|
54
56
|
} else {
|
55
57
|
ptr = na_get_pointer_for_read_write(self) + pos;
|
@@ -42,6 +42,9 @@ static VALUE
|
|
42
42
|
static VALUE
|
43
43
|
<%=c_func%>(VALUE self, VALUE other)
|
44
44
|
{
|
45
|
+
<% if is_object %>
|
46
|
+
return <%=c_func%>_self(self, other);
|
47
|
+
<% else %>
|
45
48
|
VALUE klass, v;
|
46
49
|
klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
|
47
50
|
if (klass==cT) {
|
@@ -50,4 +53,5 @@ static VALUE
|
|
50
53
|
v = rb_funcall(klass, id_cast, 1, self);
|
51
54
|
return rb_funcall(v, <%=id_op%>, 1, other);
|
52
55
|
}
|
56
|
+
<% end %>
|
53
57
|
}
|
@@ -44,6 +44,9 @@ static VALUE
|
|
44
44
|
static VALUE
|
45
45
|
<%=c_func%>(VALUE self, VALUE other)
|
46
46
|
{
|
47
|
+
<% if is_object %>
|
48
|
+
return <%=c_func%>_self(self, other);
|
49
|
+
<% else %>
|
47
50
|
VALUE klass, v;
|
48
51
|
klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
|
49
52
|
if (klass==cT) {
|
@@ -52,4 +55,5 @@ static VALUE
|
|
52
55
|
v = rb_funcall(klass, id_cast, 1, self);
|
53
56
|
return rb_funcall(v, <%=id_op%>, 1, other);
|
54
57
|
}
|
58
|
+
<% end %>
|
55
59
|
}
|
@@ -0,0 +1,180 @@
|
|
1
|
+
// ------- Integer count without weights -------
|
2
|
+
<%
|
3
|
+
[32,64].each do |bits|
|
4
|
+
cnt_cT = "numo_cUInt#{bits}"
|
5
|
+
cnt_type = "u_int#{bits}_t"
|
6
|
+
%>
|
7
|
+
static void
|
8
|
+
<%=c_iter%>_<%=bits%>(na_loop_t *const lp)
|
9
|
+
{
|
10
|
+
size_t i, x, n;
|
11
|
+
char *p1, *p2;
|
12
|
+
ssize_t s1, s2;
|
13
|
+
size_t *idx1;
|
14
|
+
|
15
|
+
INIT_PTR_IDX(lp, 0, p1, s1, idx1);
|
16
|
+
INIT_PTR(lp, 1, p2, s2);
|
17
|
+
i = lp->args[0].shape[0];
|
18
|
+
n = lp->args[1].shape[0];
|
19
|
+
|
20
|
+
// initialize
|
21
|
+
for (x=0; x < n; x++) {
|
22
|
+
*(<%=cnt_type%>*)(p2 + s2*x) = 0;
|
23
|
+
}
|
24
|
+
|
25
|
+
if (idx1) {
|
26
|
+
for (; i--;) {
|
27
|
+
GET_DATA_INDEX(p1,idx1,dtype,x);
|
28
|
+
(*(<%=cnt_type%>*)(p2 + s2*x))++;
|
29
|
+
}
|
30
|
+
} else {
|
31
|
+
for (; i--;) {
|
32
|
+
GET_DATA_STRIDE(p1,s1,dtype,x);
|
33
|
+
(*(<%=cnt_type%>*)(p2 + s2*x))++;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
static VALUE
|
39
|
+
<%=c_func%>_<%=bits%>(VALUE self, size_t length)
|
40
|
+
{
|
41
|
+
size_t shape_out[1] = {length};
|
42
|
+
ndfunc_arg_in_t ain[1] = {{cT,1}};
|
43
|
+
ndfunc_arg_out_t aout[1] = {{<%=cnt_cT%>,1,shape_out}};
|
44
|
+
ndfunc_t ndf = {<%=c_iter%>_<%=bits%>, NO_LOOP|NDF_STRIDE_LOOP|NDF_INDEX_LOOP,
|
45
|
+
1, 1, ain, aout};
|
46
|
+
|
47
|
+
return na_ndloop(&ndf, 1, self);
|
48
|
+
}
|
49
|
+
<% end %>
|
50
|
+
// ------- end of Integer count without weights -------
|
51
|
+
|
52
|
+
// ------- Float count with weights -------
|
53
|
+
<%
|
54
|
+
[["SF","float"],
|
55
|
+
["DF","double"]].each do |fn,cnt_type|
|
56
|
+
cnt_cT = "numo_c#{fn}loat"
|
57
|
+
fn = fn.downcase
|
58
|
+
%>
|
59
|
+
static void
|
60
|
+
<%=c_iter%>_<%=fn%>(na_loop_t *const lp)
|
61
|
+
{
|
62
|
+
<%=cnt_type%> w;
|
63
|
+
size_t i, x, n, m;
|
64
|
+
char *p1, *p2, *p3;
|
65
|
+
ssize_t s1, s2, s3;
|
66
|
+
|
67
|
+
INIT_PTR(lp, 0, p1, s1);
|
68
|
+
INIT_PTR(lp, 1, p2, s2);
|
69
|
+
INIT_PTR(lp, 2, p3, s3);
|
70
|
+
i = lp->args[0].shape[0];
|
71
|
+
m = lp->args[1].shape[0];
|
72
|
+
n = lp->args[2].shape[0];
|
73
|
+
|
74
|
+
if (i != m) {
|
75
|
+
rb_raise(nary_eShapeError,
|
76
|
+
"size mismatch along last axis between self and weight");
|
77
|
+
}
|
78
|
+
|
79
|
+
// initialize
|
80
|
+
for (x=0; x < n; x++) {
|
81
|
+
*(<%=cnt_type%>*)(p3 + s3*x) = 0;
|
82
|
+
}
|
83
|
+
for (; i--;) {
|
84
|
+
GET_DATA_STRIDE(p1,s1,dtype,x);
|
85
|
+
GET_DATA_STRIDE(p2,s2,<%=cnt_type%>,w);
|
86
|
+
(*(<%=cnt_type%>*)(p3 + s3*x)) += w;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
static VALUE
|
91
|
+
<%=c_func%>_<%=fn%>(VALUE self, VALUE weight, size_t length)
|
92
|
+
{
|
93
|
+
size_t shape_out[1] = {length};
|
94
|
+
ndfunc_arg_in_t ain[2] = {{cT,1},{<%=cnt_cT%>,1}};
|
95
|
+
ndfunc_arg_out_t aout[1] = {{<%=cnt_cT%>,1,shape_out}};
|
96
|
+
ndfunc_t ndf = {<%=c_iter%>_<%=fn%>, NO_LOOP|NDF_STRIDE_LOOP,
|
97
|
+
2, 1, ain, aout};
|
98
|
+
|
99
|
+
return na_ndloop(&ndf, 2, self, weight);
|
100
|
+
}
|
101
|
+
<% end %>
|
102
|
+
// ------- end of Float count with weights -------
|
103
|
+
|
104
|
+
/*
|
105
|
+
Count the number of occurrences of each non-negative integer value.
|
106
|
+
Only Integer-types has this method.
|
107
|
+
|
108
|
+
@overload <%=method%>([weight], minlength:nil)
|
109
|
+
@param [SFloat or DFloat or Array] weight (optional) Array of
|
110
|
+
float values. Its size along last axis should be same as that of self.
|
111
|
+
@param [Integer] minlength (keyword, optional) Minimum size along
|
112
|
+
last axis for the output array.
|
113
|
+
@return [UInt32 or UInt64 or SFloat or DFloat]
|
114
|
+
Returns Float NArray if weight array is supplied,
|
115
|
+
otherwise returns UInt32 or UInt64 depending on the size along last axis.
|
116
|
+
@example
|
117
|
+
Numo::Int32[0..4].bincount
|
118
|
+
=> Numo::UInt32#shape=[5]
|
119
|
+
[1, 1, 1, 1, 1]
|
120
|
+
|
121
|
+
Numo::Int32[0, 1, 1, 3, 2, 1, 7].bincount
|
122
|
+
=> Numo::UInt32#shape=[8]
|
123
|
+
[1, 3, 1, 1, 0, 0, 0, 1]
|
124
|
+
|
125
|
+
x = Numo::Int32[0, 1, 1, 3, 2, 1, 7, 23]
|
126
|
+
x.bincount.size == x.max+1
|
127
|
+
=> true
|
128
|
+
|
129
|
+
w = Numo::DFloat[0.3, 0.5, 0.2, 0.7, 1.0, -0.6]
|
130
|
+
x = Numo::Int32[0, 1, 1, 2, 2, 2]
|
131
|
+
x.bincount(w)
|
132
|
+
=> Numo::DFloat#shape=[3]
|
133
|
+
[0.3, 0.7, 1.1]
|
134
|
+
|
135
|
+
*/
|
136
|
+
static VALUE
|
137
|
+
<%=c_func%>(int argc, VALUE *argv, VALUE self)
|
138
|
+
{
|
139
|
+
VALUE weight=Qnil, kw=Qnil;
|
140
|
+
VALUE opts[1] = {Qundef};
|
141
|
+
VALUE v, wclass;
|
142
|
+
ID table[1] = {id_minlength};
|
143
|
+
size_t length, minlength;
|
144
|
+
|
145
|
+
rb_scan_args(argc, argv, "01:", &weight, &kw);
|
146
|
+
rb_get_kwargs(kw, table, 0, 1, opts);
|
147
|
+
|
148
|
+
<% if is_unsigned %>
|
149
|
+
v = numo_<%=type_name%>_max(0,0,self);
|
150
|
+
<% else %>
|
151
|
+
v = numo_<%=type_name%>_minmax(0,0,self);
|
152
|
+
if (m_num_to_data(RARRAY_AREF(v,0)) < 0) {
|
153
|
+
rb_raise(rb_eArgError,"array items must be non-netagive");
|
154
|
+
}
|
155
|
+
v = RARRAY_AREF(v,1);
|
156
|
+
<% end %>
|
157
|
+
length = NUM2SIZET(v) + 1;
|
158
|
+
|
159
|
+
if (opts[0] != Qundef) {
|
160
|
+
minlength = NUM2SIZET(opts[0]);
|
161
|
+
if (minlength > length) {
|
162
|
+
length = minlength;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
|
166
|
+
if (NIL_P(weight)) {
|
167
|
+
if (length > 4294967295ul) {
|
168
|
+
return <%=c_func%>_64(self, length);
|
169
|
+
} else {
|
170
|
+
return <%=c_func%>_32(self, length);
|
171
|
+
}
|
172
|
+
} else {
|
173
|
+
wclass = CLASS_OF(weight);
|
174
|
+
if (wclass == numo_cSFloat) {
|
175
|
+
return <%=c_func%>_sf(self, weight, length);
|
176
|
+
} else {
|
177
|
+
return <%=c_func%>_df(self, weight, length);
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
@@ -1,79 +1,18 @@
|
|
1
|
-
static void
|
2
|
-
<%=c_iter%>(na_loop_t *const lp)
|
3
|
-
{
|
4
|
-
size_t i, n;
|
5
|
-
size_t i1, n1;
|
6
|
-
VALUE v1, *ptr;
|
7
|
-
char *p2;
|
8
|
-
size_t s2, *idx2;
|
9
|
-
VALUE x;
|
10
|
-
double y;
|
11
|
-
dtype z;
|
12
|
-
size_t len, c;
|
13
|
-
double beg, step;
|
14
|
-
|
15
|
-
v1 = lp->args[0].value;
|
16
|
-
ptr = &v1;
|
17
|
-
INIT_COUNTER(lp, n);
|
18
|
-
INIT_PTR_IDX(lp, 1, p2, s2, idx2);
|
19
|
-
|
20
|
-
switch(TYPE(v1)) {
|
21
|
-
case T_ARRAY:
|
22
|
-
n1 = RARRAY_LEN(v1);
|
23
|
-
ptr = RARRAY_PTR(v1);
|
24
|
-
break;
|
25
|
-
case T_NIL:
|
26
|
-
n1 = 0;
|
27
|
-
break;
|
28
|
-
default:
|
29
|
-
n1 = 1;
|
30
|
-
}
|
31
|
-
if (idx2) {
|
32
|
-
<% ["SET_DATA_INDEX(p2, idx2, dtype, z)",
|
33
|
-
"SET_DATA_STRIDE(p2, s2, dtype, z)"].each_with_index do |x,i| %>
|
34
|
-
for (i=i1=0; i1<n1 && i<n; i++,i1++) {
|
35
|
-
x = ptr[i1];
|
36
|
-
if (rb_obj_is_kind_of(x, rb_cRange) || rb_obj_is_kind_of(x, na_cStep)) {
|
37
|
-
nary_step_sequence(x,&len,&beg,&step);
|
38
|
-
for (c=0; c<len && i<n; c++,i++) {
|
39
|
-
y = beg + step * c;
|
40
|
-
z = m_from_double(y);
|
41
|
-
<%= x %>
|
42
|
-
}
|
43
|
-
}
|
44
|
-
else if (TYPE(x) != T_ARRAY) {
|
45
|
-
if (x == Qnil) x = INT2FIX(0);
|
46
|
-
z = m_num_to_data(x);
|
47
|
-
<%= x %>
|
48
|
-
}
|
49
|
-
}
|
50
|
-
z = m_zero;
|
51
|
-
for (; i<n; i++) {
|
52
|
-
<%= x %>
|
53
|
-
}
|
54
|
-
<% if i<1 %>
|
55
|
-
} else {
|
56
|
-
<% end
|
57
|
-
end %>
|
58
|
-
}
|
59
|
-
}
|
60
|
-
|
61
1
|
static VALUE
|
62
2
|
<%=c_func%>(VALUE rary)
|
63
3
|
{
|
64
|
-
|
4
|
+
VALUE vnc, nary;
|
65
5
|
narray_t *na;
|
66
6
|
na_compose_t *nc;
|
67
|
-
ndfunc_arg_in_t ain[2] = {{rb_cArray,0},{Qnil,0}};
|
68
|
-
ndfunc_t ndf = { <%=c_iter%>, FULL_LOOP, 2, 0, ain, 0 };
|
69
7
|
|
70
8
|
vnc = na_ary_composition(rary);
|
71
9
|
Data_Get_Struct(vnc, na_compose_t, nc);
|
72
10
|
nary = rb_narray_new(cT, nc->ndim, nc->shape);
|
11
|
+
RB_GC_GUARD(vnc);
|
73
12
|
GetNArray(nary,na);
|
74
13
|
if (na->size > 0) {
|
75
14
|
<%=find_tmpl("allocate").c_func%>(nary);
|
76
|
-
|
15
|
+
<%=find_tmpl("store_array").c_func%>(nary,rary);
|
77
16
|
}
|
78
17
|
return nary;
|
79
18
|
}
|
@@ -40,6 +40,9 @@ static VALUE
|
|
40
40
|
static VALUE
|
41
41
|
<%=c_func%>(VALUE self, VALUE other)
|
42
42
|
{
|
43
|
+
<% if is_object %>
|
44
|
+
return <%=c_func%>_self(self, other);
|
45
|
+
<% else %>
|
43
46
|
VALUE klass, v;
|
44
47
|
klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
|
45
48
|
if (klass==cT) {
|
@@ -48,4 +51,5 @@ static VALUE
|
|
48
51
|
v = rb_funcall(klass, id_cast, 1, self);
|
49
52
|
return rb_funcall(v, id_<%=method%>, 1, other);
|
50
53
|
}
|
54
|
+
<% end %>
|
51
55
|
}
|
@@ -63,6 +63,9 @@ static VALUE
|
|
63
63
|
static VALUE
|
64
64
|
<%=c_func%>(VALUE self, VALUE other)
|
65
65
|
{
|
66
|
+
<% if is_object %>
|
67
|
+
return <%=c_func%>_self(self,other);
|
68
|
+
<% else %>
|
66
69
|
VALUE klass, v;
|
67
70
|
klass = na_upcast(CLASS_OF(self),CLASS_OF(other));
|
68
71
|
if (klass==cT) {
|
@@ -71,4 +74,5 @@ static VALUE
|
|
71
74
|
v = rb_funcall(klass, id_cast, 1, self);
|
72
75
|
return rb_funcall(v, id_pow, 1, other);
|
73
76
|
}
|
77
|
+
<% end %>
|
74
78
|
}
|
@@ -1,12 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
qsort.c
|
3
3
|
Numerical Array Extension for Ruby
|
4
|
-
(C) Copyright 2007-
|
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.
|
4
|
+
(C) Copyright 2007-2016 by Masahiro TANAKA
|
10
5
|
*/
|
11
6
|
|
12
7
|
/*
|
@@ -146,4 +141,3 @@ void
|
|
146
141
|
goto loop;
|
147
142
|
}
|
148
143
|
}
|
149
|
-
|