summaryrefslogtreecommitdiff
path: root/array.c
blob: 4913112bbd1e190df1a81b8b700de167d1251be9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <u.h>
#include <libc.h>
#include <bio.h>

#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;
}