array.c 2.2 KB

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