Add array_pop_back and fix bug

This commit is contained in:
iabdalkader 2014-03-02 19:38:41 +02:00
parent 2e147d5415
commit b410b5038c
2 changed files with 19 additions and 4 deletions

View File

@ -52,6 +52,11 @@ int array_length(struct array *array)
return array->index; return array->index;
} }
void *array_at(struct array *array, int idx)
{
return array->data[idx];
}
void array_push_back(struct array *array, void *element) void array_push_back(struct array *array, void *element)
{ {
if (array->index == array->length-1) { if (array->index == array->length-1) {
@ -61,9 +66,14 @@ void array_push_back(struct array *array, void *element)
array->data[array->index++] = element; array->data[array->index++] = element;
} }
void *array_at(struct array *array, int idx) void *array_pop_back(struct array *array)
{ {
return array->data[idx]; void *el=NULL;
if (array->index) {
el = array->data[--array->index];
}
return el;
} }
void array_erase(struct array *array, int idx) void array_erase(struct array *array, int idx)
@ -71,12 +81,16 @@ void array_erase(struct array *array, int idx)
if (array->dtor) { if (array->dtor) {
array->dtor(array->data[idx]); array->dtor(array->data[idx]);
} }
memmove(array->data+idx, array->data+idx+1, (array->index-idx-1) * sizeof(void*)); if (array->index >1 && idx < array->index){
/* Since dst is always < src we can just use memcpy */
memcpy(array->data+idx, array->data+idx+1, (array->index-idx-1) * sizeof(void*));
}
array->index--; array->index--;
} }
void array_resize(struct array *array, int idx) void array_resize(struct array *array, int idx)
{ {
//TODO realloc
while (array->index > idx) { while (array->index > idx) {
if (array->dtor != NULL) { if (array->dtor != NULL) {
array->dtor(array->data[array->index-1]); array->dtor(array->data[array->index-1]);

View File

@ -12,8 +12,9 @@ void array_alloc(struct array **array, array_dtor dtor);
void array_alloc_init(struct array **array, array_dtor dtor, int size); void array_alloc_init(struct array **array, array_dtor dtor, int size);
void array_free(struct array *array); void array_free(struct array *array);
int array_length(struct array *array); int array_length(struct array *array);
void array_push_back(struct array *array, void *value);
void *array_at(struct array *array, int index); void *array_at(struct array *array, int index);
void array_push_back(struct array *array, void *value);
void *array_pop_back(struct array *array);
void array_sort(struct array *array, array_comp); void array_sort(struct array *array, array_comp);
void array_erase(struct array *array, int index); void array_erase(struct array *array, int index);
void array_resize(struct array *array, int index); void array_resize(struct array *array, int index);