summaryrefslogtreecommitdiff
path: root/src/include/lib
diff options
context:
space:
mode:
authorHeikki Linnakangas2014-12-22 15:52:08 +0000
committerHeikki Linnakangas2014-12-22 15:52:08 +0000
commit955557ddccb4065831af80b0966cbd02937dfb72 (patch)
treee853e7bc8217fd9bacbe61852fc12f4621788b18 /src/include/lib
parent7f0dccaed64a8ed6f5db8ad43e7612202fbeeeaf (diff)
Move rbtree.c from src/backend/utils/misc to src/backend/lib.
We have other general-purpose data structures in src/backend/lib, so it seems like a better home for the red-black tree as well.
Diffstat (limited to 'src/include/lib')
-rw-r--r--src/include/lib/rbtree.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/include/lib/rbtree.h b/src/include/lib/rbtree.h
new file mode 100644
index 0000000000..e4a0f63810
--- /dev/null
+++ b/src/include/lib/rbtree.h
@@ -0,0 +1,66 @@
+/*-------------------------------------------------------------------------
+ *
+ * rbtree.h
+ * interface for PostgreSQL generic Red-Black binary tree package
+ *
+ * Copyright (c) 2009-2014, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/include/lib/rbtree.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef RBTREE_H
+#define RBTREE_H
+
+/*
+ * RBNode is intended to be used as the first field of a larger struct,
+ * whose additional fields carry whatever payload data the caller needs
+ * for a tree entry. (The total size of that larger struct is passed to
+ * rb_create.) RBNode is declared here to support this usage, but
+ * callers must treat it as an opaque struct.
+ */
+typedef struct RBNode
+{
+ char iteratorState; /* workspace for iterating through tree */
+ char color; /* node's current color, red or black */
+ struct RBNode *left; /* left child, or RBNIL if none */
+ struct RBNode *right; /* right child, or RBNIL if none */
+ struct RBNode *parent; /* parent, or NULL (not RBNIL!) if none */
+} RBNode;
+
+/* Opaque struct representing a whole tree */
+typedef struct RBTree RBTree;
+
+/* Available tree iteration orderings */
+typedef enum RBOrderControl
+{
+ LeftRightWalk, /* inorder: left child, node, right child */
+ RightLeftWalk, /* reverse inorder: right, node, left */
+ DirectWalk, /* preorder: node, left child, right child */
+ InvertedWalk /* postorder: left child, right child, node */
+} RBOrderControl;
+
+/* Support functions to be provided by caller */
+typedef int (*rb_comparator) (const RBNode *a, const RBNode *b, void *arg);
+typedef void (*rb_combiner) (RBNode *existing, const RBNode *newdata, void *arg);
+typedef RBNode *(*rb_allocfunc) (void *arg);
+typedef void (*rb_freefunc) (RBNode *x, void *arg);
+
+extern RBTree *rb_create(Size node_size,
+ rb_comparator comparator,
+ rb_combiner combiner,
+ rb_allocfunc allocfunc,
+ rb_freefunc freefunc,
+ void *arg);
+
+extern RBNode *rb_find(RBTree *rb, const RBNode *data);
+extern RBNode *rb_leftmost(RBTree *rb);
+
+extern RBNode *rb_insert(RBTree *rb, const RBNode *data, bool *isNew);
+extern void rb_delete(RBTree *rb, RBNode *node);
+
+extern void rb_begin_iterate(RBTree *rb, RBOrderControl ctrl);
+extern RBNode *rb_iterate(RBTree *rb);
+
+#endif /* RBTREE_H */