int arraylist_expand(struct arraylist *array) { size_t old_max = array->max; check(arraylist_resize(array, array->max + array->expand_rate) == 0, "Failed to expand array to new size: %d", array->max + (int) array->expand_rate); memset(array->contents + old_max, 0, array->expand_rate + 1); return 0; error: return -1; }
/* * adds a copy of the item at itemPtr to the list at position index * Adding to the end takes constant time * Adding to the beginning takes linear time */ void arraylist_add(arraylist *list,int index, void* itemPtr){ if(index>list->size||index<0) fprintf(stderr,"your index is out of bounds. size:%d index %d\n",list->size,index); int elem_size=list->element_size; if(list->size==list->capacity){ arraylist_resize(list); } void *position=list->array+index*elem_size; memmove(position+elem_size,position, elem_size*(list->size-index)); memcpy(position, itemPtr, elem_size); ++list->size; }
int arraylist_contract(struct arraylist *array) { int new_size = array->end < (int) array->expand_rate ? (int) array->expand_rate : array->end; return arraylist_resize(array, new_size + 1); }