diff options
| author | Heikki Linnakangas | 2014-12-22 15:52:08 +0000 |
|---|---|---|
| committer | Heikki Linnakangas | 2014-12-22 15:52:08 +0000 |
| commit | 955557ddccb4065831af80b0966cbd02937dfb72 (patch) | |
| tree | e853e7bc8217fd9bacbe61852fc12f4621788b18 /src/include/lib | |
| parent | 7f0dccaed64a8ed6f5db8ad43e7612202fbeeeaf (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.h | 66 |
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 */ |
