erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

63 行
1.6 KiB

  1. #ifndef _LIFO_H
  2. #define _LIFO_H
  3. typedef struct lifo_t {
  4. void *head;
  5. void *tail;
  6. unsigned long long count;
  7. } lifo_t;
  8. typedef struct lifo_handle_t {
  9. void *next;
  10. void *prev;
  11. } lifo_handle_t;
  12. #define lifo_init(lifo) \
  13. do { \
  14. lifo_t *__q = lifo; \
  15. __q->head = NULL; \
  16. __q->tail = NULL; \
  17. __q->count = 0; \
  18. } while (0)
  19. #define __lifo_push(lifo, p, h) \
  20. do { \
  21. lifo_t *__q = lifo; \
  22. __typeof__ (p) e = p; \
  23. e->h.next = __q->head; \
  24. e->h.prev = NULL; \
  25. if (__q->head == NULL) { \
  26. __q->tail = e; \
  27. } else { \
  28. __typeof__ (e) t = __q->head; \
  29. t->h.prev = e; \
  30. } \
  31. __q->head = e; \
  32. __q->count++; \
  33. } while (0)
  34. #define lifo_push(lifo, p) __lifo_push (lifo, p, lifo_handle)
  35. #define __lifo_pop(lifo, p, h) \
  36. do { \
  37. lifo_t *__q = lifo; \
  38. p = __q->head; \
  39. if (p != NULL) { \
  40. __q->count--; \
  41. __q->head = p->h.next; \
  42. if (__q->head != NULL) { \
  43. __typeof__ (p) t = __q->head; \
  44. t->h.prev = NULL; \
  45. } else { \
  46. __q->tail = NULL; \
  47. } \
  48. } \
  49. } while (0)
  50. #define lifo_pop(lifo, p) __lifo_pop (lifo, p, lifo_handle)
  51. #define lifo_length(lifo) ((lifo)->count)
  52. #define lifo_empty(lifo) ((lifo)->count == 0)
  53. #endif /* _LIFO_H */