array.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "precompile.h"
  2. #include "memutil.h"
  3. #include "array.h"
  4. #define DEFAULT_NUM 15
  5. TOOLKIT_API int array_empty(const array_header_t *a)
  6. {
  7. return ((a == NULL) || (a->nelts == 0));
  8. }
  9. TOOLKIT_API array_header_t *array_make(int nelts, int elt_size)
  10. {
  11. array_header_t *arr = MALLOC_T(array_header_t);
  12. if (arr) {
  13. if (nelts <= 0)
  14. nelts = DEFAULT_NUM;
  15. arr->elts = malloc(elt_size * nelts);
  16. if (arr->elts) {
  17. arr->elt_size = elt_size;
  18. arr->nelts = 0;
  19. arr->nalloc = nelts;
  20. } else {
  21. free(arr);
  22. arr = NULL;
  23. }
  24. }
  25. return arr;
  26. }
  27. TOOLKIT_API void array_free(array_header_t *arr)
  28. {
  29. free(arr->elts);
  30. free(arr);
  31. }
  32. TOOLKIT_API void *array_push(array_header_t *arr)
  33. {
  34. array_check_expand(&arr->elts, arr->elt_size, arr->nelts, &arr->nalloc);
  35. return arr->elts + (arr->elt_size * (arr->nelts++));
  36. }
  37. TOOLKIT_API void *array_pop(array_header_t *arr)
  38. {
  39. if (array_empty(arr))
  40. return NULL;
  41. return arr->elts + (arr->elt_size * (--arr->nelts));
  42. }
  43. TOOLKIT_API void array_clear(array_header_t *arr)
  44. {
  45. arr->nelts = 0;
  46. }
  47. TOOLKIT_API void array_cat(array_header_t *dst,const array_header_t *src)
  48. {
  49. int elt_size = dst->elt_size;
  50. if (dst->nelts + src->nelts > dst->nalloc) {
  51. int new_size = (dst->nalloc <= 0) ? 1 : dst->nalloc * 2;
  52. char *new_data;
  53. while (dst->nelts + src->nelts > new_size) {
  54. new_size *= 2;
  55. }
  56. new_data = malloc(elt_size * new_size);
  57. memcpy(new_data, dst->elts, dst->nalloc * elt_size);
  58. free(dst->elts);
  59. dst->elts = new_data;
  60. dst->nalloc = new_size;
  61. }
  62. memcpy(dst->elts + dst->nelts * elt_size, src->elts,
  63. elt_size * src->nelts);
  64. dst->nelts += src->nelts;
  65. }
  66. TOOLKIT_API array_header_t *array_copy(const array_header_t *arr)
  67. {
  68. array_header_t *res = array_make(arr->nelts, arr->elt_size);
  69. memcpy(res->elts, arr->elts, arr->elt_size * arr->nelts);
  70. res->nelts = arr->nelts;
  71. memset(res->elts + res->elt_size * res->nelts, 0,
  72. res->elt_size * (res->nalloc - res->nelts));
  73. return res;
  74. }
  75. TOOLKIT_API void array_reserve(array_header_t *arr, int cnt)
  76. {
  77. if (arr->nalloc < cnt) {
  78. arr->elts = realloc(arr->elts, arr->elt_size * cnt);
  79. arr->nalloc = cnt;
  80. }
  81. }
  82. TOOLKIT_API void toolkit_array_free2(array_header_t *arr)
  83. {
  84. array_free2(arr);
  85. }