summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/array.c b/array.c
index 4a14ab9..7675144 100644
--- a/array.c
+++ b/array.c
@@ -97,4 +97,23 @@ arrayitem(Array *a, int index)
exits(nil);
}
return res;
+}
+
+Array *
+simplifyarray(Array *a)
+{
+ /* simplify an array if possible. */
+ if(a->type != AtypeArray || a->size == 0)
+ return fnSame(a);
+ int type = a->arraydata[0]->type;
+ int i;
+ for(i = 0; i < a->size; i++)
+ if(a->arraydata[i]->type != type || a->arraydata[i]->rank != 0)
+ return fnSame(a);
+ Array *b = allocarray(type, a->rank, a->size);
+ for(i = 0; i < a->rank; i++)
+ b->shape[i] = a->shape[i];
+ for(i = 0; i < a->size; i++)
+ memcpy(b->rawdata + i * datasizes[type], a->arraydata[i]->rawdata, datasizes[type]);
+ return b;
} \ No newline at end of file