Initial import
[umurmur.git] / src / list.h
diff --git a/src/list.h b/src/list.h
new file mode 100644 (file)
index 0000000..37ec739
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef LIST_H_87698769870987
+#define LIST_H_87698769870987
+
+struct dlist {
+       struct dlist *next, *prev;
+};
+
+#define init_list_entry(ptr) \
+        do { \
+            (ptr)->prev = ptr; (ptr)->next = ptr; } \
+        while(0);
+#define declare_list(_name_) struct dlist _name_ = {&(_name_), &(_name_) }
+
+static inline void list_add_head(struct dlist *new, struct dlist *list)
+{
+       list->next->prev = new;
+       new->prev = list;
+       new->next = list->next;
+       list->next = new;
+}
+
+static inline void list_add_tail(struct dlist *new, struct dlist *list)
+{
+       list->prev->next = new;
+       new->prev = list->prev;
+       new->next = list;
+       list->prev = new;
+}
+static inline void list_del(struct dlist *entry)
+{
+       entry->next->prev = entry->prev;
+       entry->prev->next = entry->next;
+}
+
+static inline int list_empty(struct dlist *list)
+{
+       return list->next == list;
+}
+
+#define list_get_first(listhead) \
+        ((listhead)->next)
+
+#define list_get_next(_entry_) \
+        ((_entry_)->next)
+
+#define list_get_entry(entry, type, structmember) \
+        ((type *) ((char *)(entry) - (unsigned long)(&((type *)0)->structmember)))
+
+#define list_iterate(entry, listhead) \
+        for(entry = (listhead)->next; entry != (listhead); entry = entry->next)
+
+#define list_iterate_safe(entry, save, listhead) \
+        for(entry = (listhead)->next, save = entry->next; entry != (listhead); \
+            entry = save, save = save->next)
+
+
+#endif /* #ifndef LIST_H_87698769870987 */