mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Add array_pop_back and fix bug
This commit is contained in:
parent
2e147d5415
commit
b410b5038c
20
src/array.c
20
src/array.c
@ -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]);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user