diff options
author | glenda <glenda@9front> | 2022-10-22 16:45:32 +0000 |
---|---|---|
committer | glenda <glenda@9front> | 2022-10-22 16:45:32 +0000 |
commit | a82186dab48c234c507693b166acd7c13433864a (patch) | |
tree | eb6db255c93b1e6278e0e833e915c4c85372c84f /hybrids.c | |
parent | a3b635de1753ed4ce73dabdc7e2c24dfdf77891e (diff) |
Atomic reference counting
Diffstat (limited to 'hybrids.c')
-rw-r--r-- | hybrids.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -1,6 +1,7 @@ #include <u.h> #include <libc.h> #include <bio.h> +#include <thread.h> #include "apl9.h" @@ -42,31 +43,31 @@ fnReplicateFirst(Array *left, Array *right) throwerror(nil, ERank); /* Reshape right if scalar */ - if(GetSize(right) == 1){ + if(right->size == 1){ Array *shape = GetRank(right) == 0 ? mkscalarint(1) : fnShape(right); - shape->intdata[0] = GetSize(left); + shape->intdata[0] = left->size; right = fnReshape(shape, right); freearray(shape); }else right = fnSame(right); int nsize = right->shape[0]; - int cellsize = nsize == 0 ? 1 : GetSize(right) / nsize; + int cellsize = nsize == 0 ? 1 : right->size / nsize; int i; - if(GetSize(left) == 1){ + if(left->size == 1){ Array *shape = mkscalarint(nsize); left = fnReshape(shape, left); }else left = fnSame(left); - if(GetSize(left) != nsize){ + if(left->size != nsize){ freearray(left); freearray(right); throwerror(nil, ELength); } nsize = 0; - for(i = 0; i < GetSize(left); i++){ + for(i = 0; i < left->size; i++){ vlong n = left->intdata[i]; nsize += n > 0 ? n : -n; } @@ -95,7 +96,7 @@ fnReplicateFirst(Array *left, Array *right) } if(GetType(result) == AtypeArray) for(int j = 0; j < npos*cellsize; j++) - incarrayref(result->arraydata[to*cellsize+j]); + incref(result->arraydata[to*cellsize+j]); } freearray(fill); freearray(left); @@ -116,7 +117,7 @@ fnExpandFirst(Array *left, Array *right) int npos = 0; int nsize = 0; int i; - for(i = 0; i < GetSize(left); i++){ + for(i = 0; i < left->size; i++){ if(left->intdata[i] > 0) npos++; else if(left->intdata[i] == 0) @@ -129,7 +130,7 @@ fnExpandFirst(Array *left, Array *right) if(right->shape[0] != 1 && right->shape[0] != npos) throwerror(nil, ELength); - vlong cellsize = right->shape[0] == 0 ? 1 : GetSize(right) / right->shape[0]; + vlong cellsize = right->shape[0] == 0 ? 1 : right->size / right->shape[0]; Array *result = allocarray(GetType(right), GetRank(right), nsize * cellsize); result->shape[0] = nsize; for(i = 1; i < GetRank(result); i++) @@ -153,7 +154,7 @@ fnExpandFirst(Array *left, Array *right) } if(GetType(result) == AtypeArray) for(int j = 0; j < npos*cellsize; j++) - incarrayref(result->arraydata[to*cellsize+j]); + incref(result->arraydata[to*cellsize+j]); if(right->shape[0] != 1 && !neg) from++; } @@ -194,7 +195,7 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) if(left){ if(GetType(left) != AtypeInt) throwerror(nil, EDomain); - if(GetSize(left) != 1) + if(left->size != 1) throwerror(nil, ELength); vlong winsize = left->intdata[0]; if(winsize > right->shape[0]) @@ -215,7 +216,7 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) if(n == 0) throwerror(L"Can't figure out identity element", ENotImplemented); - Array *result = allocarray(AtypeArray, GetRank(right) - 1, GetSize(right) / n); + Array *result = allocarray(AtypeArray, GetRank(right) - 1, right->size / n); for(int i = 0; i < GetRank(right)-1; i++) result->shape[i] = right->shape[i+1]; @@ -224,11 +225,11 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) Array *tmp = mkscalarint(n); index->arraydata[0] = fnIndexGenerator(tmp); freearray(tmp); - for(int i = 1; i < GetSize(index); i++) + for(int i = 1; i < index->size; i++) index->arraydata[i] = mkscalarint(io); - for(int i = 0; i < GetSize(result); i++){ - for(int j = GetSize(index) - 1; index->arraydata[j]->intdata[0] == io + right->shape[j]; j--){ + for(int i = 0; i < result->size; i++){ + for(int j = index->size - 1; index->arraydata[j]->intdata[0] == io + right->shape[j]; j--){ index->arraydata[j]->intdata[0] = io; index->arraydata[j-1]->intdata[0]++; } @@ -242,7 +243,7 @@ opReduceFirst(Datum *lefto, Array *left, Array *right) freearray(argR); } freearray(vector); - index->arraydata[GetSize(index)-1]->intdata[0]++; + index->arraydata[index->size-1]->intdata[0]++; } freearray(index); @@ -257,7 +258,7 @@ opScanFirst(Datum *lefto, Array *left, Array *right) Array *result = duparrayshape(right, AtypeArray); int n = result->shape[0]; - int m = GetSize(result) / n; + int m = result->size / n; for(int i = 0; i < n; i++){ Array *len = mkscalarint(i + 1); Array *index = fnIndexGenerator(len); |