1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #ifndef NEDIT_RBTREE_H_INCLUDED
28 #define NEDIT_RBTREE_H_INCLUDED
29
30 typedef struct rbTreeNode {
31 struct rbTreeNode *left;
32 struct rbTreeNode *right;
33 struct rbTreeNode *parent;
34 int color;
35 } rbTreeNode;
36
37 typedef int (*rbTreeCompareNodeCB)(rbTreeNode *left, rbTreeNode *right);
38 typedef rbTreeNode *(*rbTreeAllocateNodeCB)(rbTreeNode *src);
39 typedef rbTreeNode *(*rbTreeAllocateEmptyNodeCB)(
void);
40 typedef void (*rbTreeDisposeNodeCB)(rbTreeNode *src);
41 typedef int (*rbTreeCopyToNodeCB)(rbTreeNode *dst, rbTreeNode *src);
42
43 rbTreeNode *rbTreeBegin(rbTreeNode *base);
44 rbTreeNode *rbTreeReverseBegin(rbTreeNode *base);
45 rbTreeNode *rbTreeFind(rbTreeNode *base, rbTreeNode *searchNode,
46 rbTreeCompareNodeCB compareRecords);
47 rbTreeNode *rbTreeInsert(rbTreeNode *base, rbTreeNode *searchNode,
48 rbTreeCompareNodeCB compareRecords,
49 rbTreeAllocateNodeCB allocateNode,
50 rbTreeCopyToNodeCB copyToNode);
51 rbTreeNode *rbTreeUnlinkNode(rbTreeNode *base, rbTreeNode *z);
52 void rbTreeDeleteNode(rbTreeNode *base, rbTreeNode *foundNode,
53 rbTreeDisposeNodeCB disposeNode);
54 int rbTreeDelete(rbTreeNode *base, rbTreeNode *searchNode,
55 rbTreeCompareNodeCB compareRecords,
56 rbTreeDisposeNodeCB disposeNode);
57 rbTreeNode *rbTreeNext(rbTreeNode *x);
58 rbTreeNode *rbTreePrevious(rbTreeNode *x);
59 int rbTreeSize(rbTreeNode *base);
60 rbTreeNode *rbTreeNew(rbTreeAllocateEmptyNodeCB allocateEmptyNode);
61 void rbTreeDispose(rbTreeNode *base, rbTreeDisposeNodeCB disposeNode);
62
63 #endif
64