aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--pqueue.h30
-rw-r--r--tests/test_pqueue.c7
3 files changed, 20 insertions, 21 deletions
diff --git a/Makefile b/Makefile
index 3dfe832..8283dde 100644
--- a/Makefile
+++ b/Makefile
@@ -26,11 +26,11 @@ obj = $(src:.c=.o)
tests=$(shell ls tests/*.c)
tests_bin=$(tests:.c=.bin)
-all: libalgds.a
-
libalgds.a: $(obj)
ar cr $@ $^
+all: libalgds.a $(tests_bin)
+
install: libalgds.a
sudo mkdir -p /usr/local/include/algds
sudo cp *.h /usr/local/include/algds
diff --git a/pqueue.h b/pqueue.h
index 94ef0fc..cb48dd5 100644
--- a/pqueue.h
+++ b/pqueue.h
@@ -3,9 +3,10 @@
#include "vec.h"
-#define PQUEUE_DEF_AS(T, TV, A) \
+#define PQUEUE_DEF_AS(T, A) \
+ VECTOR_DEF_AS(T, A##Vec_); \
typedef struct { \
- TV vec; \
+ A##Vec_ vec; \
} A; \
void A##_init(A *self); \
A A##_create(); \
@@ -15,7 +16,7 @@
A A##_move(A *self); \
void A##_free(A *self);
-#define PQUEUE_DEF(T) PQUEUE_DEF_AS(T, T##Vector, T##PQueue)
+#define PQUEUE_DEF(T) PQUEUE_DEF_AS(T, T##PQueue)
PQUEUE_DEF(Int);
PQUEUE_DEF(Bool);
@@ -28,12 +29,13 @@ PQUEUE_DEF(Float);
PQUEUE_DEF(String);
PQUEUE_DEF(VoidPtr);
-#define PQUEUE_IMPL_AS(T, TV, A) \
+#define PQUEUE_IMPL_AS(T, A) \
+ VECTOR_IMPL_AS(T, A##Vec_); \
static int A##_cmp(A *self, int a, int b) { \
- return T##_cmp(*TV##_ref(&self->vec, a), *TV##_ref(&self->vec, b)); \
+ return T##_cmp(*A##Vec__ref(&self->vec, a), *A##Vec__ref(&self->vec, b)); \
} \
void A##_init(A *self) { \
- TV##_init(&self->vec); \
+ A##Vec__init(&self->vec); \
} \
A A##_create() { \
A self; \
@@ -41,10 +43,10 @@ PQUEUE_DEF(VoidPtr);
return self; \
} \
void A##_push(A *self, T elem) { \
- TV##_push_back(&self->vec, elem); \
+ A##Vec__push_back(&self->vec, elem); \
int i = self->vec.size - 1; \
while (i > 0 && A##_cmp(self, i, i / 2) > 0) { \
- TV##_swap(&self->vec, i, i / 2); \
+ A##Vec__swap(&self->vec, i, i / 2); \
i /= 2; \
} \
} \
@@ -61,14 +63,14 @@ PQUEUE_DEF(VoidPtr);
largest = right; \
} \
if (largest != idx) { \
- TV##_swap(&self->vec, largest, idx); \
+ A##Vec__swap(&self->vec, largest, idx); \
A##_heapify(self, largest); \
} \
} \
void A##_pop(A *self) { \
if (self->vec.size == 0) return; \
- memcpy(TV##_ref(&self->vec, 0), TV##_ref(&self->vec, self->vec.size - 1), sizeof(T)); \
- TV##_pop(&self->vec); \
+ memcpy(A##Vec__ref(&self->vec, 0), A##Vec__ref(&self->vec, self->vec.size - 1), sizeof(T)); \
+ A##Vec__pop(&self->vec); \
A##_heapify(self, 0); \
} \
T* A##_top(A *self) { \
@@ -77,13 +79,13 @@ PQUEUE_DEF(VoidPtr);
} \
A A##_move(A *self) { \
A dup; \
- dup.vec = TV##_move(&self->vec); \
+ dup.vec = A##Vec__move(&self->vec); \
return dup; \
} \
void A##_free(A *self) { \
- TV##_free(&self->vec); \
+ A##Vec__free(&self->vec); \
}
-#define PQUEUE_IMPL(T) PQUEUE_IMPL_AS(T, T##Vector, T##PQueue)
+#define PQUEUE_IMPL(T) PQUEUE_IMPL_AS(T, T##PQueue)
#endif
diff --git a/tests/test_pqueue.c b/tests/test_pqueue.c
index 3d61552..638db73 100644
--- a/tests/test_pqueue.c
+++ b/tests/test_pqueue.c
@@ -15,9 +15,6 @@ void MinInt_show(Int self, FILE* fp) {
Int_show(self, fp);
}
-VECTOR_DEF(MinInt);
-VECTOR_IMPL(MinInt);
-
PQUEUE_DEF(MinInt);
PQUEUE_IMPL(MinInt);
@@ -51,7 +48,7 @@ int main() {
MinIntPQueue_pop(&minpq);
}
assert(MinIntPQueue_top(&minpq) == NULL);
- MinIntVector_free(&minpq.vec);
+ MinIntPQueue_free(&minpq);
int elems2[10] = {-10, -8, -7, -9, -5, -6, -4, -2, -3, -1};
int expected[10] = {-10, -8, -7, -7, -5, -5, -4, -2, -2, -1};
@@ -61,7 +58,7 @@ int main() {
int *top = IntPQueue_top(&pq);
assert(*top == expected[i]);
}
- IntVector_free(&pq.vec);
+ IntPQueue_free(&pq);
printf("[PASS] pqueue\n");
return 0;
}