Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/lib/eina/eina_array.c b/src/lib/eina/eina_array.c
- index cda5181213..7548388cbe 100644
- --- a/src/lib/eina/eina_array.c
- +++ b/src/lib/eina/eina_array.c
- @@ -200,7 +200,9 @@ eina_array_grow(Eina_Array *array)
- EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE);
- EINA_MAGIC_CHECK_ARRAY(array, EINA_FALSE);
- - total = array->total + array->step;
- + if (array->step) total = array->total + array->step;
- + else total = (array->total ? array->total + (array->total+1u)/2u : 1u);
- +
- tmp = realloc(array->data, sizeof (void *) * total);
- if (EINA_UNLIKELY(!tmp)) return 0;
- @@ -210,6 +212,53 @@ eina_array_grow(Eina_Array *array)
- return 1;
- }
- +EAPI Eina_Bool
- +eina_array_reserve(Eina_Array *array, unsigned int total)
- +{
- + void **tmp;
- +
- + EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE);
- + EINA_MAGIC_CHECK_ARRAY(array, EINA_FALSE);
- +
- + if (total <= array->total)
- + return EINA_TRUE;
- +
- + if (array->step)
- + total = ((total / array->step) + (total % array->step ? 1u : 0u)) * array->step;
- +
- + tmp = realloc(array->data, sizeof (void *) * total);
- + if (EINA_UNLIKELY(!tmp)) return EINA_FALSE;
- +
- + array->total = total;
- + array->data = tmp;
- +
- + return EINA_TRUE;
- +}
- +
- +EAPI Eina_Bool
- +eina_array_shrink_to_fit(Eina_Array *array)
- +{
- + if (array->count == 0)
- + {
- + free(array->data);
- + array->total = 0;
- + array->data = NULL;
- + }
- + else if ((array->total - array->count) >= array->step)
- + { // If we reduced size by more than N (block size) then realloc back down
- + unsigned int size;
- + void **tmp;
- +
- + // realloc back down - rounding up to the nearest step size
- + size = (array->step ? ((array->count / array->step) + (array->count % array->step ? 1u : 0u)) * array->step : array->count);
- + tmp = realloc(array->data, sizeof(void *) * size);
- + if (!tmp) return EINA_FALSE;
- + array->total = size;
- + array->data = tmp;
- + }
- + return EINA_TRUE;
- +}
- +
- /**
- * @endcond
- */
- @@ -347,7 +396,7 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data,
- void *gdata),
- void *gdata)
- {
- - unsigned int i, j, size, count;
- + unsigned int i, j, count;
- void *data, **tmp;
- EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE);
- @@ -367,27 +416,9 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data,
- j++;
- }
- }
- + // 2. resize and realloc back down
- array->count = j;
- - // 2. if we reduced size by more than N (block size) then realloc back down
- - if ((array->total - array->count) >= array->step)
- - {
- - if (array->count == 0)
- - {
- - free(array->data);
- - array->total = 0;
- - array->data = NULL;
- - }
- - else
- - {
- - // realloc back down - rounding up to the nearest step size
- - size = ((array->count / array->step) + (array->count % array->step ? 1 : 0)) * array->step;
- - tmp = realloc(array->data, sizeof(void *) * size);
- - if (!tmp) return EINA_FALSE;
- - array->total = size;
- - array->data = tmp;
- - }
- - }
- - return EINA_TRUE;
- + return eina_array_shrink_to_fit(array);
- }
- EAPI Eina_Iterator *
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement