#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 */
|