summaryrefslogtreecommitdiff
path: root/functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'functions.c')
-rw-r--r--functions.c219
1 files changed, 110 insertions, 109 deletions
diff --git a/functions.c b/functions.c
index 102590d..3112e06 100644
--- a/functions.c
+++ b/functions.c
@@ -1,6 +1,7 @@
#include <u.h>
#include <libc.h>
#include <bio.h>
+#include <thread.h>
#include "apl9.h"
@@ -153,7 +154,7 @@ runfunc(Function f, Array *left, Array *right)
if(dfnres->tag != ArrayTag || result == nil)
result = mkscalarint(0); /* Very stupid */
else
- incarrayref(result);
+ incref(result);
freedatum(dfnres);
}else if(f.type == FunctypePrim){
if(left){
@@ -360,11 +361,11 @@ fnFactorial(Array *right)
Array *result = nil;
if(GetType(right) == AtypeArray){
result = duparrayshape(right, AtypeArray);
- for(int i = 0; i < GetSize(right); i++)
+ for(int i = 0; i < right->size; i++)
result->arraydata[i] = fnFactorial(right->arraydata[i]);
}else if(GetType(right) == AtypeInt){
result = duparrayshape(right, AtypeFloat);
- for(int i = 0; i < GetSize(result); i++){
+ for(int i = 0; i < result->size; i++){
double x = 1;
vlong n = right->intdata[i];
if(n < 0)
@@ -386,21 +387,21 @@ fnRoll(Array *right)
Array *result = nil;
if(GetType(right) == AtypeArray){
result = duparrayshape(right, AtypeArray);
- for(int i = 0; i < GetSize(right); i++)
+ for(int i = 0; i < right->size; i++)
result->arraydata[i] = fnRoll(right->arraydata[i]);
}else if(GetType(right) == AtypeInt){
- if(GetSize(right) == 0)
+ if(right->size == 0)
return duparrayshape(right, AtypeInt);
int io = globalIO();
vlong lowest = right->intdata[0];
- for(int i = 1; i < GetSize(right); i++)
+ for(int i = 1; i < right->size; i++)
if(right->intdata[i] < lowest)
lowest = right->intdata[i];
if(lowest < 0)
throwerror(nil, EDomain);
else if(lowest == 0){
result = duparrayshape(right, AtypeFloat);
- for(int i = 0; i < GetSize(right); i++){
+ for(int i = 0; i < right->size; i++){
vlong max = right->intdata[i];
if(max == 0)
do{
@@ -411,7 +412,7 @@ fnRoll(Array *right)
}
}else{
result = duparrayshape(right, AtypeInt);
- for(int i = 0; i < GetSize(right); i++)
+ for(int i = 0; i < right->size; i++)
result->intdata[i] = io + lrand() % right->intdata[i];
}
}else
@@ -441,12 +442,12 @@ fnFloor(Array *right)
break;
case AtypeFloat:
res = duparrayshape(right, AtypeInt);
- for(int i = 0; i < GetSize(right); i++)
+ for(int i = 0; i < right->size; i++)
res->intdata[i] = floor(right->floatdata[i]);
break;
case AtypeArray:
res = duparrayshape(right, AtypeArray);
- for(int i = 0; i < GetSize(right); i++)
+ for(int i = 0; i < right->size; i++)
res->arraydata[i] = fnFloor(right->arraydata[i]);
break;
default:
@@ -458,7 +459,7 @@ fnFloor(Array *right)
Array *
fnSame(Array *right)
{
- incarrayref(right);
+ incref(right);
return right;
}
@@ -471,7 +472,7 @@ fnUniqueMask(Array *right)
res->intdata[0] = 1;
return res;
}
- if(GetSize(right) == 0){
+ if(right->size == 0){
Array *res = allocarray(AtypeInt, 1, 0);
res->shape[0] = 0;
return res;
@@ -501,12 +502,12 @@ fnMix(Array *right)
{
if(GetType(right) != AtypeArray)
return fnSame(right);
- if(GetSize(right) == 0)
+ if(right->size == 0)
return rundfn(L"((⍴⍵),⍴⊃⍵)⍴⊃⍵", nil, nil, nil, right);
int commonrank = 0;
int i,j;
- for(i = 0; i < GetSize(right); i++)
+ for(i = 0; i < right->size; i++)
if(GetRank(right->arraydata[i]) > commonrank)
commonrank = GetRank(right->arraydata[i]);
@@ -515,7 +516,7 @@ fnMix(Array *right)
for(i = 0; i < commonrank; i++)
commonshape->intdata[i] = 0;
- for(i = 0; i < GetSize(right); i++){
+ for(i = 0; i < right->size; i++){
Array *a = right->arraydata[i];
for(j = 0; j < GetRank(a); j++){
if(a->shape[GetRank(a)-1-j] > commonshape->intdata[commonrank-1-j])
@@ -527,7 +528,7 @@ fnMix(Array *right)
int commonsize = 1;
for(i = 0; i < GetRank(right); i++)
size *= right->shape[i];
- for(i = 0; i < GetSize(commonshape); i++){
+ for(i = 0; i < commonshape->size; i++){
size *= commonshape->intdata[i];
commonsize *= commonshape->intdata[i];
}
@@ -535,7 +536,7 @@ fnMix(Array *right)
Array *result = allocarray(AtypeArray, GetRank(right) + commonrank, size);
for(i = 0; i < GetRank(right); i++)
result->shape[i] = right->shape[i];
- for(j = 0; j < GetSize(commonshape); j++)
+ for(j = 0; j < commonshape->size; j++)
result->shape[i+j] = commonshape->intdata[j];
int *index = emalloc(sizeof(int) * commonrank);
@@ -548,10 +549,10 @@ fnMix(Array *right)
result->arraydata[i*commonsize] = a->arraydata[0];
else
result->arraydata[i*commonsize] = a;
- incarrayref(result->arraydata[i*commonsize]);
+ incref(result->arraydata[i*commonsize]);
for(j = 1; j < commonsize; j++){
result->arraydata[i*commonsize+j] = fill;
- incarrayref(fill);
+ incref(fill);
}
}else{
for(j = 0; j < commonrank; j++)
@@ -561,19 +562,19 @@ fnMix(Array *right)
int nfill = commonshape->intdata[commonrank-1-k] - a->shape[GetRank(a)-1-k];
while(nfill--){
result->arraydata[i*commonsize+offset] = fill;
- incarrayref(fill);
+ incref(fill);
offset++;
}
index[commonrank-1-k] = 0;
index[commonrank-2-k]++;
}
- if(j < GetSize(a)){
+ if(j < a->size){
result->arraydata[i*commonsize+offset] = arrayitem(a, j);
offset++;
index[commonrank-1]++;
}else if(offset < commonsize){
result->arraydata[i*commonsize+offset] = fill;
- incarrayref(fill);
+ incref(fill);
offset++;
}
}
@@ -590,7 +591,7 @@ fnSplit(Array *right)
{
Rune *code = L"0≡≢⍴⍵: ⍵ ⋄ 1≡≢⍴⍵: ⊂⍵ ⋄ (⊂⍵)⌷⍨¨⍳¯1↓⍴⍵";
Array *result = rundfn(code, nil, nil, nil, right);
- if(GetSize(result) == 0 && GetType(result) == AtypeArray)
+ if(result->size == 0 && GetType(result) == AtypeArray)
result->prototype = rundfn(L"⊂(⊃⌽⍴⍵)↑⎕proto ⍵", nil, nil, nil, right);
return result;
}
@@ -598,7 +599,7 @@ fnSplit(Array *right)
Array *
fnEnclose(Array *right)
{
- incarrayref(right);
+ incref(right);
if(simplescalar(right))
return right;
else{
@@ -611,7 +612,7 @@ fnEnclose(Array *right)
Array *
fnDisclose(Array *right)
{
- if(GetSize(right) == 0){
+ if(right->size == 0){
Array *fill = fillelement(right);
Array *res = fnDisclose(fill);
freearray(fill);
@@ -691,7 +692,7 @@ fnIndexGenerator(Array *right)
for(vlong i = 0; i < n; i++)
result->intdata[i] = i + io;
}else if(GetRank(right) == 1){
- if(GetSize(right) == 0)
+ if(right->size == 0)
return rundfn(L"⊂⍬", nil, nil, nil, nil);
else
result = rundfn(L"⊃⍣(0<≢⍵),⌾⌿⍳¨⍵", nil, nil, nil, right);
@@ -709,13 +710,13 @@ fnWhere(Array *right)
Array *
fnEnlist(Array *right)
{
- if(GetSize(right) == 0)
+ if(right->size == 0)
return fnSame(right);
if(GetType(right) != AtypeArray)
return fnRavel(right);
else{
Array *res = fnEnlist(right->arraydata[0]);
- for(int i = 1; i < GetSize(right); i++){
+ for(int i = 1; i < right->size; i++){
Array *old = res;
Array *tmp = fnEnlist(right->arraydata[i]);
res = fnCatenateFirst(res, tmp);
@@ -731,7 +732,7 @@ fnUnique(Array *right)
{
if(GetRank(right) == 0)
return fnRavel(right);
- if(GetSize(right) == 0)
+ if(right->size == 0)
return fnSame(right);
return rundfn(L"(≠⍵)⌿⍵", nil, nil, nil, right);
@@ -743,7 +744,7 @@ fnNot(Array *right)
if(GetType(right) != AtypeInt)
throwerror(nil, EDomain);
Array *res = duparray(right);
- for(int i = 0; i < GetSize(res); i++){
+ for(int i = 0; i < res->size; i++){
if(res->intdata[i] == 0)
res->intdata[i] = 1;
else if(res->intdata[i] == 1)
@@ -762,7 +763,7 @@ fnRavel(Array *right)
Array *res = duparray(right);
SetRank(res, 1);
res->shape = erealloc(res->shape, sizeof(*res->shape) * 1);
- res->shape[0] = GetSize(res);
+ res->shape[0] = res->size;
return res;
}
@@ -773,7 +774,7 @@ fnTable(Array *right)
SetRank(res, 2);
res->shape = erealloc(res->shape, sizeof(*res->shape) * 2);
res->shape[0] = GetRank(right) ? res->shape[0] : 1;
- res->shape[1] = GetSize(right) / res->shape[0];
+ res->shape[1] = right->size / res->shape[0];
return res;
}
@@ -818,7 +819,7 @@ fnReverseFirst(Array *right)
Array *res = duparray(right);
int cells = res->shape[0];
- int elems = GetSize(res) / cells;
+ int elems = res->size / cells;
for(int i = 0; i < cells; i++)
memcpy(
res->rawdata + i * elems * datasizes[GetType(res)],
@@ -845,7 +846,7 @@ fnTranspose(Array *right)
accTo *= right->shape[i];
}
- for(from = 0; from < GetSize(right); from++){
+ for(from = 0; from < right->size; from++){
to = 0;
int tmp = from;
for(int i = GetRank(right)-1; i >= 0; i--){
@@ -904,7 +905,7 @@ fnFormat(Array *right)
if(right->shape[GetRank(right)-1] == 0)
size = 0;
else
- size = maxwidth * GetSize(right) / right->shape[GetRank(right)-1];
+ size = maxwidth * right->size / right->shape[GetRank(right)-1];
Array *result = allocarray(AtypeRune, GetRank(right), size);
result->shape[GetRank(result)-1] = maxwidth;
@@ -949,7 +950,7 @@ Array *name(Array *left, Array *right){\
Array *res;\
if(nested){\
res = duparrayshape(left, AtypeArray);\
- for(int i = 0; i < GetSize(left); i++){\
+ for(int i = 0; i < left->size; i++){\
Array *l = arrayitem(left, i);\
Array *r = arrayitem(right, i);\
res->arraydata[i] = name(l,r);\
@@ -958,7 +959,7 @@ Array *name(Array *left, Array *right){\
}\
}else{\
res = duparray(left);\
- for(int i = 0; i < GetSize(left); i++)\
+ for(int i = 0; i < left->size; i++)\
switch(GetType(left)){\
default: throwerror(nil, EDomain); break;\
cases\
@@ -1096,7 +1097,7 @@ fnDeal(Array *left, Array *right)
{
if(GetType(left) != AtypeInt || GetType(right) != AtypeInt)
throwerror(nil, EDomain);
- if(GetSize(left) != 1 || GetSize(right) != 1)
+ if(left->size != 1 || right->size != 1)
throwerror(nil, ELength);
vlong x = left->intdata[0];
vlong y = right->intdata[0];
@@ -1171,7 +1172,7 @@ Array *
fnLeft(Array *left, Array *right)
{
USED(right);
- incarrayref(left);
+ incref(left);
return left;
}
@@ -1179,7 +1180,7 @@ Array *
fnRight(Array *left, Array *right)
{
USED(left);
- incarrayref(right);
+ incref(right);
return right;
}
@@ -1316,27 +1317,27 @@ fnTake(Array *left, Array *right)
if(GetRank(right) == 0){
right = duparray(right);
- SetRank(right, GetSize(left));
+ SetRank(right, left->size);
right->shape = erealloc(right->shape, sizeof(*right->shape) * GetRank(right));
for(i = 0; i < GetRank(right); i++)
right->shape[i] = 1;
}else
right = fnSame(right);
- if(GetSize(left) > GetRank(right))
+ if(left->size > GetRank(right))
throwerror(nil, ELength);
- else if(GetSize(left) == GetRank(right))
+ else if(left->size == GetRank(right))
left = fnSame(left);
else{
Array *old = left;
left = fnShape(right);
- for(i = 0; i < GetSize(old); i++)
+ for(i = 0; i < old->size; i++)
left->intdata[i] = old->intdata[i];
}
- int *shape = emalloc(sizeof(int) * GetSize(left));
+ int *shape = emalloc(sizeof(int) * left->size);
int size = 1;
- for(i = 0; i < GetSize(left); i++){
+ for(i = 0; i < left->size; i++){
int s = left->intdata[i];
shape[i] = s < 0 ? -s : s;
size *= shape[i];
@@ -1350,17 +1351,17 @@ fnTake(Array *left, Array *right)
if(size == 0 && GetType(result) == AtypeArray)
result->prototype = fnSame(fill);
- int *index = emallocz(sizeof(int) * GetSize(left), 1);
+ int *index = emallocz(sizeof(int) * left->size, 1);
int fromindex;
for(i = 0; i < size; i++){
- for(int j = GetSize(left)-1; index[j] == shape[j]; j--){
+ for(int j = left->size-1; index[j] == shape[j]; j--){
index[j] = 0;
index[j-1]++;
}
int inside = 1;
fromindex = 0;
- for(int j = 0; j < GetSize(left) && inside; j++){
+ for(int j = 0; j < left->size && inside; j++){
vlong n = left->intdata[j];
vlong m = index[j];
if(n > 0 && m >= right->shape[j])
@@ -1385,8 +1386,8 @@ fnTake(Array *left, Array *right)
memcpy(result->rawdata + i*datasizes[GetType(result)],
fill->rawdata, datasizes[GetType(result)]);
if(GetType(result) == AtypeArray)
- incarrayref(result->arraydata[i]);
- index[GetSize(left)-1]++;
+ incref(result->arraydata[i]);
+ index[left->size-1]++;
}
free(shape);
@@ -1408,27 +1409,27 @@ fnDrop(Array *left, Array *right)
if(GetRank(right) == 0){
right = duparray(right);
- SetRank(right, GetSize(left));
+ SetRank(right, left->size);
right->shape = erealloc(right->shape, sizeof(*right->shape) * GetRank(right));
for(i = 0; i < GetRank(right); i++)
right->shape[i] = 1;
}else
right = fnSame(right);
- if(GetSize(left) > GetRank(right))
+ if(left->size > GetRank(right))
throwerror(nil, ELength);
- else if(GetSize(left) == GetRank(right))
+ else if(left->size == GetRank(right))
left = duparray(left);
else{
Array *old = left;
left = allocarray(AtypeInt, 1, GetRank(right));
- left->shape[0] = GetSize(left);
- for(i = 0; i < GetSize(old); i++)
+ left->shape[0] = left->size;
+ for(i = 0; i < old->size; i++)
left->intdata[i] = old->intdata[i];
- for(; i < GetSize(left); i++)
+ for(; i < left->size; i++)
left->intdata[i] = 0;
}
- for(int i = 0; i < GetSize(left); i++){
+ for(int i = 0; i < left->size; i++){
vlong n = left->intdata[i];
vlong m = right->shape[i];
if(n > m || (-n) > m)
@@ -1449,25 +1450,25 @@ fnPick(Array *left, Array *right)
{
if(GetRank(left) > 1)
throwerror(nil, ERank);
- if(GetSize(left) == 0)
+ if(left->size == 0)
return fnSame(right);
int io = globalIO();
Array *result = fnSame(right);
- for(int i = 0; i < GetSize(left); i++){
+ for(int i = 0; i < left->size; i++){
Array *ix = arrayitem(left, i);
if(GetRank(ix) > 1)
throwerror(nil, ERank);
- if(GetSize(ix) != GetRank(result))
+ if(ix->size != GetRank(result))
throwerror(nil, ERank);
int index = 0;
- for(int j = 0; j < GetSize(ix); j++){
+ for(int j = 0; j < ix->size; j++){
int add = ix->intdata[j] - io;
- for(int k = j+1; k < GetSize(ix); k++)
+ for(int k = j+1; k < ix->size; k++)
add *= result->shape[k];
index += add;
}
- if(index >= GetSize(result))
+ if(index >= result->size)
throwerror(nil, EIndex);
Array *tmp = result;
result = arrayitem(result, index);
@@ -1485,7 +1486,7 @@ fnPartition(Array *left, Array *right)
throwerror(nil, ERank);
if(GetType(left) != AtypeInt)
throwerror(nil, EDomain);
- if(GetSize(left) != right->shape[0])
+ if(left->size != right->shape[0])
throwerror(nil, ELength);
if(right->shape[0] == 0)
return fnSame(right); /* TODO figure out if this is correct */
@@ -1498,8 +1499,8 @@ fnPartition(Array *left, Array *right)
int start = -1;
int io = globalIO();
int active = 0;
- for(i = 0; i <= GetSize(left); i++){
- vlong n = i == GetSize(left) ? 0 : left->intdata[i];
+ for(i = 0; i <= left->size; i++){
+ vlong n = i == left->size ? 0 : left->intdata[i];
if(n < 0)
throwerror(nil, EDomain);
if(active && (n == 0 || n > prev)){
@@ -1538,15 +1539,15 @@ fnIndex(Array *left, Array *right)
throwerror(nil, ERank);
if(GetType(left) != AtypeArray && GetType(left) != AtypeInt)
throwerror(nil, EDomain);
- if(GetSize(left) > GetRank(right))
+ if(left->size > GetRank(right))
throwerror(nil, ELength);
/* extend left index vector to full format */
Array *oldleft = left;
left = allocarray(AtypeArray, 1, GetRank(right));
left->shape[0] = GetRank(right);
- for(i = 0; i < GetSize(left); i++){
- if(i >= GetSize(oldleft)){
+ for(i = 0; i < left->size; i++){
+ if(i >= oldleft->size){
Array *n = mkscalarint(right->shape[i]);
left->arraydata[i] = fnIndexGenerator(n);
freearray(n);
@@ -1558,12 +1559,12 @@ fnIndex(Array *left, Array *right)
Array *sub = oldleft->arraydata[i];
if(GetType(sub) != AtypeInt)
throwerror(nil, EDomain);
- for(int j = 0; j < GetSize(sub); j++){
+ for(int j = 0; j < sub->size; j++){
if(sub->intdata[j] < io || sub->intdata[j] >= io + right->shape[i])
throwerror(nil, EIndex);
}
left->arraydata[i] = oldleft->arraydata[i];
- incarrayref(left->arraydata[i]);
+ incref(left->arraydata[i]);
}
}
@@ -1572,7 +1573,7 @@ fnIndex(Array *left, Array *right)
int rank = 0;
int size = 1;
- for(i = 0; i < GetSize(left); i++){
+ for(i = 0; i < left->size; i++){
if(GetType(left) == AtypeArray){
Array *tmp = shape;
Array *newShape = fnShape(left->arraydata[i]);
@@ -1582,7 +1583,7 @@ fnIndex(Array *left, Array *right)
}
}
- for(i = 0; i < GetSize(shape); i++){
+ for(i = 0; i < shape->size; i++){
size *= shape->intdata[i];
rank++;
}
@@ -1592,14 +1593,14 @@ fnIndex(Array *left, Array *right)
result->shape[i] = shape->intdata[i];
freearray(shape);
int *leftindex = emallocz(sizeof(int) * GetRank(right), 1);
- for(i = 0; i < GetSize(result); i++){
- for(int j = GetSize(left)-1; leftindex[j] == GetSize(left->arraydata[j]); j--){
+ for(i = 0; i < result->size; i++){
+ for(int j = left->size-1; leftindex[j] == left->arraydata[j]->size; j--){
leftindex[j] = 0;
leftindex[j-1]++;
}
int from = 0;
- int cellsize = GetSize(right);
- for(int j = 0; j < GetSize(left); j++){
+ int cellsize = right->size;
+ for(int j = 0; j < left->size; j++){
cellsize = cellsize / right->shape[j];
from += cellsize * (left->arraydata[j]->intdata[leftindex[j]] - io);
}
@@ -1608,8 +1609,8 @@ fnIndex(Array *left, Array *right)
right->rawdata + from * datasizes[GetType(result)],
datasizes[GetType(result)]);
if(GetType(result) == AtypeArray)
- incarrayref(result->arraydata[i]);
- leftindex[GetSize(left)-1]++;
+ incref(result->arraydata[i]);
+ leftindex[left->size-1]++;
}
free(leftindex);
freearray(left);
@@ -1631,7 +1632,7 @@ fnIntervalIndex(Array *left, Array *right)
Array *
fnMembership(Array *left, Array *right)
{
- if(GetSize(right) == 0)
+ if(right->size == 0)
return rundfn(L"(⍴⍵)⍴0", nil, nil, nil, left);
if(GetRank(right) == 0)
@@ -1651,15 +1652,15 @@ fnFind(Array *left, Array *right)
}
if(GetRank(left) < GetRank(right)){
- Array *newleft = allocarray(GetType(left), GetRank(right), GetSize(left));
+ Array *newleft = allocarray(GetType(left), GetRank(right), left->size);
for(i = 0; i < GetRank(right) - GetRank(left); i++)
newleft->shape[i] = 1;
for(j = 0; j < GetRank(left); j++)
newleft->shape[i+j] = left->shape[j];
- memcpy(newleft->rawdata, left->rawdata, datasizes[GetType(left)] * GetSize(left));
+ memcpy(newleft->rawdata, left->rawdata, datasizes[GetType(left)] * left->size);
if(GetType(left) == AtypeArray)
- for(i = 0; i < GetSize(left); i++)
- incarrayref(newleft->arraydata[i]);
+ for(i = 0; i < left->size; i++)
+ incref(newleft->arraydata[i]);
left = newleft;
}else
left = fnSame(left);
@@ -1776,10 +1777,10 @@ fnCatenateFirst(Array *left, Array *right)
/* TODO reduce duplicated code between copies from left and right */
/* Copy data from the left array */
- for(i = 0, j = 0; i < GetSize(leftarr); i++, j++){
+ for(i = 0, j = 0; i < leftarr->size; i++, j++){
if(type == AtypeArray && GetType(leftarr) == AtypeArray){
result->arraydata[j] = leftarr->arraydata[i];
- incarrayref(result->arraydata[j]);
+ incref(result->arraydata[j]);
}else if(type == AtypeArray && GetType(leftarr) != AtypeArray){
result->arraydata[j] = arrayitem(leftarr, i);
}else{
@@ -1791,10 +1792,10 @@ fnCatenateFirst(Array *left, Array *right)
}
/* Copy data from the right array */
- for(i = 0; i < GetSize(rightarr); i++, j++){
+ for(i = 0; i < rightarr->size; i++, j++){
if(type == AtypeArray && GetType(rightarr) == AtypeArray){
result->arraydata[j] = rightarr->arraydata[i];
- incarrayref(result->arraydata[j]);
+ incref(result->arraydata[j]);
}else if(type == AtypeArray && GetType(rightarr) != AtypeArray){
result->arraydata[j] = arrayitem(rightarr, i);
}else{
@@ -1808,7 +1809,7 @@ fnCatenateFirst(Array *left, Array *right)
freearray(leftarr);
freearray(rightarr);
- if(GetSize(result) == 0 && GetType(result) == AtypeArray)
+ if(result->size == 0 && GetType(result) == AtypeArray)
result->prototype = fillelement(left);
return result;
}
@@ -1819,22 +1820,22 @@ fnReshape(Array *left, Array *right)
vlong size = 1;
int i;
char *p;
- for(i = 0; i < GetSize(left); i++)
+ for(i = 0; i < left->size; i++)
size *= left->intdata[i];
- if(GetSize(left) == 0)
+ if(left->size == 0)
return arrayitem(right, 0);
- Array *res = allocarray(GetType(right), GetSize(left), size);
+ Array *res = allocarray(GetType(right), left->size, size);
if(size == 0 && GetType(res) == AtypeArray)
res->prototype = fillelement(right);
- for(i = 0; i < GetSize(left); i++)
+ for(i = 0; i < left->size; i++)
res->shape[i] = left->intdata[i];
for(i = 0, p = res->rawdata; i < size; i++, p += datasizes[GetType(res)])
- memcpy(p, right->rawdata + (datasizes[GetType(res)] * (i % GetSize(right))), datasizes[GetType(res)]);
+ memcpy(p, right->rawdata + (datasizes[GetType(res)] * (i % right->size)), datasizes[GetType(res)]);
if(GetType(res) == AtypeArray)
- for(i = 0; i < GetSize(res); i++)
- incarrayref(res->arraydata[i]);
+ for(i = 0; i < res->size; i++)
+ incref(res->arraydata[i]);
return res;
}
@@ -1850,16 +1851,16 @@ fnRotateFirst(Array *left, Array *right)
if(GetType(left) != AtypeInt)
throwerror(nil, EDomain);
- if(GetRank(right) == 0 || GetSize(right) < 2)
+ if(GetRank(right) == 0 || right->size < 2)
return fnSame(right);
int i, j;
- if(GetSize(left) == 1 && GetRank(right) != 0){
+ if(left->size == 1 && GetRank(right) != 0){
vlong v = left->intdata[0];
- left = allocarray(AtypeInt, GetRank(right)-1, GetSize(right) / right->shape[0]);
+ left = allocarray(AtypeInt, GetRank(right)-1, right->size / right->shape[0]);
for(i = 0; i < GetRank(left); i++)
left->shape[i] = right->shape[i+1];
- for(i = 0; i < GetSize(left); i++)
+ for(i = 0; i < left->size; i++)
left->intdata[i] = v;
}else
left = fnSame(left);
@@ -1871,16 +1872,16 @@ fnRotateFirst(Array *left, Array *right)
throwerror(nil, ELength);
int n = right->shape[0];
- for(i = 0; i < GetSize(left); i++)
+ for(i = 0; i < left->size; i++)
while(left->intdata[i] < 0)
left->intdata[i] += n;
Array *result = duparray(right);
for(i = 0; i < n; i++){
- for(j = 0; j < GetSize(left); j++){
+ for(j = 0; j < left->size; j++){
vlong rot = left->intdata[j];
- vlong from = j + ((i+rot)%n)*GetSize(left);
- vlong to = j + i*GetSize(left);
+ vlong from = j + ((i+rot)%n)*left->size;
+ vlong to = j + i*left->size;
memcpy(result->rawdata + to*datasizes[GetType(right)],
right->rawdata + from*datasizes[GetType(right)],
datasizes[GetType(right)]);
@@ -1904,7 +1905,7 @@ fnSelfReference2(Array *left, Array *right)
Array *
fnSend(Array *left, Array *right)
{
- if(GetSize(right) != 1)
+ if(right->size != 1)
throwerror(nil, ELength);
if(GetType(right) != AtypeInt)
throwerror(nil, EDomain);
@@ -1956,10 +1957,10 @@ indexOfHelper(Array *left, Array *right, int interval)
result->shape[i] = right->shape[i];
/* Reshape Y to allow easy picking of sub-arrays */
Array *rightshape = allocarray(AtypeInt, 1, GetRank(right) - rank + 1);
- rightshape->shape[0] = GetSize(rightshape);
+ rightshape->shape[0] = rightshape->size;
rightshape->intdata[0] = size;
- for(i = 0; i < GetSize(rightshape) - 1; i++)
- rightshape->intdata[GetSize(rightshape)-1-i] = right->shape[GetRank(right)-1-i];
+ for(i = 0; i < rightshape->size - 1; i++)
+ rightshape->intdata[rightshape->size-1-i] = right->shape[GetRank(right)-1-i];
right = fnReshape(rightshape, right);
Array **lefts = emalloc(sizeof(Array *) * n);