util: Cope with LONG_BIT not being defined on Windows.
[mesa.git] / src / util / list.h
index 73b6272ca195b7646bb9acd23321e5d872023d21..b98ce59ff77d6c6344f6147fe13214b022c7a863 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <stdbool.h>
 #include <stddef.h>
+#include <assert.h>
 
 
 struct list_head
@@ -107,6 +108,14 @@ static inline unsigned list_length(struct list_head *list)
    return length;
 }
 
+static inline void list_validate(struct list_head *list)
+{
+   struct list_head *node;
+   assert(list->next->prev == list && list->prev->next == list);
+   for (node = list->next; node != list; node = node->next)
+      assert(node->next->prev == node && node->prev->next == node);
+}
+
 #define LIST_INITHEAD(__item) list_inithead(__item)
 #define LIST_ADD(__item, __list) list_add(__item, __list)
 #define LIST_ADDTAIL(__item, __list) list_addtail(__item, __list)
@@ -131,6 +140,13 @@ static inline unsigned list_length(struct list_head *list)
             - ((char *)&(sample)->member - (char *)(sample)))
 #endif
 
+#define list_first_entry(ptr, type, member) \
+        LIST_ENTRY(type, (ptr)->next, member)
+
+#define list_last_entry(ptr, type, member) \
+        LIST_ENTRY(type, (ptr)->prev, member)
+
+
 #define LIST_FOR_EACH_ENTRY(pos, head, member)                         \
    for (pos = NULL, pos = container_of((head)->next, pos, member);     \
        &pos->member != (head);                                         \