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_INC_CAP(da) \
  31. (da).items = _realloc((da).items, \
  32. (da).cap, \
  33. ((da).cap*2) * sizeof(*(da).items)); \
  34. (da).cap *= 2;
  35. #define DA_CLEAR(da) \
  36. do { \
  37. (da).size = 0; \
  38. } while(0)
  39. #define _DA_DELETE(da, index, i) \
  40. do { \
  41. if ( index > (da).size ) { \
  42. break; \
  43. } \
  44. memmove((da).items+index, (da).items+index+1, \
  45. (da).cap - (index+1)); \
  46. --(da).size; \
  47. } while(0)
  48. #define DA_DELETE(da, index) \
  49. _DA_DELETE(da, index, UNIQUE_NAME(_i))
  50. #define _DA_INSERT(da, item, index, i) \
  51. do { \
  52. if ( index > (da.size) ) { \
  53. break; \
  54. } \
  55. if ( (da).size+1 >= (da).cap ) { \
  56. DA_INC_CAP(da) \
  57. } \
  58. memmove((da).items+index+1, (da).items+index, \
  59. (da).cap - index-1); \
  60. (da).items[index] = item; \
  61. (da).size++; \
  62. } while(0)
  63. #define DA_INSERT(da, item, index) \
  64. _DA_INSERT(da, item, index, UNIQUE_NAME(_i))
  65. #define DA_APPEND(da, item) \
  66. do { \
  67. if ( (da).size+1 >= (da).cap ) { \
  68. DA_INC_CAP(da) \
  69. } \
  70. (da).items[(da).size++] = item; \
  71. } while(0)
  72. #define DA_TAIL(da) (da).items[(da).size-1]
  73. #define DA_ASSIGN(dst, src) \
  74. (dst).items = (src).items; \
  75. (dst).size = (src).size; \
  76. (dst).cap = (src).cap;
  77. #include <stddef.h>
  78. void * _realloc(void *old, size_t old_size, size_t new_size);
  79. #if defined(DA_IMP) || defined(IMP)
  80. #include <stdlib.h>
  81. #include <string.h>
  82. void *
  83. _realloc(void *old, size_t old_size, size_t new_size)
  84. {
  85. return realloc(old, new_size);
  86. void *new = malloc(new_size);
  87. memset(new, 0, new_size);
  88. memcpy(new, old, old_size);
  89. free(old);
  90. return new;
  91. }
  92. #endif /* defined(DA_IMP) || defined(IMP) */
  93. #endif