ib_status_t ib_array_setn(ib_array_t *arr, size_t idx, void *val) { IB_FTRACE_INIT(); size_t r, c; void **data; /* Keep extending by ninit elements until the index fits in the array. */ while (idx >= arr->size) { r = arr->size / arr->ninit; /* If this will exceed the max, then reallocate the extents * to double its previous value to make room. */ if (r >= arr->nextents) { void *new_extents = (void *)ib_mpool_calloc(arr->mp, arr->nextents * 2, sizeof(void *)); if (new_extents == NULL) { IB_FTRACE_RET_STATUS(IB_EALLOC); } memcpy(new_extents, arr->extents, sizeof(void *) * arr->nextents); arr->extents = new_extents; arr->nextents *= 2; } ((void ***)arr->extents)[r] = (void **)ib_mpool_calloc(arr->mp, arr->ninit, sizeof(void *) ); arr->size += arr->ninit; } /* Calculate the row/column where the data resides. */ r = IB_ARRAY_EXTENT_INDEX(arr, idx); c = IB_ARRAY_DATA_INDEX(arr, idx, r); data = ((void ***)arr->extents)[r]; data[c] = val; /* Keep track of the number of elements stored. */ if (idx >= arr->nelts) { arr->nelts = idx + 1; } IB_FTRACE_RET_STATUS(IB_OK); }
ib_status_t ib_array_get(ib_array_t *arr, size_t idx, void *pval) { size_t r, c; void **data; if (idx >= arr->nelts) { *(void **)pval = NULL; return IB_EINVAL; } /* Calculate the row/column where the data resides. */ r = IB_ARRAY_EXTENT_INDEX(arr, idx); c = IB_ARRAY_DATA_INDEX(arr, idx, r); data = ((void ***)arr->extents)[r]; *(void **)pval = data[c]; return IB_OK; }
ib_status_t ib_array_get(ib_array_t *arr, size_t idx, void *pval) { IB_FTRACE_INIT(ib_array_get); size_t r, c; void **data; if (idx >= arr->nelts) { *(void **)pval = NULL; IB_FTRACE_RET_STATUS(IB_EINVAL); } /* Calculate the row/column where the data resides. */ r = IB_ARRAY_EXTENT_INDEX(arr, idx); c = IB_ARRAY_DATA_INDEX(arr, idx, r); data = ((void ***)arr->extents)[r]; *(void **)pval = data[c]; IB_FTRACE_RET_STATUS(IB_OK); }