| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #ifndef DA_H
- #define DA_H
- #define CONCAT(a, b) CONCAT_INNER(a, b)
- #define CONCAT_INNER(a, b) a ## b
- #define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)
- #include <stdlib.h>
- #define DA_DEF_STRUCT(type, name) \
- struct name { \
- type *items; \
- size_t size; \
- size_t cap; \
- }
- #define DA_DEF_STRUCT_ITEM(type, name) \
- struct { \
- type *items; \
- size_t size; \
- size_t cap; \
- } name
- #define DA_CREATE(da, item_size) \
- do { \
- (da).cap = 16; \
- (da).size = 0; \
- (da).items = calloc((da).cap, item_size); \
- } while(0)
- #define DA_DESTROY(da) \
- do { \
- free((da).items); \
- } while(0)
- #define DA_CLEAR(da) \
- do { \
- (da).size = 0; \
- } while(0)
- #define _DA_DELETE(da, index, i) \
- do { \
- if ( index > (da).size ) { \
- break; \
- } \
- memmove((da).items+index, (da).items+index+1, \
- (da).cap - (index+1)); \
- --(da).size; \
- } while(0)
- #define DA_DELETE(da, index) \
- _DA_DELETE(da, index, UNIQUE_NAME(_i))
- #define _DA_INSERT(da, item, index, i) \
- do { \
- if ( index > (da.size) ) { \
- break; \
- } \
- if ( (da).size+1 >= (da).cap ) { \
- (da).cap *= 2; \
- (da).items = realloc((da).items, \
- (da).cap * sizeof(*(da).items)); \
- } \
- memmove((da).items+index+1, (da).items+index, \
- (da).cap - index); \
- (da).items[index] = item; \
- (da).size++; \
- } while(0)
- #define DA_INSERT(da, item, index) \
- _DA_INSERT(da, item, index, UNIQUE_NAME(_i))
- #define DA_APPEND(da, item) \
- do { \
- if ( (da).size+1 >= (da).cap ) { \
- (da).cap *= 2; \
- (da).items = realloc((da).items, \
- (da).cap * sizeof(*(da).items)); \
- } \
- (da).items[(da).size++] = item; \
- } while(0)
- #define DA_TAIL(da) (da).items[(da).size-1]
- #endif
|