Ver Fonte

[da.h] Updating to most up to date version

Vinicius Teshima há 1 ano atrás
pai
commit
eef142eb5b
1 ficheiros alterados com 45 adições e 16 exclusões
  1. 45 16
      include/toolbox/da.h

+ 45 - 16
include/toolbox/da.h

@@ -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