bglibs
gqueue.h
1 #ifndef BGLIBS__GENERIC_QUEUE__H__
2 #define BGLIBS__GENERIC_QUEUE__H__
3 
4 #include "adt_common.h"
5 
21 {
23  struct gqueue_node* next;
25  char data[0];
26 };
27 
29 struct gqueue
30 {
32  struct gqueue_node* head;
34  struct gqueue_node* tail;
36  unsigned count;
37 };
38 
39 int gqueue_push(struct gqueue* d, unsigned datasize, const void* data,
40  adt_copy_fn* fn);
41 void* gqueue_top(const struct gqueue* q);
42 void gqueue_pop(struct gqueue* q, adt_free_fn* fn);
43 
45 #define GQUEUE_DECL(PREFIX,TYPE) \
46 extern int PREFIX##_push(struct gqueue* q, TYPE const* data); \
47 extern TYPE* PREFIX##_top(struct gqueue* q); \
48 extern void PREFIX##_pop(struct gqueue* q);
49 
51 #define GQUEUE_PUSH_DEFN(PREFIX,TYPE,COPY) \
52 int 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) \
58 TYPE* PREFIX##_top(struct gqueue* q) { \
59  return (q->head == 0) ? 0 : (TYPE*)q->head->data; \
60 }
61 
63 #define GQUEUE_POP_DEFN(PREFIX,FREE) \
64 void PREFIX##_pop(struct gqueue* q) { \
65  gqueue_pop(q, (adt_free_fn*)(FREE)); \
66 }
67 
71 #define GQUEUE_DEFN(PREFIX,TYPE,COPY,FREE) \
72 GQUEUE_PUSH_DEFN(PREFIX,TYPE,COPY) \
73 GQUEUE_TOP_DEFN(PREFIX,TYPE) \
74 GQUEUE_POP_DEFN(PREFIX,FREE)
75 
78 #endif
str::s
char * s
Definition: str.h:36
ghash::count
unsigned count
Definition: ghash.h:31
adt_hash_t
unsigned long adt_hash_t
Definition: adt_common.h:10
adt_cmp_fn
int adt_cmp_fn(const void *, const void *)
Definition: adt_common.h:20
adt_copy_fn
int adt_copy_fn(void *, const void *)
Definition: adt_common.h:16
ghash_rehash
int ghash_rehash(struct ghash *d)
Definition: ghash_rehash.c:8
ghash_entry_hash
#define ghash_entry_hash(P)
Definition: ghash.h:55
gqueue_node
Definition: gqueue.h:20
ghash_free
void ghash_free(struct ghash *d)
Definition: ghash_free.c:7
ghash::size
unsigned size
Definition: ghash.h:33
ghashiter::index
unsigned index
Definition: ghash.h:222
ghash
Definition: ghash.h:25
ghash::entrysize
unsigned long entrysize
Definition: ghash.h:38
ghashiter_valid
int ghashiter_valid(const struct ghashiter *iter)
Definition: ghash_iter.c:21
ghashiter::entry
void * entry
Definition: ghash.h:224
gqueue_pop
void gqueue_pop(struct gqueue *q, adt_free_fn *fn)
Definition: gqueue_pop.c:9
ghash_foreach
void ghash_foreach(struct ghash *d, void(*fn)(void *entry))
Definition: ghash_foreach.c:4
ghashiter::ghashp
const struct ghash * ghashp
Definition: ghash.h:220
ghash::keycopy
adt_copy_fn * keycopy
Definition: ghash.h:45
str::len
unsigned len
Definition: str.h:40
ghash::keysize
unsigned long keysize
Definition: ghash.h:36
ghash_entry_dataptr
#define ghash_entry_dataptr(P, L)
Definition: ghash.h:60
gqueue::head
struct gqueue_node * head
Definition: gqueue.h:32
ghash_remove
int ghash_remove(struct ghash *d, const void *key)
Definition: ghash_remove.c:12
gqueue::tail
struct gqueue_node * tail
Definition: gqueue.h:34
ghash_insert
void ghash_insert(struct ghash *d, void *e)
Definition: ghash_insert.c:4
obuf_putstr
#define obuf_putstr(out, str)
Definition: obuf.h:89
ghashiter
Definition: ghash.h:217
ghash_find
void ** ghash_find(struct ghash *d, const void *key)
Definition: ghash_get.c:7
ghash::keyfree
adt_free_fn * keyfree
Definition: ghash.h:49
gqueue
Definition: gqueue.h:29
ghash::datacopy
adt_copy_fn * datacopy
Definition: ghash.h:47
ghash_rebuild
int ghash_rebuild(struct ghash *d)
Definition: ghash_rebuild.c:9
ghash_get
void * ghash_get(struct ghash *d, const void *key)
Definition: ghash_get.c:37
gqueue_node::next
struct gqueue_node * next
Definition: gqueue.h:23
ghash::keycmp
adt_cmp_fn * keycmp
Definition: ghash.h:43
ghash_set
void * ghash_set(struct ghash *d, const void *key, const void *data)
Definition: ghash_set.c:5
ghashiter_first
void ghashiter_first(struct ghashiter *iter, const struct ghash *h)
Definition: ghash_iter.c:14
gqueue_node::data
char data[0]
Definition: gqueue.h:25
ghashiter_next
void ghashiter_next(struct ghashiter *iter)
Definition: ghash_iter.c:29
adt_hash_fn
adt_hash_t adt_hash_fn(const void *)
Definition: adt_common.h:22
outbuf
obuf outbuf
Definition: obuf_stdout.c:7
gqueue_top
void * gqueue_top(const struct gqueue *q)
Definition: gqueue_top.c:5
ghash_add
void * ghash_add(struct ghash *d, const void *key, const void *data)
Definition: ghash_add.c:74
adt_free_fn
void adt_free_fn(void *)
Definition: adt_common.h:12
ghash_search
void * ghash_search(struct ghash *d, int(*fn)(const void *entry))
Definition: ghash_search.c:5
ghash_init
void ghash_init(struct ghash *d, unsigned long keysize, unsigned long entrysize, adt_hash_fn *hashfn, adt_cmp_fn *keycmp, adt_copy_fn *keycopy, adt_copy_fn *datacopy, adt_free_fn *keyfree, adt_free_fn *datafree)
Definition: ghash_init.c:4
str::size
unsigned size
Definition: str.h:42
ghash::table
void ** table
Definition: ghash.h:29
ghash::datafree
adt_free_fn * datafree
Definition: ghash.h:51
gqueue_push
int gqueue_push(struct gqueue *d, unsigned datasize, const void *data, adt_copy_fn *fn)
Definition: gqueue_push.c:8
gqueue::count
unsigned count
Definition: gqueue.h:36
ghash_entry_keyptr
#define ghash_entry_keyptr(P)
Definition: ghash.h:57
ghash::hashfn
adt_hash_fn * hashfn
Definition: ghash.h:41
str
Definition: str.h:30
obuf_putc
int obuf_putc(obuf *out, char ch)
Definition: obuf_putc.c:4