#include #include #include #include "apl9.h" int datasizes[] = { [AtypeInt] = sizeof(vlong), [AtypeArray] = sizeof(Array *) }; Array * mkscalarint(vlong i) { Array *a = allocarray(AtypeInt, 0, 1); a->intdata[0] = i; return a; } Array * duparray(Array *a) { Array *b = allocarray(a->type, a->rank, a->size); memcpy(b->shape, a->shape, sizeof(int) * a->rank); memcpy(b->rawdata, a->rawdata, datasizes[a->type]*a->size); if(b->type == AtypeArray) for(int i = 0; i < b->size; i++) incref(b->arraydata[i]); return b; } int simplearray(Array *a) { return a->type != AtypeArray; } int simplescalar(Array *a) { return simplearray(a) && a->rank == 0; } Array * extend(Array *a, Array *b) { /* extend the singleton a to the shape of b */ Array *shape = fnShape(b); Array *res = fnReshape(shape, a); freearray(shape); return res; } int scalarextend(Array *a, Array *b, Array **aa, Array **bb) { /* Extend the arrays a and b to have the same shape. The resulting arrays are stored in aa and bb, except when the ranks don't match or extension can't happen, in which case the function returns 0 and aa and bb are unchanged. */ if(a->size == 1 && b->size != 1){ *aa = extend(a, b); *bb = fnSame(b); }else if(b->size == 1 && a->size != 1){ *aa = fnSame(a); *bb = extend(b, a); }else if(a->size == b->size && a->rank == b->rank){ /* Check that each dimension matches */ for(int i = 0; i < a->rank; i++) if(a->shape[i] != b->shape[i]) return 0; *aa = fnSame(a); *bb = fnSame(b); }else return 0; return 1; }