From 99bb129812e6fb830a05dd7f789987ba11f69b96 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Wed, 24 Mar 2021 20:10:44 +0100 Subject: Added valueCompare parameter to cpque. --- examples/cpque.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/cpque.c (limited to 'examples') diff --git a/examples/cpque.c b/examples/cpque.c new file mode 100644 index 00000000..ae869832 --- /dev/null +++ b/examples/cpque.c @@ -0,0 +1,56 @@ +#include +#include + +// Implements c++ example: https://en.cppreference.com/w/cpp/container/priority_queue + +using_cvec(i, int); +using_cpque(imax, cvec_i); +using_cpque(imin, cvec_i, >); + +#define myless(left, right) ((left ^ 1) < (right ^ 1)) +static int cmp(const int *x, const int *y) { return myless(*y, *x) - myless(*x, *y); } +using_cpque(imix, cvec_i, <, cmp); + +#define PRINT_Q(Q) \ + void print_##Q(Q q) { \ + Q copy = Q##_clone(q); \ + while (!Q##_empty(copy)) { \ + printf("%d ", *Q##_top(©)); \ + Q##_pop(©); \ + } \ + puts(""); \ + Q##_del(©); \ + } + +PRINT_Q(cpque_imin) +PRINT_Q(cpque_imax) +PRINT_Q(cpque_imix) + + +int main() { + cpque_imax q = cpque_imax_init(); + + const int data[] = {1,8,5,6,3,4,0,9,7,2}; + + c_forrange (n, c_arraylen(data)) + cpque_imax_push(&q, n); + + print_cpque_imax(q); + + cpque_imin q2 = cpque_imin_init(); + cpque_imin_emplace_n(&q2, data, c_arraylen(data)); + + print_cpque_imin(q2); + + // Using myless cmp to compare elements. + cpque_imix q3 = cpque_imix_init(); + + c_forrange (n, c_arraylen(data)) + cpque_imix_push(&q3, n); + + print_cpque_imix(q3); + + cpque_imin_del(&q); + cpque_imax_del(&q2); + cpque_imix_del(&q3); +} \ No newline at end of file -- cgit v1.2.3