X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2FCollections%2Fvector.h;h=6c532532c8e39a3f115c61900d7fdfa0bfc894ce;hb=978e6f37f283c91a45c139d0cb0af57e48056b95;hp=00696f1a4f0ef900bb3e627b4f476767be74b60f;hpb=eda32d99c1abb9415fb1b44dbf523de3436de41c;p=satune.git diff --git a/src/Collections/vector.h b/src/Collections/vector.h index 00696f1..6c53253 100644 --- a/src/Collections/vector.h +++ b/src/Collections/vector.h @@ -2,29 +2,31 @@ #define VECTOR_H #include -#define VectorDef(name, type) \ +#define VectorDef(name, type) \ struct Vector ## name { \ uint size; \ uint capacity; \ - type * array; \ + type *array; \ }; \ typedef struct Vector ## name Vector ## name; \ Vector ## name * allocVector ## name(uint capacity); \ Vector ## name * allocDefVector ## name(); \ Vector ## name * allocVectorArray ## name(uint capacity, type * array); \ - void pushVector ## name(Vector ## name *vector, type item); \ - type lastVector ## name(Vector ## name *vector); \ - void popVector ## name(Vector ## name *vector); \ - type getVector ## name(Vector ## name *vector, uint index); \ - void setVector ## name(Vector ## name *vector, uint index, type item); \ - uint getSizeVector ## name(Vector ## name *vector); \ - void deleteVector ## name(Vector ## name *vector); \ - void clearVector ## name(Vector ## name *vector); \ - void deleteVectorArray ## name(Vector ## name *vector); \ - type * exposeArray ## name(Vector ## name * vector); \ - void allocInlineVector ## name(Vector ## name * vector, uint capacity); \ - void allocInlineDefVector ## name(Vector ## name * vector); \ - void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array); + void pushVector ## name(Vector ## name * vector, type item); \ + type lastVector ## name(Vector ## name * vector); \ + void popVector ## name(Vector ## name * vector); \ + type getVector ## name(Vector ## name * vector, uint index); \ + void setExpandVector ## name(Vector ## name * vector, uint index, type item); \ + void setVector ## name(Vector ## name * vector, uint index, type item); \ + uint getSizeVector ## name(const Vector ## name * vector); \ + void setSizeVector ## name(Vector ## name * vector, uint size); \ + void deleteVector ## name(Vector ## name * vector); \ + void clearVector ## name(Vector ## name * vector); \ + void deleteVectorArray ## name(Vector ## name * vector); \ + type *exposeArray ## name(Vector ## name * vector); \ + void initVector ## name(Vector ## name * vector, uint capacity); \ + void initDefVector ## name(Vector ## name * vector); \ + void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array); #define VectorImpl(name, type, defcap) \ Vector ## name * allocDefVector ## name() { \ @@ -34,61 +36,78 @@ Vector ## name * tmp = (Vector ## name *)ourmalloc(sizeof(Vector ## name)); \ tmp->size = 0; \ tmp->capacity = capacity; \ - tmp->array = (type *) ourcalloc(1, sizeof(type) * capacity); \ + tmp->array = (type *) ourmalloc(sizeof(type) * capacity); \ return tmp; \ } \ Vector ## name * allocVectorArray ## name(uint capacity, type * array) { \ Vector ## name * tmp = allocVector ## name(capacity); \ - tmp->size=capacity; \ - memcpy(tmp->array, array, capacity * sizeof(type)); \ + tmp->size = capacity; \ + memcpy(tmp->array, array, capacity * sizeof(type)); \ return tmp; \ } \ - void popVector ## name(Vector ## name *vector) { \ - vector->size--; \ - } \ - type lastVector ## name(Vector ## name *vector) { \ - return vector->array[vector->size]; \ - } \ - void pushVector ## name(Vector ## name *vector, type item) { \ + void popVector ## name(Vector ## name * vector) { \ + vector->size--; \ + } \ + type lastVector ## name(Vector ## name * vector) { \ + return vector->array[vector->size - 1]; \ + } \ + void setSizeVector ## name(Vector ## name * vector, uint size) { \ + if (size <= vector->size) { \ + vector->size = size; \ + return; \ + } else if (size > vector->capacity) { \ + vector->array = (type *)ourrealloc(vector->array, size * sizeof(type)); \ + vector->capacity = size; \ + } \ + bzero(&vector->array[vector->size], (size - vector->size) * sizeof(type)); \ + vector->size = size; \ + } \ + void pushVector ## name(Vector ## name * vector, type item) { \ if (vector->size >= vector->capacity) { \ - uint newcap=vector->capacity * 2; \ - vector->array=(type *)ourrealloc(vector->array, newcap); \ + uint newcap = vector->capacity << 1; \ + vector->array = (type *)ourrealloc(vector->array, newcap * sizeof(type)); \ + vector->capacity = newcap; \ } \ vector->array[vector->size++] = item; \ } \ type getVector ## name(Vector ## name * vector, uint index) { \ return vector->array[index]; \ } \ + void setExpandVector ## name(Vector ## name * vector, uint index, type item) { \ + if (index >= vector->size) \ + setSizeVector ## name(vector, index + 1); \ + setVector ## name(vector, index, item); \ + } \ void setVector ## name(Vector ## name * vector, uint index, type item) { \ - vector->array[index]=item; \ + vector->array[index] = item; \ } \ - uint getSizeVector ## name(Vector ## name *vector) { \ + uint getSizeVector ## name(const Vector ## name * vector) { \ return vector->size; \ } \ - void deleteVector ## name(Vector ## name *vector) { \ + void deleteVector ## name(Vector ## name * vector) { \ ourfree(vector->array); \ ourfree(vector); \ } \ - void clearVector ## name(Vector ## name *vector) { \ - vector->size=0; \ + void clearVector ## name(Vector ## name * vector) { \ + vector->size = 0; \ } \ - type * exposeArray ## name(Vector ## name * vector) { \ + type *exposeArray ## name(Vector ## name * vector) { \ return vector->array; \ - } \ - void deleteVectorArray ## name(Vector ## name *vector) { \ + } \ + void deleteVectorArray ## name(Vector ## name * vector) { \ ourfree(vector->array); \ - } \ - void allocInlineVector ## name(Vector ## name * vector, uint capacity) { \ + } \ + void initVector ## name(Vector ## name * vector, uint capacity) { \ vector->size = 0; \ - vector->capacity = capacity; \ - vector->array = (type *) ourcalloc(1, sizeof(type) * capacity); \ - } \ - void allocInlineDefVector ## name(Vector ## name * vector) { \ - allocInlineVector ## name(vector, defcap); \ - } \ - void allocInlineVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \ - allocInlineVector ##name(vector, capacity); \ - vector->size=capacity; \ - memcpy(vector->array, array, capacity * sizeof(type)); \ + vector->capacity = capacity; \ + vector->array = (type *) ourmalloc(sizeof(type) * capacity); \ + } \ + void initDefVector ## name(Vector ## name * vector) { \ + initVector ## name(vector, defcap); \ + } \ + void initVectorArray ## name(Vector ## name * vector, uint capacity, type * array) { \ + initVector ## name(vector, capacity); \ + vector->size = capacity; \ + memcpy(vector->array, array, capacity * sizeof(type)); \ } #endif