summaryrefslogtreecommitdiff
path: root/functions.c
blob: 6ff653a08f281a09c54786971a96b8165bf59765 (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
44
45
46
47
48
49
50
51
52
53
54
#include <u.h>
#include <libc.h>
#include <bio.h>

#include "apl9.h"

Array *
fnCatenateFirst(Array *left, Array *right)
{
	/* not even close to being right, but it works for stranding :) */
	if(left->rank == 0)
		left = fnRavel(left);
	if(right->rank == 0)
		right = fnRavel(right);
	
	print("Catenating: %S and %S\n", pparray(left), pparray(right));
	/* assume two vectors of same type for now */
	Array *res = mkarray(left->type, 1, left->size+right->size);
	res->shape[0] = left->shape[0] + right->shape[0];
	memcpy(res->rawdata, left->rawdata, datasizes[res->type]*left->size);
	memcpy(res->rawdata+datasizes[res->type]*left->size, right->rawdata, datasizes[res->type]*right->size);
	return res;
}

Array *
fnNest(Array *right)
{
	if(simplearray(right))
		return fnEnclose(right);
	else
		return right;
}

Array *
fnEnclose(Array *right)
{
	if(simplescalar(right))
		return right;
	else{
		Array *res = mkarray(AtypeArray, 0, 1);
		res->arraydata[0] = right;
		return res;
	}
}

Array *
fnRavel(Array *right)
{
	Array *res = duparray(right);
	res->rank = 1;
	res->shape = realloc(res->shape, sizeof(int) * 1);
	res->shape[0] = res->size;
	return res;
}