bglibs
bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h
1#ifndef BGLIBS__GENERIC_QUEUE__H__
2#define BGLIBS__GENERIC_QUEUE__H__
3
4#include "adt_common.h"
5
20struct gqueue_node
21{
23 struct gqueue_node* next;
25 char data[0];
26};
27
29struct gqueue
30{
32 struct gqueue_node* head;
34 struct gqueue_node* tail;
36 unsigned count;
37};
38
39int gqueue_push(struct gqueue* d, unsigned datasize, const void* data,
40 adt_copy_fn* fn);
41void* gqueue_top(const struct gqueue* q);
42void gqueue_pop(struct gqueue* q, adt_free_fn* fn);
43
45#define GQUEUE_DECL(PREFIX,TYPE) \
46extern int PREFIX##_push(struct gqueue* q, TYPE const* data); \
47extern TYPE* PREFIX##_top(struct gqueue* q); \
48extern void PREFIX##_pop(struct gqueue* q);
49
51#define GQUEUE_PUSH_DEFN(PREFIX,TYPE,COPY) \
52int PREFIX##_push(struct gqueue* q, TYPE const* data) { \
53 return gqueue_push(q, sizeof *data, data, (adt_copy_fn*)COPY); \
54}
55
57#define GQUEUE_TOP_DEFN(PREFIX,TYPE) \
58TYPE* PREFIX##_top(struct gqueue* q) { \
59 return (q->head == 0) ? 0 : (TYPE*)q->head->data; \
60}
61
63#define GQUEUE_POP_DEFN(PREFIX,FREE) \
64void PREFIX##_pop(struct gqueue* q) { \
65 gqueue_pop(q, (adt_free_fn*)(FREE)); \
66}
67
71#define GQUEUE_DEFN(PREFIX,TYPE,COPY,FREE) \
72GQUEUE_PUSH_DEFN(PREFIX,TYPE,COPY) \
73GQUEUE_TOP_DEFN(PREFIX,TYPE) \
74GQUEUE_POP_DEFN(PREFIX,FREE)
75
78#endif
void * gqueue_top(const struct gqueue *q)
Definition: gqueue_top.c:5
void gqueue_pop(struct gqueue *q, adt_free_fn *fn)
Definition: gqueue_pop.c:9
int gqueue_push(struct gqueue *q, unsigned datasize, const void *data, adt_copy_fn *fn)
Definition: gqueue_push.c:8
void adt_free_fn(void *)
Definition: adt_common.h:12
int adt_copy_fn(void *, const void *)
Definition: adt_common.h:16
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:21
struct gqueue_node * next
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:23
char data[0]
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:25
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:30
struct gqueue_node * head
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:32
struct gqueue_node * tail
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:34
unsigned count
Definition: bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/bglibs/gqueue.h:36