diff options
| author | Mistivia <i@mistivia.com> | 2025-12-28 20:30:04 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-12-28 20:30:19 +0800 |
| commit | 86f6498768bd40c029504cdd5e711aa567248cb4 (patch) | |
| tree | 2a525c102e77e1ae1cd632c5c0550e75e19e7c6e | |
| parent | 6a299d9e7d9c3353394790b8048284a984fdfdc6 (diff) | |
modify pq
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | pqueue.h | 30 | ||||
| -rw-r--r-- | tests/test_pqueue.c | 7 |
3 files changed, 20 insertions, 21 deletions
@@ -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 @@ -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; } |
