2020-12-23 16:39:22 +00:00
|
|
|
#include "vector.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include <mem/heap.h>
|
|
|
|
|
|
|
|
Vector_t newVec(u32 typesz, u32 preallocate)
|
|
|
|
{
|
|
|
|
Vector_t res = {
|
|
|
|
.data = calloc(preallocate, typesz),
|
|
|
|
.capacity = preallocate * typesz,
|
|
|
|
.count = 0,
|
|
|
|
.elemSz = typesz
|
|
|
|
};
|
|
|
|
// check .data != null;
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
Vector_t vecFromArray(void* array, u32 count, u32 typesz)
|
|
|
|
{
|
|
|
|
Vector_t res = {
|
|
|
|
.data = array,
|
|
|
|
.capacity = count * typesz,
|
|
|
|
.count = count,
|
|
|
|
.elemSz = typesz
|
|
|
|
};
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool vecAdd(Vector_t* v, void* elem, u32 sz)
|
|
|
|
{
|
|
|
|
if (!v || !elem || v->elemSz != sz)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
u32 usedbytes = v->count * sz;
|
|
|
|
if (usedbytes >= v->capacity)
|
|
|
|
{
|
|
|
|
v->capacity *= 2;
|
|
|
|
void *buff = malloc(v->capacity);
|
|
|
|
if (!buff)
|
|
|
|
return false;
|
|
|
|
memcpy(buff, v->data, v->capacity / 2);
|
|
|
|
free(v->data);
|
|
|
|
v->data = buff;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy((char*)v->data + usedbytes, elem, sz);
|
|
|
|
v->count++;
|
|
|
|
return true;
|
2020-12-28 13:51:59 +00:00
|
|
|
}
|
|
|
|
|
2021-01-01 17:30:51 +00:00
|
|
|
Vector_t vecCopyOffset(Vector_t* orig, u32 offset) {
|
|
|
|
Vector_t dst = newVec(orig->elemSz, orig->count - offset);
|
|
|
|
memcpy(dst.data, ((u8*)orig->data + orig->elemSz * offset), (orig->count - offset) * orig->elemSz);
|
|
|
|
dst.count = orig->count - offset;
|
2020-12-28 13:51:59 +00:00
|
|
|
return dst;
|
2021-01-01 17:30:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Vector_t vecCopy(Vector_t* orig) {
|
|
|
|
return vecCopyOffset(orig, 0);
|
|
|
|
}
|
|
|
|
|