da.h 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #ifndef DA_H
  2. #define DA_H
  3. #include <stdlib.h>
  4. #define DA_DEF_STRUCT(type, name) \
  5. struct name { \
  6. type *items; \
  7. size_t size; \
  8. size_t cap; \
  9. }
  10. #define DA_DEF_STRUCT_ITEM(type, name) \
  11. struct { \
  12. type *items; \
  13. size_t size; \
  14. size_t cap; \
  15. } name
  16. #define DA_CREATE(da, item_size) \
  17. do { \
  18. da.cap = 16; \
  19. da.size = 0; \
  20. da.items = calloc(da.cap, item_size); \
  21. } while(0)
  22. #define DA_DESTROY(da) \
  23. do { \
  24. free(da.items); \
  25. } while(0)
  26. #define DA_CLEAR(da) \
  27. do { \
  28. da.size = 0; \
  29. } while(0)
  30. #define DA_DELETE(da, index) \
  31. do { \
  32. if ( index > da.size ) { \
  33. break; \
  34. } \
  35. for ( size_t i = index; i < da.size - 1; ++i ) { \
  36. da.items[i] = da.items[i+1]; \
  37. } \
  38. --da.size; \
  39. } while(0)
  40. #define DA_APPEND(da, item) \
  41. do { \
  42. if ( da.size == da.cap ) { \
  43. da.cap *= 2; \
  44. da.items = realloc(da.items, da.cap * sizeof(*da.items)); \
  45. } \
  46. da.items[da.size++] = item; \
  47. } while(0)
  48. #endif