Go to the documentation of this file. 55 #define QUEUE_enque(TYPE, Q, V) queue_ ## TYPE ## _enque ((Q), (V)) 59 #define QUEUE_deque(TYPE, Q) queue_ ## TYPE ## _deque (Q) 63 #define QUEUE_peek(TYPE, Q) queue_ ## TYPE ## _peek (Q) 66 #define QUEUE_is_empty(TYPE, Q) queue_ ## TYPE ## _is_empty (Q) 70 #define QUEUE_alloc(TYPE, FREE_FUNC) queue_ ## TYPE ## _alloc (FREE_FUNC) 73 #define QUEUE_length(TYPE, Q) queue_ ## TYPE ## _length (Q) 76 #define QUEUE_free(TYPE, Q) queue_ ## TYPE ## _free (Q) 83 #define QUEUE_iterate(TYPE, Q, OPERATE, PARAM) \ 84 queue_ ## TYPE ## _iterate ((Q), (OPERATE), (PARAM)) 88 #define QUEUE_remove_elem(TYPE, Q, ITER) \ 89 queue_ ## TYPE ## _remove_elem ((Q), (ITER)) 93 #define QUEUE(TYPE) struct queue_ ## TYPE 94 #define QUEUE_ELEM(TYPE) struct queue_elem_ ## TYPE 95 #define QUEUE_ITER(TYPE) struct queue_iter_ ## TYPE 96 #define QUEUE_ITER_FUNC(TYPE) queue_ ## TYPE ## _operate_func 98 #define DEFINE_QUEUE_P(TYPE) \ 101 QUEUE_ELEM (TYPE) *next; \ 110 QUEUE_ELEM (TYPE) *p; \ 112 QUEUE_ELEM (TYPE) *prev; \ 118 QUEUE_ELEM (TYPE) *head; \ 119 QUEUE_ELEM (TYPE) *tail; \ 122 void (*free_func) (TYPE); \ 126 queue_ ## TYPE ## _enque (QUEUE (TYPE) *q, TYPE v) \ 128 QUEUE_ELEM (TYPE) *p = XNEW (QUEUE_ELEM (TYPE)); \ 130 gdb_assert (q != NULL); \ 133 if (q->tail == NULL) \ 146 queue_ ## TYPE ## _deque (QUEUE (TYPE) *q) \ 148 QUEUE_ELEM (TYPE) *p; \ 151 gdb_assert (q != NULL); \ 153 gdb_assert (p != NULL); \ 155 if (q->head == q->tail) \ 161 q->head = q->head->next; \ 170 queue_ ## TYPE ## _peek (QUEUE (TYPE) *q) \ 172 gdb_assert (q != NULL); \ 173 gdb_assert (q->head != NULL); \ 174 return q->head->data; \ 178 queue_ ## TYPE ## _is_empty (QUEUE (TYPE) *q) \ 180 gdb_assert (q != NULL); \ 181 return q->head == NULL; \ 185 queue_ ## TYPE ## _remove_elem (QUEUE (TYPE) *q, \ 186 QUEUE_ITER (TYPE) *iter) \ 188 gdb_assert (q != NULL); \ 189 gdb_assert (iter != NULL && iter->p != NULL); \ 191 if (iter->p == q->head || iter->p == q->tail) \ 193 if (iter->p == q->head) \ 194 q->head = iter->p->next; \ 195 if (iter->p == q->tail) \ 196 q->tail = iter->prev; \ 199 iter->prev->next = iter->p->next; \ 207 queue_ ## TYPE ## _iterate (QUEUE (TYPE) *q, \ 208 QUEUE_ITER_FUNC (TYPE) operate, \ 211 QUEUE_ELEM (TYPE) *next = NULL; \ 212 QUEUE_ITER (TYPE) iter = { NULL, NULL }; \ 214 gdb_assert (q != NULL); \ 216 for (iter.p = q->head; iter.p != NULL; iter.p = next) \ 218 next = iter.p->next; \ 219 if (!operate (q, &iter, iter.p->data, data)) \ 222 if (iter.p != NULL) \ 223 iter.prev = iter.p; \ 229 queue_ ## TYPE ## _alloc (void (*free_func) (TYPE)) \ 231 QUEUE (TYPE) *q = XNEW (QUEUE (TYPE)); \ 235 q->free_func = free_func; \ 240 queue_ ## TYPE ## _length (QUEUE (TYPE) *q) \ 242 QUEUE_ELEM (TYPE) *p; \ 245 gdb_assert (q != NULL); \ 247 for (p = q->head; p != NULL; p = p->next) \ 254 queue_ ## TYPE ## _free (QUEUE (TYPE) *q) \ 256 QUEUE_ELEM (TYPE) *p, *next; \ 258 gdb_assert (q != NULL); \ 260 for (p = q->head; p != NULL; p = next) \ 264 q->free_func (p->data); \ 271 #define DECLARE_QUEUE_P(TYPE) \ 276 queue_ ## TYPE ## _enque (QUEUE (TYPE) *q, TYPE v); \ 278 queue_ ## TYPE ## _deque (QUEUE (TYPE) *q); \ 279 extern int queue_ ## TYPE ## _is_empty (QUEUE (TYPE) *q); \ 280 extern QUEUE (TYPE) * \ 281 queue_ ## TYPE ## _alloc (void (*free_func) (TYPE)); \ 282 extern int queue_ ## TYPE ## _length (QUEUE (TYPE) *q); \ 284 queue_ ## TYPE ## _peek (QUEUE (TYPE) *q); \ 285 extern void queue_ ## TYPE ## _free (QUEUE (TYPE) *q); \ 286 typedef int QUEUE_ITER_FUNC(TYPE) (QUEUE (TYPE) *, \ 287 QUEUE_ITER (TYPE) *, \ 291 queue_ ## TYPE ## _iterate (QUEUE (TYPE) *q, \ 292 QUEUE_ITER_FUNC (TYPE) operate, \ 295 queue_ ## TYPE ## _remove_elem (QUEUE (TYPE) *q, \ 296 QUEUE_ITER (TYPE) *iter); \