86 lines
2.9 KiB
C
86 lines
2.9 KiB
C
/* -------------------------------------------------------------------------
|
|
*
|
|
* rbtree.h
|
|
* interface for openGauss generic Red-Black binary tree package
|
|
*
|
|
* Copyright (c) 2009-2012, PostgreSQL Global Development Group
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/utils/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);
|
|
typedef void (*rb_copyfunc)(RBTree* rb, RBNode* dest, const RBNode* src);
|
|
|
|
extern RBTree* rb_create(Size node_size, rb_comparator comparator, rb_combiner combiner, rb_allocfunc allocfunc,
|
|
rb_freefunc freefunc, void* arg, rb_copyfunc = NULL);
|
|
|
|
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);
|
|
|
|
/*
|
|
* RBTree control structure
|
|
*/
|
|
struct RBTree {
|
|
RBNode* root; /* root node, or RBNIL if tree is empty */
|
|
|
|
/* Iteration state */
|
|
RBNode* cur; /* current iteration node */
|
|
RBNode* (*iterate)(RBTree* rb);
|
|
|
|
/* Remaining fields are constant after rb_create */
|
|
|
|
Size node_size; /* actual size of tree nodes */
|
|
/* The caller-supplied manipulation functions */
|
|
rb_comparator comparator;
|
|
rb_combiner combiner;
|
|
rb_allocfunc allocfunc;
|
|
rb_freefunc freefunc;
|
|
rb_copyfunc copyfunc;
|
|
/* Passthrough arg passed to all manipulation functions */
|
|
void* arg;
|
|
};
|
|
|
|
|
|
#endif /* RBTREE_H */
|