108 lines
2.8 KiB
C
108 lines
2.8 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
/* VARIABLE LENGTH ARRAY */
|
|
|
|
void vector_clear(VLA *this){
|
|
this->end = this->begin;
|
|
}
|
|
|
|
void *vector_getBegin(VLA *this){
|
|
return this->begin;
|
|
}
|
|
|
|
void *vector_at(VLA *this, u32 n){
|
|
return (void *)((u32) this->begin + n*this->elem_size);
|
|
}
|
|
|
|
s32 vector_getIndex(VLA *this, void *elemPtr){
|
|
return ((s32)elemPtr - (s32)this->begin)/(s32)this->elem_size;
|
|
}
|
|
|
|
s32 vector_size(VLA *this){
|
|
return ((s32)this->end - (s32)this->begin)/this->elem_size;
|
|
}
|
|
|
|
void *vector_getEnd(VLA *this){
|
|
return this->end;
|
|
}
|
|
|
|
void *vector_pushBackNew(VLA **thisPtr){
|
|
void *retVal;
|
|
VLA* this;
|
|
s32 size;
|
|
s32 mem_size;
|
|
|
|
this = *thisPtr;
|
|
if(this->end == this->mem_end){
|
|
size = ((s32)this->end - (s32)this->begin)/this->elem_size;
|
|
mem_size = size + 5;
|
|
this = realloc(this, mem_size*this->elem_size + sizeof(VLA));
|
|
this->begin = &this->data;
|
|
this->end = (u8 *)this->begin + size* this->elem_size;
|
|
this->mem_end = (u8 *)this->begin + mem_size* this->elem_size;
|
|
*thisPtr = this;
|
|
}
|
|
retVal = this->end;
|
|
this->end = (void *)((s32)this->end + this->elem_size);
|
|
return retVal;
|
|
}
|
|
|
|
void *vector_insertNew(VLA **thisPtr, s32 indx){
|
|
VLA *this;
|
|
s32 i;
|
|
|
|
vector_pushBackNew(thisPtr);
|
|
this = *thisPtr;
|
|
i = ((s32)this->end - (s32)this->begin)/this->elem_size;
|
|
while(indx < --i){
|
|
memcpy((s32)this->begin + (i)*this->elem_size, (s32)this->begin + (i -1)*this->elem_size, this->elem_size);
|
|
}
|
|
return (void *)((s32)this->begin + indx*this->elem_size);
|
|
}
|
|
|
|
void vector_free(VLA *this){
|
|
free(this);
|
|
}
|
|
|
|
VLA *vector_new(u32 elemSize, u32 cnt){
|
|
VLA *this = malloc(cnt*elemSize + sizeof(VLA));
|
|
this->elem_size = elemSize;
|
|
this->begin = &this->data;
|
|
this->end = &this->data;
|
|
this->mem_end = (u8*)this->end + cnt*elemSize;
|
|
return this;
|
|
}
|
|
|
|
void vector_remove(VLA *this, u32 indx){
|
|
u32 elemOffset = (u32)this->begin + indx * this->elem_size;\
|
|
u32 nextOffset = (u32)this->begin + (indx + 1) * this->elem_size;\
|
|
u32 size = (u32)this->end - (u32)this->begin;
|
|
|
|
memcpy( elemOffset, nextOffset, size - (indx + 1) * this->elem_size);
|
|
this->end = (u32)this->end - this->elem_size;
|
|
}
|
|
|
|
|
|
void vector_popBack_n(VLA *this, u32 n){
|
|
this->end = (void *)((u32)this->end - n * this->elem_size);
|
|
}
|
|
|
|
void vector_assign(VLA *this, s32 indx, void* value){
|
|
memcpy((s32)this->begin + indx * this->elem_size, value, this->elem_size);
|
|
}
|
|
|
|
VLA * vector_defrag(VLA *this){
|
|
s32 oldSize;
|
|
s32 oldMemSize;
|
|
|
|
oldSize = (s32) this->end - (s32)this->begin;
|
|
oldMemSize = (s32) this->mem_end - (s32)this->begin;
|
|
this = (VLA *)defrag(this);
|
|
this->begin = &this->data;
|
|
this->end = (void *)((s32)this->begin + oldSize);
|
|
this->mem_end = (void *)((s32)this->begin + oldMemSize);
|
|
return this;
|
|
}
|