]> wimlib.net Git - wimlib/blobdiff - src/list.h
Win32 apply: More special checks for root directory
[wimlib] / src / list.h
index fec02bbb514053751f8b6e4cb60f85f8bce9bac6..2991f46a1fed17d0ec36cbf5e7cc750deaee17e4 100644 (file)
@@ -8,20 +8,6 @@
 
 #include <stddef.h>
 
-/**
- * container_of - cast a member of a structure out to the containing structure
- * @ptr:       the pointer to the member.
- * @type:      the type of the container struct this is embedded in.
- * @member:    the name of the member within the struct.
- *
- */
-#ifndef container_of
-#define container_of(ptr, type, member) ({                     \
-       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
-       (type *)( (char *)__mptr - offsetof(type,member) );})
-#endif
-
-
 struct list_head {
        struct list_head *next, *prev;
 };
@@ -133,6 +119,85 @@ static inline int list_empty(const struct list_head *head)
        return head->next == head;
 }
 
+static inline void __list_splice(const struct list_head *list,
+                                struct list_head *prev,
+                                struct list_head *next)
+{
+       struct list_head *first = list->next;
+       struct list_head *last = list->prev;
+
+       first->prev = prev;
+       prev->next = first;
+
+       last->next = next;
+       next->prev = last;
+}
+
+/**
+ * list_splice - join two lists, this is designed for stacks
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ */
+static inline void list_splice(const struct list_head *list,
+                               struct list_head *head)
+{
+       if (!list_empty(list))
+               __list_splice(list, head, head->next);
+}
+
+/* Move the entire list @old to the list @new, overwriting it. */
+static inline void list_transfer(struct list_head *old,
+                                struct list_head *new)
+{
+       struct list_head *prev, *next;
+
+       if (list_empty(old)) {
+               INIT_LIST_HEAD(new);
+       } else {
+               prev = old->prev;
+               next = old->next;
+               new->next = next;
+               new->prev = prev;
+               prev->next = new;
+               next->prev = new;
+       }
+}
+
+/**
+ * list_move - delete from one list and add as another's head
+ * @list: the entry to move
+ * @head: the head that will precede our entry
+ */
+static inline void list_move(struct list_head *list, struct list_head *head)
+{
+       list_del(list);
+       list_add(list, head);
+}
+
+/**
+ * list_move_tail - delete from one list and add as another's tail
+ * @list: the entry to move
+ * @head: the head that will follow our entry
+ */
+static inline void list_move_tail(struct list_head *list,
+                                 struct list_head *head)
+{
+       list_del(list);
+       list_add_tail(list, head);
+}
+
+/**
+ * list_splice_tail - join two lists, each list being a queue
+ * @list: the new list to add.
+ * @head: the place to add it in the first list.
+ */
+static inline void list_splice_tail(struct list_head *list,
+                               struct list_head *head)
+{
+       if (!list_empty(list))
+               __list_splice(list, head->prev, head);
+}
+
 /**
  * list_entry - get the struct for this entry
  * @ptr:       the &struct list_head pointer.