12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*-------------------------------------------------------------------------
- *
- * rbtree.h
- * interface for PostgreSQL generic Red-Black binary tree package
- *
- * Copyright (c) 2009-2022, PostgreSQL Global Development Group
- *
- * IDENTIFICATION
- * src/include/lib/rbtree.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef RBTREE_H
- #define RBTREE_H
- /*
- * RBTNode 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
- * rbt_create.) RBTNode is declared here to support this usage, but
- * callers must treat it as an opaque struct.
- */
- typedef struct RBTNode
- {
- char color; /* node's current color, red or black */
- struct RBTNode *left; /* left child, or RBTNIL if none */
- struct RBTNode *right; /* right child, or RBTNIL if none */
- struct RBTNode *parent; /* parent, or NULL (not RBTNIL!) if none */
- } RBTNode;
- /* Opaque struct representing a whole tree */
- typedef struct RBTree RBTree;
- /* Available tree iteration orderings */
- typedef enum RBTOrderControl
- {
- LeftRightWalk, /* inorder: left child, node, right child */
- RightLeftWalk /* reverse inorder: right, node, left */
- } RBTOrderControl;
- /*
- * RBTreeIterator holds state while traversing a tree. This is declared
- * here so that callers can stack-allocate this, but must otherwise be
- * treated as an opaque struct.
- */
- typedef struct RBTreeIterator RBTreeIterator;
- struct RBTreeIterator
- {
- RBTree *rbt;
- RBTNode *(*iterate) (RBTreeIterator *iter);
- RBTNode *last_visited;
- bool is_over;
- };
- /* Support functions to be provided by caller */
- typedef int (*rbt_comparator) (const RBTNode *a, const RBTNode *b, void *arg);
- typedef void (*rbt_combiner) (RBTNode *existing, const RBTNode *newdata, void *arg);
- typedef RBTNode *(*rbt_allocfunc) (void *arg);
- typedef void (*rbt_freefunc) (RBTNode *x, void *arg);
- extern RBTree *rbt_create(Size node_size,
- rbt_comparator comparator,
- rbt_combiner combiner,
- rbt_allocfunc allocfunc,
- rbt_freefunc freefunc,
- void *arg);
- extern RBTNode *rbt_find(RBTree *rbt, const RBTNode *data);
- extern RBTNode *rbt_leftmost(RBTree *rbt);
- extern RBTNode *rbt_insert(RBTree *rbt, const RBTNode *data, bool *isNew);
- extern void rbt_delete(RBTree *rbt, RBTNode *node);
- extern void rbt_begin_iterate(RBTree *rbt, RBTOrderControl ctrl,
- RBTreeIterator *iter);
- extern RBTNode *rbt_iterate(RBTreeIterator *iter);
- #endif /* RBTREE_H */
|