]> wimlib.net Git - wimlib/blobdiff - include/wimlib/rbtree.h
Nonrecursive for_dentry_child()
[wimlib] / include / wimlib / rbtree.h
index bdb209dca78c9ff0148f3013d8cf112905586d49..3ae97a55c52282b2034f89d020ec05d58ef4a904 100644 (file)
@@ -1,39 +1,31 @@
 /*
-  Red Black Trees
-  (C) 1999  Andrea Arcangeli <andrea@suse.de>
-
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-  linux/include/linux/rbtree.h
-
-  To use rbtrees you'll have to implement your own insert and search cores.
-  This will avoid us to use callbacks and to drop drammatically performances.
-  I know it's not the cleaner way,  but in C (not in C++) to get
-  performances and genericity...
-
-  See Documentation/rbtree.txt for documentation and samples.
-*/
-
-#ifndef        _LINUX_RBTREE_H
-#define        _LINUX_RBTREE_H
+ *  Red Black Trees
+ *  Copyright (C) 1999  Andrea Arcangeli <andrea@suse.de>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef        _RBTREE_H
+#define        _RBTREE_H
 
 #include <stdint.h>
 #include <stddef.h>
+#include <stdbool.h>
 
 struct rb_node {
-       uintptr_t  __rb_parent_color;
+       uintptr_t __rb_parent_color;
        struct rb_node *rb_right;
        struct rb_node *rb_left;
 };
@@ -42,20 +34,60 @@ struct rb_root {
        struct rb_node *rb_node;
 };
 
-
-#define rb_parent(r)   ((struct rb_node *)((r)->__rb_parent_color & ~3))
 #define        rb_entry(ptr, type, member) container_of(ptr, type, member)
 
-extern void rb_insert_color(struct rb_node *, struct rb_root *);
-extern void rb_erase(struct rb_node *, struct rb_root *);
+#define RB_ROOT        (struct rb_root) { NULL, }
+
+static inline bool
+rb_empty_root(const struct rb_root *root)
+{
+       return root->rb_node == NULL;
+}
+
+static inline struct rb_node *
+rb_parent(const struct rb_node *node)
+{
+       return (struct rb_node *)(node->__rb_parent_color & ~1);
+}
 
-static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
-                               struct rb_node ** rb_link)
+/* 'empty' nodes are nodes that are known not to be inserted in an rbtree */
+static inline bool
+rb_empty_node(const struct rb_node *node)
+{
+       return node->__rb_parent_color == (uintptr_t)node;
+}
+
+static inline void
+rb_clear_node(struct rb_node *node)
+{
+       node->__rb_parent_color = (uintptr_t)node;
+}
+
+extern void
+rb_insert_color(struct rb_node *node, struct rb_root *root);
+
+extern void
+rb_erase(struct rb_node *node, struct rb_root *root);
+
+extern struct rb_node *
+rb_first(const struct rb_root *root);
+
+extern struct rb_node *
+rb_first_postorder(const struct rb_root *root);
+
+extern struct rb_node *
+rb_next(const struct rb_node *node);
+
+extern struct rb_node *
+rb_next_postorder(const struct rb_node *node, const struct rb_node *parent);
+
+static inline void
+rb_link_node(struct rb_node *node, struct rb_node *parent,
+            struct rb_node **rb_link)
 {
        node->__rb_parent_color = (uintptr_t)parent;
        node->rb_left = node->rb_right = NULL;
-
        *rb_link = node;
 }
 
-#endif /* _LINUX_RBTREE_H */
+#endif /* _RBTREE_H */