summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/array.c b/array.c
index 766ccd8..4f904e1 100644
--- a/array.c
+++ b/array.c
@@ -5,7 +5,8 @@
#include "apl9.h"
int datasizes[] = {
- [AtypeInt] = sizeof(vlong)
+ [AtypeInt] = sizeof(vlong),
+ [AtypeArray] = sizeof(Array *)
};
Array *
@@ -13,6 +14,8 @@ mkarray(arrayDataType t, int rank, int size)
{
Array *a = malloc(sizeof(Array));
a->rank = rank;
+ a->type = t;
+ a->size = size;
a->shape = malloc(sizeof(int) * rank);
a->rawdata = malloc(datasizes[t] * size);
a->type = t;
@@ -26,4 +29,26 @@ mkscalarint(vlong i)
a->intdata[0] = i;
return a;
-} \ No newline at end of file
+}
+
+Array *
+duparray(Array *a)
+{
+ Array *b = mkarray(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);
+ /* TODO duplicate recursivley */
+ return b;
+}
+
+int
+simplearray(Array *a)
+{
+ return a->type != AtypeArray;
+}
+
+int
+simplescalar(Array *a)
+{
+ return simplearray(a) && a->rank == 0;
+}