ref: 50104ba72987b26febfa4e398458d47db20e9bea
dir: /array.c/
#include <u.h>
#include <libc.h>
#include <thread.h>
#include "dat.h"
#include "fns.h"
/* This file is the only file that knows how arrays are stored.
* In theory, that allows us to experiment with other representations later.
*/
struct Array
{
int rank;
usize size;
usize *shape;
union {
void *data;
vlong *intdata;
Rune *chardata;
};
};
void
initarrays(void)
{
dataspecs[DataArray].size = sizeof(Array);
}
Array *
allocarray(int type, int rank, usize size)
{
Array *a = alloc(DataArray);
a->rank = rank;
a->size = size;
switch(type){
case TypeNumber:
size *= sizeof(vlong);
break;
case TypeChar:
size *= sizeof(Rune);
break;
}
a->shape = allocextra(a, (sizeof(usize) * rank) + size);
a->data = (void*)(a->shape+rank);
return a;
}
void
setint(Array *a, usize offset, vlong v)
{
a->intdata[offset] = v;
}
void
setshape(Array *a, int dim, usize size)
{
a->shape[dim] = size;
}
char *
printarray(Array *a)
{
/* TODO: this is just for debugging */
char buf[2048];
char *p = buf;
p += sprint(p, "type: %s shape: ", "numeric");
for(int i = 0; i < a->rank; i++)
p += sprint(p, "%lld ", a->shape[i]);
p += sprint(p, "data: ");
for(uvlong i = 0; i < a->size; i++)
p += sprint(p, "%lld ", a->intdata[i]);
return buf;
}