|
|
@@ -1,6 +1,11 @@
|
|
|
#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) \
|
|
|
@@ -17,41 +22,65 @@
|
|
|
size_t cap; \
|
|
|
} name
|
|
|
|
|
|
-#define DA_CREATE(da, item_size) \
|
|
|
- do { \
|
|
|
- da.cap = 16; \
|
|
|
- da.size = 0; \
|
|
|
- da.items = calloc(da.cap, item_size); \
|
|
|
+#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); \
|
|
|
+ free((da).items); \
|
|
|
} while(0)
|
|
|
|
|
|
#define DA_CLEAR(da) \
|
|
|
do { \
|
|
|
- da.size = 0; \
|
|
|
+ (da).size = 0; \
|
|
|
} while(0)
|
|
|
|
|
|
-#define DA_DELETE(da, index) \
|
|
|
+#define _DA_DELETE(da, index, i) \
|
|
|
do { \
|
|
|
- if ( index > da.size ) { \
|
|
|
+ if ( index > (da).size ) { \
|
|
|
break; \
|
|
|
} \
|
|
|
- for ( size_t i = index; i < da.size - 1; ++i ) { \
|
|
|
- da.items[i] = da.items[i+1]; \
|
|
|
+ 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)); \
|
|
|
} \
|
|
|
- --da.size; \
|
|
|
+ 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 == da.cap ) { \
|
|
|
- da.cap *= 2; \
|
|
|
- da.items = realloc(da.items, da.cap * sizeof(*da.items)); \
|
|
|
+ if ( (da).size+1 >= (da).cap ) { \
|
|
|
+ (da).cap *= 2; \
|
|
|
+ (da).items = realloc((da).items, \
|
|
|
+ (da).cap * sizeof(*(da).items)); \
|
|
|
} \
|
|
|
- da.items[da.size++] = item; \
|
|
|
+ (da).items[(da).size++] = item; \
|
|
|
} while(0)
|
|
|
|
|
|
+#define DA_TAIL(da) (da).items[(da).size-1]
|
|
|
+
|
|
|
#endif
|