libdrm_lists.h 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**************************************************************************
  2. *
  3. * SPDX-FileCopyrightText: 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
  4. * SPDX-License-Identifier: MIT
  5. */
  6. /*
  7. * List macros heavily inspired by the Linux kernel
  8. * list handling. No list looping yet.
  9. */
  10. #include <stddef.h>
  11. typedef struct _drmMMListHead
  12. {
  13. struct _drmMMListHead *prev;
  14. struct _drmMMListHead *next;
  15. } drmMMListHead;
  16. #define DRMINITLISTHEAD(__item) \
  17. do{ \
  18. (__item)->prev = (__item); \
  19. (__item)->next = (__item); \
  20. } while (0)
  21. #define DRMLISTADD(__item, __list) \
  22. do { \
  23. (__item)->prev = (__list); \
  24. (__item)->next = (__list)->next; \
  25. (__list)->next->prev = (__item); \
  26. (__list)->next = (__item); \
  27. } while (0)
  28. #define DRMLISTADDTAIL(__item, __list) \
  29. do { \
  30. (__item)->next = (__list); \
  31. (__item)->prev = (__list)->prev; \
  32. (__list)->prev->next = (__item); \
  33. (__list)->prev = (__item); \
  34. } while(0)
  35. #define DRMLISTDEL(__item) \
  36. do { \
  37. (__item)->prev->next = (__item)->next; \
  38. (__item)->next->prev = (__item)->prev; \
  39. } while(0)
  40. #define DRMLISTDELINIT(__item) \
  41. do { \
  42. (__item)->prev->next = (__item)->next; \
  43. (__item)->next->prev = (__item)->prev; \
  44. (__item)->next = (__item); \
  45. (__item)->prev = (__item); \
  46. } while(0)
  47. #define DRMLISTENTRY(__type, __item, __field) \
  48. ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
  49. #define DRMLISTEMPTY(__item) ((__item)->next == (__item))
  50. #define DRMLISTSINGLE(__list) \
  51. (!DRMLISTEMPTY(__list) && ((__list)->next == (__list)->prev))
  52. #define DRMLISTFOREACH(__item, __list) \
  53. for ((__item) = (__list)->next; \
  54. (__item) != (__list); (__item) = (__item)->next)
  55. #define DRMLISTFOREACHSAFE(__item, __temp, __list) \
  56. for ((__item) = (__list)->next, (__temp) = (__item)->next; \
  57. (__item) != (__list); \
  58. (__item) = (__temp), (__temp) = (__item)->next)
  59. #define DRMLISTFOREACHSAFEREVERSE(__item, __temp, __list) \
  60. for ((__item) = (__list)->prev, (__temp) = (__item)->prev; \
  61. (__item) != (__list); \
  62. (__item) = (__temp), (__temp) = (__item)->prev)
  63. #define DRMLISTFOREACHENTRY(__item, __list, __head) \
  64. for ((__item) = DRMLISTENTRY(__typeof__(*__item), (__list)->next, __head); \
  65. &(__item)->__head != (__list); \
  66. (__item) = DRMLISTENTRY(__typeof__(*__item), \
  67. (__item)->__head.next, __head))
  68. #define DRMLISTFOREACHENTRYSAFE(__item, __temp, __list, __head) \
  69. for ((__item) = DRMLISTENTRY(__typeof__(*__item), (__list)->next, __head), \
  70. (__temp) = DRMLISTENTRY(__typeof__(*__item), \
  71. (__item)->__head.next, __head); \
  72. &(__item)->__head != (__list); \
  73. (__item) = (__temp), \
  74. (__temp) = DRMLISTENTRY(__typeof__(*__item), \
  75. (__temp)->__head.next, __head))
  76. #define DRMLISTJOIN(__list, __join) if (!DRMLISTEMPTY(__list)) { \
  77. (__list)->next->prev = (__join); \
  78. (__list)->prev->next = (__join)->next; \
  79. (__join)->next->prev = (__list)->prev; \
  80. (__join)->next = (__list)->next; \
  81. }