RyanMqttList.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef __RyanMqttList__
  2. #define __RyanMqttList__
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. // 计算结构体成员偏移量的宏
  7. #define RyanMqttOffsetOf(type, member) ((size_t)&(((type *)0)->member))
  8. // 通过成员指针获取包含该成员的结构体指针
  9. #define RyanMqttContainerOf(ptr, type, member) ((type *)((unsigned char *)(ptr) - RyanMqttOffsetOf(type, member)))
  10. // 通过链表节点获取所属结构体的首地址
  11. #define RyanMqttListEntry(list, type, member) RyanMqttContainerOf(list, type, member)
  12. // 获取链表第一个元素所属结构体
  13. #define RyanMqttListFirstEntry(list, type, member) RyanMqttListEntry((list)->next, type, member)
  14. // 获取链表最后一个元素所属结构体
  15. #define RyanMqttListPrevEntry(list, type, member) RyanMqttListEntry((list)->prev, type, member)
  16. // 正向遍历链表
  17. #define RyanMqttListForEach(curr, list) for ((curr) = (list)->next; (curr) != (list); (curr) = (curr)->next)
  18. // 反向遍历链表
  19. #define RyanMqttListForEachPrev(curr, list) for ((curr) = (list)->prev; (curr) != (list); (curr) = (curr)->prev)
  20. // 安全的正向遍历链表(支持遍历中删除)
  21. #define RyanMqttListForEachSafe(curr, next, list) \
  22. for ((curr) = (list)->next, (next) = (curr)->next; (curr) != (list); (curr) = (next), (next) = (curr)->next)
  23. // 安全的反向遍历链表(支持遍历中删除)
  24. #define RyanMqttListForEachPrevSafe(curr, next, list) \
  25. for ((curr) = (list)->prev, (next) = (curr)->prev; (curr) != (list); (curr) = (next), (next) = (curr)->prev)
  26. // 定义枚举类型
  27. // 定义结构体类型
  28. typedef struct RyanMqttListNode
  29. {
  30. struct RyanMqttListNode *next;
  31. struct RyanMqttListNode *prev;
  32. } RyanMqttList_t;
  33. /* extern variables-----------------------------------------------------------*/
  34. extern void RyanMqttListInit(RyanMqttList_t *list);
  35. extern void RyanMqttListAdd(RyanMqttList_t *node, RyanMqttList_t *list);
  36. extern void RyanMqttListAddTail(RyanMqttList_t *node, RyanMqttList_t *list);
  37. extern void RyanMqttListDel(RyanMqttList_t *entry);
  38. extern void RyanMqttListDelInit(RyanMqttList_t *entry);
  39. extern void RyanMqttListMove(RyanMqttList_t *node, RyanMqttList_t *list);
  40. extern void RyanMqttListMoveTail(RyanMqttList_t *node, RyanMqttList_t *list);
  41. extern int RyanMqttListIsEmpty(RyanMqttList_t *list);
  42. #ifdef __cplusplus
  43. }
  44. #endif
  45. #endif