123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #include "precompile.h"
- #include "array.h"
- #define DEFAULT_NUM 15
- TOOLKIT_API int array_empty(const array_header_t *a)
- {
- return ((a == NULL) || (a->nelts == 0));
- }
- TOOLKIT_API array_header_t *array_make(int nelts, int elt_size)
- {
- array_header_t *arr = MALLOC_T(array_header_t);
- if (arr) {
- if (nelts <= 0)
- nelts = DEFAULT_NUM;
- arr->elts = malloc(elt_size * nelts);
- if (arr->elts) {
- arr->elt_size = elt_size;
- arr->nelts = 0;
- arr->nalloc = nelts;
- } else {
- free(arr);
- arr = NULL;
- }
- }
- return arr;
- }
- TOOLKIT_API void array_free(array_header_t *arr)
- {
- free(arr->elts);
- free(arr);
- }
- TOOLKIT_API void *array_push(array_header_t *arr)
- {
- array_check_expand((void**)&arr->elts, arr->elt_size, arr->nelts, &arr->nalloc);
- return arr->elts + (arr->elt_size * (arr->nelts++));
- }
- TOOLKIT_API void *array_pop(array_header_t *arr)
- {
- if (array_empty(arr))
- return NULL;
- return arr->elts + (arr->elt_size * (--arr->nelts));
- }
- TOOLKIT_API void array_clear(array_header_t *arr)
- {
- arr->nelts = 0;
- }
- TOOLKIT_API void array_cat(array_header_t *dst,const array_header_t *src)
- {
- int elt_size = dst->elt_size;
- if (dst->nelts + src->nelts > dst->nalloc) {
- int new_size = (dst->nalloc <= 0) ? 1 : dst->nalloc * 2;
- char *new_data;
- while (dst->nelts + src->nelts > new_size) {
- new_size *= 2;
- }
- new_data = malloc(elt_size * new_size);
- memcpy(new_data, dst->elts, dst->nalloc * elt_size);
- free(dst->elts);
- dst->elts = new_data;
- dst->nalloc = new_size;
- }
- memcpy(dst->elts + dst->nelts * elt_size, src->elts,
- elt_size * src->nelts);
- dst->nelts += src->nelts;
- }
- TOOLKIT_API array_header_t *array_copy(const array_header_t *arr)
- {
- array_header_t *res = array_make(arr->nelts, arr->elt_size);
- memcpy(res->elts, arr->elts, arr->elt_size * arr->nelts);
- res->nelts = arr->nelts;
- memset(res->elts + res->elt_size * res->nelts, 0,
- res->elt_size * (res->nalloc - res->nelts));
- return res;
- }
- TOOLKIT_API void array_reserve(array_header_t *arr, int cnt)
- {
- if (arr->nalloc < cnt) {
- arr->elts = realloc(arr->elts, arr->elt_size * cnt);
- arr->nalloc = cnt;
- }
- }
- TOOLKIT_API void toolkit_array_free2(array_header_t *arr)
- {
- array_free2(arr);
- }
|