da.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #ifndef DA_H
  2. #define DA_H
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5. #define CONCAT(a, b) CONCAT_INNER(a, b)
  6. #define CONCAT_INNER(a, b) a ## b
  7. #define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)
  8. #define DA_DEF_STRUCT(type, name) \
  9. struct name { \
  10. type *items; \
  11. size_t size; \
  12. size_t cap; \
  13. }
  14. #define DA_DEF_STRUCT_ITEM(type, name) \
  15. struct { \
  16. type *items; \
  17. size_t size; \
  18. size_t cap; \
  19. } name
  20. #define DA_CREATE(da) \
  21. do { \
  22. (da).cap = 16; \
  23. (da).size = 0; \
  24. (da).items = calloc((da).cap, sizeof(*(da).items)); \
  25. } while(0)
  26. #define DA_DESTROY(da) \
  27. do { \
  28. free((da).items); \
  29. } while(0)
  30. #define DA_CLEAR(da) \
  31. do { \
  32. (da).size = 0; \
  33. } while(0)
  34. #define _DA_DELETE(da, index, i) \
  35. do { \
  36. if ( index > (da).size ) { \
  37. break; \
  38. } \
  39. memmove((da).items+index, (da).items+index+1, \
  40. (da).cap - (index+1)); \
  41. --(da).size; \
  42. } while(0)
  43. #define DA_DELETE(da, index) \
  44. _DA_DELETE(da, index, UNIQUE_NAME(_i))
  45. #define _DA_INSERT(da, item, index, i) \
  46. do { \
  47. if ( index > (da.size) ) { \
  48. break; \
  49. } \
  50. if ( (da).size+1 >= (da).cap ) { \
  51. (da).cap *= 2; \
  52. (da).items = realloc((da).items, \
  53. (da).cap * sizeof(*(da).items)); \
  54. } \
  55. memmove((da).items+index+1, (da).items+index, \
  56. (da).cap - index); \
  57. (da).items[index] = item; \
  58. (da).size++; \
  59. } while(0)
  60. #define DA_INSERT(da, item, index) \
  61. _DA_INSERT(da, item, index, UNIQUE_NAME(_i))
  62. #define DA_APPEND(da, item) \
  63. do { \
  64. if ( (da).size+1 >= (da).cap ) { \
  65. (da).items = _realloc((da).items, \
  66. (da).cap, \
  67. ((da).cap*2) \
  68. * sizeof(*(da).items)); \
  69. (da).cap *= 2; \
  70. } \
  71. (da).items[(da).size++] = item; \
  72. } while(0)
  73. #define DA_TAIL(da) (da).items[(da).size-1]
  74. #define DA_ASSIGN(dst, src) \
  75. (dst).items = (src).items; \
  76. (dst).size = (src).size; \
  77. (dst).cap = (src).cap;
  78. #include <stddef.h>
  79. void * _realloc(void *old, size_t old_size, size_t new_size);
  80. #if defined(DA_IMP) || defined(IMP)
  81. #include <stdlib.h>
  82. #include <string.h>
  83. void *
  84. _realloc(void *old, size_t old_size, size_t new_size)
  85. {
  86. return realloc(old, new_size);
  87. void *new = malloc(new_size);
  88. memset(new, 0, new_size);
  89. memcpy(new, old, old_size);
  90. free(old);
  91. return new;
  92. }
  93. #endif /* defined(DA_IMP) || defined(IMP) */
  94. #endif