util: Cope with LONG_BIT not being defined on Windows.
[mesa.git] / src / util / list.h
index 287a4946dc6ea3e5ac18264803a0f7092c95a7ae..b98ce59ff77d6c6344f6147fe13214b022c7a863 100644 (file)
@@ -38,7 +38,9 @@
 #define _UTIL_LIST_H_
 
 
+#include <stdbool.h>
 #include <stddef.h>
+#include <assert.h>
 
 
 struct list_head
@@ -92,6 +94,28 @@ static inline void list_delinit(struct list_head *item)
     item->prev = item;
 }
 
+static inline bool list_empty(struct list_head *list)
+{
+   return list->next == list;
+}
+
+static inline unsigned list_length(struct list_head *list)
+{
+   struct list_head *node;
+   unsigned length = 0;
+   for (node = list->next; node != list; node = node->next)
+      length++;
+   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)
@@ -116,6 +140,13 @@ static inline void list_delinit(struct list_head *item)
             - ((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);                                         \