RyanList.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #ifndef __RyanMqttList__
  2. #define __RyanMqttList__
  3. #ifdef __cplusplus
  4. extern "C"
  5. {
  6. #endif
  7. // 计算结构体成员偏移量的宏
  8. #define RyanOffsetOf(type, member) ((size_t)&(((type *)0)->member))
  9. // 通过成员指针获取包含该成员的结构体指针
  10. #define RyanContainerOf(ptr, type, member) \
  11. ((type *)((unsigned char *)(ptr) - RyanOffsetOf(type, member)))
  12. // 通过链表节点获取所属结构体的首地址
  13. #define RyanListEntry(list, type, member) \
  14. RyanContainerOf(list, type, member)
  15. // 获取链表第一个元素所属结构体
  16. #define RyanListFirstEntry(list, type, member) \
  17. RyanListEntry((list)->next, type, member)
  18. // 获取链表最后一个元素所属结构体
  19. #define RyanListPrevEntry(list, type, member) \
  20. RyanListEntry((list)->prev, type, member)
  21. // 正向遍历链表
  22. #define RyanListForEach(curr, list) \
  23. for ((curr) = (list)->next; (curr) != (list); (curr) = (curr)->next)
  24. // 反向遍历链表
  25. #define RyanListForEachPrev(curr, list) \
  26. for ((curr) = (list)->prev; (curr) != (list); (curr) = (curr)->prev)
  27. // 安全的正向遍历链表(支持遍历中删除)
  28. #define RyanListForEachSafe(curr, next, list) \
  29. for ((curr) = (list)->next, (next) = (curr)->next; \
  30. (curr) != (list); \
  31. (curr) = (next), (next) = (curr)->next)
  32. // 安全的反向遍历链表(支持遍历中删除)
  33. #define RyanListForEachPrevSafe(curr, next, list) \
  34. for ((curr) = (list)->prev, (next) = (curr)->prev; \
  35. (curr) != (list); \
  36. (curr) = (next), (next) = (curr)->prev)
  37. // 定义枚举类型
  38. // 定义结构体类型
  39. typedef struct RyanListNode
  40. {
  41. struct RyanListNode *next;
  42. struct RyanListNode *prev;
  43. } RyanList_t;
  44. /* extern variables-----------------------------------------------------------*/
  45. extern void RyanListInit(RyanList_t *list);
  46. extern void RyanListAdd(RyanList_t *node, RyanList_t *list);
  47. extern void RyanListAddTail(RyanList_t *node, RyanList_t *list);
  48. extern void RyanListDel(RyanList_t *entry);
  49. extern void RyanListDelInit(RyanList_t *entry);
  50. extern void RyanListMove(RyanList_t *node, RyanList_t *list);
  51. extern void RyanListMoveTail(RyanList_t *node, RyanList_t *list);
  52. extern int RyanListIsEmpty(RyanList_t *list);
  53. #ifdef __cplusplus
  54. }
  55. #endif
  56. #endif