summaryrefslogtreecommitdiffhomepage
path: root/examples/cpque.c
blob: 00d2697e722f699e25909ddccf5b378efd677164 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Implements c++ example: https://en.cppreference.com/w/cpp/container/priority_queue
#include <stdio.h>
#include <stdbool.h>

// Example of dynamic compare function

static bool (*less_fn)(const int* x, const int* y);

#define i_val int
#define i_less less_fn
#define i_type ipque
#include <stc/cpque.h>

void print_queue(ipque q) {
    ipque copy = ipque_clone(q);
    while (!ipque_empty(&copy)) {
        printf("%d ", *ipque_top(&copy));
        ipque_pop(&copy);
    }
    puts("");
    ipque_drop(&copy);
}

static bool int_less(const int* x, const int* y) { return *x < *y; }
static bool int_greater(const int* x, const int* y) { return *x > *y; }
static bool int_lambda(const int* x, const int* y) { return (*x ^ 1) < (*y ^ 1); }

int main()
{
    const int data[] = {1,8,5,6,3,4,0,9,7,2}, n = c_arraylen(data);
    c_auto (ipque, q, q2, q3)  // init() and defered drop()
    {
        less_fn = int_less;
        c_forrange (i, n) 
            ipque_push(&q, data[i]);

        print_queue(q);

        less_fn = int_greater;
        c_apply_array(v, ipque_push(&q2, *v), const int, data, n);
        print_queue(q2);

        less_fn = int_lambda;
        c_apply_array(v, ipque_push(&q3, *v), const int, data, n);
        print_queue(q3);
    }
}