erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

63 linhas
1.6 KiB

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