|
|
- #ifndef _LIFO_H
- #define _LIFO_H
-
- typedef struct lifo_t {
- void *head;
- void *tail;
- unsigned long long count;
- } lifo_t;
-
- typedef struct lifo_handle_t {
- void *next;
- void *prev;
- } lifo_handle_t;
-
- #define lifo_init(lifo) \
- do { \
- lifo_t *__q = lifo; \
- __q->head = NULL; \
- __q->tail = NULL; \
- __q->count = 0; \
- } while (0)
-
- #define __lifo_push(lifo, p, h) \
- do { \
- lifo_t *__q = lifo; \
- __typeof__ (p) e = p; \
- e->h.next = __q->head; \
- e->h.prev = NULL; \
- if (__q->head == NULL) { \
- __q->tail = e; \
- } else { \
- __typeof__ (e) t = __q->head; \
- t->h.prev = e; \
- } \
- __q->head = e; \
- __q->count++; \
- } while (0)
-
- #define lifo_push(lifo, p) __lifo_push (lifo, p, lifo_handle)
-
- #define __lifo_pop(lifo, p, h) \
- do { \
- lifo_t *__q = lifo; \
- p = __q->head; \
- if (p != NULL) { \
- __q->count--; \
- __q->head = p->h.next; \
- if (__q->head != NULL) { \
- __typeof__ (p) t = __q->head; \
- t->h.prev = NULL; \
- } else { \
- __q->tail = NULL; \
- } \
- } \
- } while (0)
-
- #define lifo_pop(lifo, p) __lifo_pop (lifo, p, lifo_handle)
-
- #define lifo_length(lifo) ((lifo)->count)
-
- #define lifo_empty(lifo) ((lifo)->count == 0)
-
- #endif /* _LIFO_H */
|