da.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #ifndef DA_H
  2. #define DA_H
  3. #define CONCAT(a, b) CONCAT_INNER(a, b)
  4. #define CONCAT_INNER(a, b) a ## b
  5. #define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)
  6. #include <stdlib.h>
  7. #define DA_DEF_STRUCT(type, name) \
  8. struct name { \
  9. type *items; \
  10. size_t size; \
  11. size_t cap; \
  12. }
  13. #define DA_DEF_STRUCT_ITEM(type, name) \
  14. struct { \
  15. type *items; \
  16. size_t size; \
  17. size_t cap; \
  18. } name
  19. #define DA_CREATE(da, item_size) \
  20. do { \
  21. (da).cap = 16; \
  22. (da).size = 0; \
  23. (da).items = calloc((da).cap, item_size); \
  24. } while(0)
  25. #define DA_DESTROY(da) \
  26. do { \
  27. free((da).items); \
  28. } while(0)
  29. #define DA_CLEAR(da) \
  30. do { \
  31. (da).size = 0; \
  32. } while(0)
  33. #define _DA_DELETE(da, index, i) \
  34. do { \
  35. if ( index > (da).size ) { \
  36. break; \
  37. } \
  38. memmove((da).items+index, (da).items+index+1, \
  39. (da).cap - (index+1)); \
  40. --(da).size; \
  41. } while(0)
  42. #define DA_DELETE(da, index) \
  43. _DA_DELETE(da, index, UNIQUE_NAME(_i))
  44. #define _DA_INSERT(da, item, index, i) \
  45. do { \
  46. if ( index > (da.size) ) { \
  47. break; \
  48. } \
  49. if ( (da).size+1 >= (da).cap ) { \
  50. (da).cap *= 2; \
  51. (da).items = realloc((da).items, \
  52. (da).cap * sizeof(*(da).items)); \
  53. } \
  54. memmove((da).items+index+1, (da).items+index, \
  55. (da).cap - index); \
  56. (da).items[index] = item; \
  57. (da).size++; \
  58. } while(0)
  59. #define DA_INSERT(da, item, index) \
  60. _DA_INSERT(da, item, index, UNIQUE_NAME(_i))
  61. #define DA_APPEND(da, item) \
  62. do { \
  63. if ( (da).size+1 >= (da).cap ) { \
  64. (da).cap *= 2; \
  65. (da).items = realloc((da).items, \
  66. (da).cap * sizeof(*(da).items)); \
  67. } \
  68. (da).items[(da).size++] = item; \
  69. } while(0)
  70. #define DA_TAIL(da) (da).items[(da).size-1]
  71. #endif