Skip to content

Commit

Permalink
Simplified extend.h a bit.
Browse files Browse the repository at this point in the history
  • Loading branch information
tylov committed Jul 3, 2023
1 parent e25dec0 commit 433e6fd
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 18 deletions.
5 changes: 4 additions & 1 deletion include/stc/extend.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ typedef struct {
i_type get;
} c_PASTE(i_type, _ext);

#define c_extend(self) c_container_of(self, _cx_MEMB(_ext), get)
#define c_extend() c_container_of(self, _cx_MEMB(_ext), get)
// Note: i_less: c_extend() accessible for cpque types
// i_cmp: c_extend() accessible for csmap and csset types
// i_hash/i_eq: c_extend() accessible for cmap and cset types

#define i_is_forward
#define _i_inc <stc/i_base.h>
Expand Down
33 changes: 16 additions & 17 deletions misc/examples/functor.c
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
// Implements c++ example: https://en.cppreference.com/w/cpp/container/priority_queue
// Example of per-instance less-function on a single priority queue type
//
// Note: i_less: has self for cpque types only
// i_cmp: has self for csmap and csset types only
// i_hash/i_eq: has self for cmap and cset types only

#include <stdio.h>

#define i_type IPQue
#define i_base cpque
#define i_val int
#define i_extend bool (*less)(const int*, const int*);
#define i_less(x, y) c_extend(self)->less(x, y)
#define i_extend bool(*less)(const int*, const int*);
#define i_less(x, y) c_extend()->less(x, y)
// Note: i_less: c_extend() accessible for cpque types
// i_cmp: c_extend() accessible for csmap and csset types
// i_hash/i_eq: c_extend() accessible for cmap and cset types
#include <stc/extend.h>

void print_queue(const char* name, IPQue_ext q) {
// NB: make a clone because there is no way to traverse
// priority_queue's content without erasing the queue.
// priority queue's content without erasing the queue.
IPQue_ext copy = {q.less, IPQue_clone(q.get)};

for (printf("%s: \t", name); !IPQue_empty(&copy.get); IPQue_pop(&copy.get))
Expand All @@ -34,24 +34,23 @@ int main()
{
const int data[] = {1,8,5,6,3,4,0,9,7,2}, n = c_arraylen(data);
printf("data: \t");
c_forrange (i, n)
printf("%d ", data[i]);
c_forrange (i, n) printf("%d ", data[i]);
puts("");

IPQue_ext q1 = {int_less}; // Max priority queue
IPQue_ext minq1 = {int_greater}; // Min priority queue
IPQue_ext q5 = {int_lambda}; // Using lambda to compare elements.

c_forrange (i, n)
IPQue_push(&q1.get, data[i]);
// Max priority queue
IPQue_ext q1 = {.less=int_less};
IPQue_put_n(&q1.get, data, n);
print_queue("q1", q1);

c_forrange (i, n)
IPQue_push(&minq1.get, data[i]);
// Min priority queue
IPQue_ext minq1 = {.less=int_greater};
IPQue_put_n(&minq1.get, data, n);
print_queue("minq1", minq1);

c_forrange (i, n)
IPQue_push(&q5.get, data[i]);
// Using lambda to compare elements.
IPQue_ext q5 = {.less=int_lambda};
IPQue_put_n(&q5.get, data, n);
print_queue("q5", q5);

c_drop(IPQue, &q1.get, &minq1.get, &q5.get);
Expand Down

0 comments on commit 433e6fd

Please sign in to comment.