/* Allocate and initialize dynamic array. param: cap desired capacity for the dyn array pre: none post: none ret: a non-null pointer to a dynArr of cap capacity and 0 elements in it. */ DynArr* createDynArr(int cap){ DynArr *r; assert(cap > 0); r = (DynArr *)malloc(sizeof( DynArr)); assert(r != 0); _initDynArr(r,cap); return r; }
/* Copy elements from a dynamic array to another dynamic array param: source pointer to the source dynamic array param: destination pointer to the destination dynamic array pre: s is not null and s is not empty post: destination is initialized post: the elements from source are copied to destination */ void copyDynArr(DynArr *source, DynArr *destination) { int i; assert(source->size > 0); _initDynArr(destination, source->capacity); /* copy elements to destination array */ for(i = 0; i < source->size; i++) destination->data[i] = source->data[i]; destination->size = source->size; }
/* Resizes the underlying array to be the size cap param: v pointer to the dynamic array param: cap the new desired capacity pre: v is not null post: v has capacity newCap */ void _dynArrSetCapacity(DynArr *v, int newCap) { int i; TYPE *oldData; int oldSize = v->size; oldData = v->data; printf("========Resizing========\n"); /* Create a new dyn array with larger underlying array */ _initDynArr(v, newCap); for(i = 0; i < oldSize; i++){ v->data[i] = oldData[i]; } v->size = oldSize; /* Remember, init did not free the original data */ free(oldData); }
/* Resizes the underlying array to be the size cap param: v pointer to the dynamic array param: cap the new desired capacity pre: v is not null post: v has capacity newCap */ void _dynArrSetCapacity(DynArr *v, int newCap) { int i; TYPE *oldData; int oldSize = v->size; oldData = v->data; printf("========Resizing========\n"); /* Create a new dyn array with larger underlying array */ _initDynArr(v, newCap); for(i = 0; i < oldSize; i++){ v->data[i] = oldData[i]; } v->size = oldSize; /* Remember, init did not free the original data */ free(oldData); #ifdef ALTERNATIVE int i; /* Create a new underlying array*/ TYPE *newData = (TYPE*)malloc(sizeof(TYPE)*newCap); assert(newData != 0); /* copy elements to it */ for(i = 0; i < v->size; i++) { newData[i] = v->data[i]; } /* Delete the oldunderlying array*/ free(v->data); /* update capacity and size and data*/ v->data = newData; v->capacity = newCap; #endif }