PostgreSQL Source Code: src/include/lib/rbtree.h File Reference (original) (raw)

Go to the source code of this file.

Typedefs
typedef struct RBTNode RBTNode
typedef struct RBTree RBTree
typedef enum RBTOrderControl RBTOrderControl
typedef struct RBTreeIterator RBTreeIterator
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)
Functions
RBTree * rbt_create (Size node_size, rbt_comparator comparator, rbt_combiner combiner, rbt_allocfunc allocfunc, rbt_freefunc freefunc, void *arg)
RBTNode * rbt_find (RBTree *rbt, const RBTNode *data)
RBTNode * rbt_find_great (RBTree *rbt, const RBTNode *data, bool equal_match)
RBTNode * rbt_find_less (RBTree *rbt, const RBTNode *data, bool equal_match)
RBTNode * rbt_leftmost (RBTree *rbt)
RBTNode * rbt_insert (RBTree *rbt, const RBTNode *data, bool *isNew)
void rbt_delete (RBTree *rbt, RBTNode *node)
void rbt_begin_iterate (RBTree *rbt, RBTOrderControl ctrl, RBTreeIterator *iter)
RBTNode * rbt_iterate (RBTreeIterator *iter)

rbt_allocfunc

rbt_combiner

rbt_comparator

rbt_freefunc

RBTNode

RBTOrderControl

RBTreeIterator

RBTOrderControl

Enumerator
LeftRightWalk
RightLeftWalk

Definition at line 35 of file rbtree.h.

rbt_begin_iterate()

Definition at line 802 of file rbtree.c.

803{

804

805 iter->rbt = rbt;

808

809 switch (ctrl)

810 {

811 case LeftRightWalk:

813 break;

814 case RightLeftWalk:

816 break;

817 default:

818 elog(ERROR, "unrecognized rbtree iteration order: %d", ctrl);

819 }

820}

static RBTNode * rbt_right_left_iterator(RBTreeIterator *iter)

static RBTNode * rbt_left_right_iterator(RBTreeIterator *iter)

RBTNode *(* iterate)(RBTreeIterator *iter)

References elog, ERROR, RBTreeIterator::is_over, RBTreeIterator::iterate, RBTreeIterator::last_visited, LeftRightWalk, RBTreeIterator::rbt, rbt_left_right_iterator(), rbt_right_left_iterator(), RBTNIL, RightLeftWalk, and RBTree::root.

Referenced by ginBeginBAScan(), testleftright(), and testrightleft().

rbt_create()

rbt_delete()

rbt_find()

Definition at line 145 of file rbtree.c.

146{

148

149 while (node != RBTNIL)

150 {

152

153 if (cmp == 0)

154 return node;

155 else if (cmp < 0)

156 node = node->left;

157 else

158 node = node->right;

159 }

160

161 return NULL;

162}

static int cmp(const chr *x, const chr *y, size_t len)

rbt_comparator comparator

References RBTree::arg, cmp(), RBTree::comparator, data, RBTNode::left, RBTNIL, RBTNode::right, and RBTree::root.

Referenced by testdelete(), and testfind().

rbt_find_great()

rbt_find_less()

rbt_insert()

Definition at line 453 of file rbtree.c.

454{

456 *parent,

457 *x;

459

460

461 current = rbt->root;

462 parent = NULL;

463 cmp = 0;

464

465 while (current != RBTNIL)

466 {

468 if (cmp == 0)

469 {

470

471

472

474 *isNew = false;

475 return current;

476 }

477 parent = current;

478 current = (cmp < 0) ? current->left : current->right;

479 }

480

481

482

483

484 *isNew = true;

485

487

489

492 x->parent = parent;

494

495

496 if (parent)

497 {

498 if (cmp < 0)

499 parent->left = x;

500 else

502 }

503 else

504 {

506 }

507

509

510 return x;

511}

static void rbt_insert_fixup(RBTree *rbt, RBTNode *x)

static void rbt_copy_data(RBTree *rbt, RBTNode *dest, const RBTNode *src)

References RBTree::allocfunc, RBTree::arg, cmp(), RBTree::combiner, RBTree::comparator, data, RBTNode::left, rbt_copy_data(), rbt_insert_fixup(), RBTNIL, RBTRED, RBTNode::right, RBTree::root, and x.

Referenced by ginInsertBAEntry(), and rbt_populate().

rbt_iterate()

rbt_leftmost()