void cpArrayPush(cpArray *arr, void *object) { if(arr->num == arr->max){ arr->max *= 2; arr->arr = (void **)cprealloc(arr->arr, arr->max*sizeof(void**)); } arr->arr[arr->num] = object; arr->num++; }
// Add a new polyline to a polyline set. static void cpPolylineSetPush(cpPolylineSet *set, cpPolyline *line) { // grow set set->count++; if(set->count > set->capacity){ set->capacity *= 2; set->lines = cprealloc(set->lines, set->capacity*sizeof(cpPolyline)); } set->lines[set->count - 1] = line; }
// Grow the allocated memory for a polyline. static cpPolyline * cpPolylineGrow(cpPolyline *line, int count) { line->count += count; int capacity = line->capacity; while(line->count > capacity) capacity *= 2; if(line->capacity < capacity){ line->capacity = capacity; line = cprealloc(line, cpPolylineSizeForCapacity(capacity)); } return line; }
// Helper function for allocating contact point lists. static cpContact * addContactPoint(cpContact **arr, int *max, int *num) { if(*arr == NULL){ // Allocate the array if it hasn't been done. (*max) = 2; (*num) = 0; (*arr) = (cpContact *)cpmalloc((*max)*sizeof(cpContact)); } else if(*num == *max){ // Extend it if necessary. (*max) *= 2; (*arr) = (cpContact *)cprealloc(*arr, (*max)*sizeof(cpContact)); } cpContact *con = &(*arr)[*num]; (*num)++; return con; }
static void ResizeTable(cpSweep1D *sweep, int size) { sweep->max = size; sweep->table = (TableCell *)cprealloc(sweep->table, size*sizeof(TableCell)); }
static cpPolyline * cpPolylineShrink(cpPolyline *line) { line->capacity = line->count; return cprealloc(line, cpPolylineSizeForCapacity(line->count)); }