EAPI void * eina_inarray_pop(Eina_Inarray *array) { EINA_MAGIC_CHECK_INARRAY(array, NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL(array->len == 0, NULL); if (!_eina_inarray_resize(array, array->len - 1)) return NULL; array->len--; return _eina_inarray_get(array, array->len + 1); }
EAPI Eina_Bool eina_inarray_resize(Eina_Inarray *array, unsigned int new_size) { Eina_Bool r; EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); r = _eina_inarray_resize(array, new_size); if(!r) return EINA_FALSE; array->len = new_size; return EINA_TRUE; }
EAPI void * eina_inarray_grow(Eina_Inarray *array, unsigned int size) { void *p; EINA_MAGIC_CHECK_INARRAY(array, NULL); if (!size) return NULL; if (!_eina_inarray_resize(array, array->len + size)) return NULL; p = _eina_inarray_get(array, array->len); array->len += size; return p; }
EAPI int eina_inarray_push(Eina_Inarray *array, const void *data) { void *p; EINA_MAGIC_CHECK_INARRAY(array, -1); EINA_SAFETY_ON_NULL_RETURN_VAL(data, -1); if (!_eina_inarray_resize(array, array->len + 1)) return -1; p = _eina_inarray_get(array, array->len); memcpy(p, data, array->member_size); array->len++; return array->len - 1; }
EAPI Eina_Bool eina_inarray_remove_at(Eina_Inarray *array, unsigned int position) { EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); EINA_SAFETY_ON_TRUE_RETURN_VAL(position >= array->len, EINA_FALSE); if (position + 1 < array->len) { unsigned int sz = array->member_size; unsigned char *p = _eina_inarray_get(array, position); memmove(p, p + sz, (array->len - position - 1) * sz); } _eina_inarray_resize(array, array->len - 1); array->len--; return EINA_TRUE; }
EAPI Eina_Bool eina_inarray_remove_at(Eina_Inarray *array, unsigned int position) { EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); EINA_SAFETY_ON_TRUE_RETURN_VAL(position >= array->len, EINA_FALSE); if (position + 1 < array->len) { unsigned int sz = array->member_size; unsigned char *p = _eina_inarray_get(array, position); memmove(p, p + sz, (array->len - position - 1) * sz); } /* should never fail as we reduce the buffer, but just let make compiler happy */ if (!_eina_inarray_resize(array, array->len - 1)) return EINA_FALSE; array->len--; return EINA_TRUE; }
EAPI void * eina_inarray_alloc_at(Eina_Inarray *array, unsigned int position, unsigned int member_count) { unsigned int sz; unsigned char *p; EINA_MAGIC_CHECK_INARRAY(array, NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL(position > array->len, NULL); EINA_SAFETY_ON_TRUE_RETURN_VAL(member_count == 0, NULL); if (!_eina_inarray_resize(array, array->len + member_count)) return NULL; p = _eina_inarray_get(array, position); sz = array->member_size; if (array->len > position) memmove(p + member_count * sz, p, (array->len - position) * sz); array->len += member_count; return p; }
EAPI Eina_Bool eina_inarray_insert_at(Eina_Inarray *array, unsigned int position, const void *data) { unsigned int sz; unsigned char *p; EINA_MAGIC_CHECK_INARRAY(array, EINA_FALSE); EINA_SAFETY_ON_TRUE_RETURN_VAL(position > array->len, EINA_FALSE); if (!_eina_inarray_resize(array, array->len + 1)) return EINA_FALSE; p = _eina_inarray_get(array, position); sz = array->member_size; if (array->len > position) memmove(p + sz, p, (array->len - position) * sz); memcpy(p, data, sz); array->len++; return EINA_TRUE; }