mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-07 09:39:19 +02:00
8255c7a5ee
Switch to 2.1 version of pg_bsd_indent. This formats multiline function declarations "correctly", that is with additional lines of parameter declarations indented to match where the first line's left parenthesis is. Discussion: https://postgr.es/m/CAEepm=0P3FeTXRcU5B2W3jv3PgRVZ-kGUXLGfd42FFhUROO3ug@mail.gmail.com
80 lines
2.5 KiB
C
80 lines
2.5 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* rbtree.h
|
|
* interface for PostgreSQL generic Red-Black binary tree package
|
|
*
|
|
* Copyright (c) 2009-2019, 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 */
|