X-Git-Url: https://git.auder.net/?p=cgds.git;a=blobdiff_plain;f=src%2FVector.c;h=c031b2c2f556380f129b67e044f30983040dcc5c;hp=a072ff3173691b3d591037851c4392d6e104c5f2;hb=1d60b10a9482afc28f4ac027b21edf930d48440c;hpb=588a2232cf24183218d88c85003f2e6093f942ed diff --git a/src/Vector.c b/src/Vector.c index a072ff3..c031b2c 100644 --- a/src/Vector.c +++ b/src/Vector.c @@ -28,12 +28,8 @@ Vector* vector_copy(Vector* vector) Vector* vectorCopy = _vector_new(vector->dataSize); vectorCopy->size = vector->size; vectorCopy->capacity = vector->capacity; - vectorCopy->datas = (void**) safe_malloc(vector->capacity * sizeof (void*)); - for (UInt i = 0; i < vector->size; i++) - { - vectorCopy->datas[i] = safe_malloc(vector->dataSize); - memcpy(vectorCopy->datas[i], vector->datas[i], vector->dataSize); - } + vectorCopy->datas = (void*) safe_malloc(vector->capacity * vector->dataSize); + memcpy(vectorCopy->datas, vector->datas, vector->size * vector->dataSize); return vectorCopy; } @@ -49,13 +45,8 @@ UInt vector_size(Vector* vector) void _vector_realloc(Vector* vector, UInt newCapacity) { - void** rellocatedDatas = (void**) safe_malloc(newCapacity * sizeof (void*)); - for (UInt i = 0; i < vector->size; i++) - { - rellocatedDatas[i] = (void*) safe_malloc(vector->dataSize); - memcpy(rellocatedDatas[i], vector->datas[i], vector->dataSize); - safe_free(vector->datas[i]); - } + void* rellocatedDatas = (void*) safe_malloc(newCapacity * vector->dataSize); + memcpy(rellocatedDatas, vector->datas, vector->size * vector->dataSize); safe_free(vector->datas); vector->datas = rellocatedDatas; vector->capacity = newCapacity; @@ -63,20 +54,20 @@ void _vector_realloc(Vector* vector, UInt newCapacity) void _vector_push(Vector* vector, void* data) { - void* pData = safe_malloc(vector->dataSize); - memcpy(pData, data, vector->dataSize); if (vector->size >= vector->capacity) { UInt increasedCapacity = vector->capacity > 0 ? 2 * vector->capacity : 1; _vector_realloc(vector, increasedCapacity); } - vector->datas[vector->size] = pData; + memcpy( + vector->datas + vector->size * vector->dataSize, + data, + vector->dataSize); vector->size++; } void vector_pop(Vector* vector) { - safe_free(vector->datas[vector_size(vector) - 1]); vector->size--; if (vector_size(vector) <= (vector->capacity >> 1)) _vector_realloc(vector, vector->capacity >> 1); @@ -84,18 +75,16 @@ void vector_pop(Vector* vector) void* _vector_get(Vector* vector, UInt index) { - return vector->datas[index]; + return vector->datas + index * vector->dataSize; } void _vector_set(Vector* vector, UInt index, void* data) { - memcpy(vector->datas[index], data, vector->dataSize); + memcpy(vector->datas + index * vector->dataSize, data, vector->dataSize); } void vector_clear(Vector* vector) { - for (UInt i = 0; i < vector->size; i++) - safe_free(vector->datas[i]); safe_free(vector->datas); _vector_init(vector, vector->dataSize); } @@ -126,33 +115,38 @@ void vectorI_reset_begin(VectorIterator* vectorI) void vectorI_reset_end(VectorIterator* vectorI) { - vectorI->current = vectorI->vector->datas + vectorI->vector->size - 1; + vectorI->current = vectorI->vector->datas + + (vectorI->vector->size - 1) * vectorI->vector->dataSize; } bool vectorI_has_data(VectorIterator* vectorI) { - return (vectorI->current >= vectorI->vector->datas && - vectorI->current < vectorI->vector->datas + vectorI->vector->size); + return ( + vectorI->current >= vectorI->vector->datas && + vectorI->current < + vectorI->vector->datas + + vectorI->vector->size * vectorI->vector->dataSize + ); } void* _vectorI_get(VectorIterator* vectorI) { - return *(vectorI->current); + return vectorI->current; } void _vectorI_set(VectorIterator* vectorI, void* data) { - *(vectorI->current) = data; + memcpy(vectorI->current, data, vectorI->vector->dataSize); } void vectorI_move_next(VectorIterator* vectorI) { - vectorI->current++; + vectorI->current += vectorI->vector->dataSize; } void vectorI_move_prev(VectorIterator* vectorI) { - vectorI->current--; + vectorI->current -= vectorI->vector->dataSize; } void vectorI_destroy(VectorIterator* vectorI)