Mercurial > hg > Gears > GearsAgda
annotate src/parallel_execution/rb_tree.c @ 247:ce262b2c1daf
Fix createTask for main
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 25 Jan 2017 04:14:50 +0900 |
parents | 2454f4392316 |
children |
rev | line source |
---|---|
86 | 1 #include <stdio.h> |
2 | |
3 #include "context.h" | |
4 #include "origin_cs.h" | |
220 | 5 #include "stack.h" |
86 | 6 |
131
a4507906938c
Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
130
diff
changeset
|
7 extern enum Relational compare(struct Node* node1, struct Node* node2); |
86 | 8 |
160 | 9 union Data* createRedBlackTree(struct Context* context) { |
10 struct Tree* tree = &ALLOCATE(context, Tree)->Tree; | |
11 struct RedBlackTree* redBlackTree = &ALLOCATE(context, RedBlackTree)->RedBlackTree; | |
12 tree->tree = (union Data*)redBlackTree; | |
13 redBlackTree->root = NULL; | |
220 | 14 redBlackTree->nodeStack = &createSingleLinkedStack(context)->Stack; |
160 | 15 tree->put = C_putRedBlackTree; |
16 tree->get = C_getRedBlackTree; | |
189 | 17 // tree->remove = C_removeRedBlackTree; |
18 // tree->clear = C_clearRedBlackTree; | |
160 | 19 return (union Data*)(tree); |
20 } | |
21 | |
126 | 22 void printTree1(union Data* data) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
23 struct Node* node = &data->Node; |
126 | 24 if (node == NULL) { |
25 printf("NULL"); | |
26 } else { | |
27 printf("key = %d (", node->key); | |
133 | 28 printTree1((union Data*)(node->right)); |
126 | 29 printf("), ("); |
133 | 30 printTree1((union Data*)(node->left)); |
126 | 31 printf(")"); |
32 } | |
33 } | |
34 | |
35 void printTree(union Data* data) { | |
36 printTree1(data); | |
37 printf("\n"); | |
38 } | |
86 | 39 |
220 | 40 __code putRedBlackTree(struct Context* context, struct RedBlackTree* traverse, struct Node* node, struct Node* root, struct Node* newNode) { |
172 | 41 printTree((union Data*)(traverse->root)); |
122 | 42 traverse->newNode = newNode; |
172 | 43 traverse->root = newNode; // this should done at stackClear |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
44 traverse->parent = NULL; |
86 | 45 if (root) { |
91 | 46 traverse->current = root; |
131
a4507906938c
Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
130
diff
changeset
|
47 traverse->result = compare(traverse->current, node); |
144 | 48 goto meta(context, C_replaceNode); |
86 | 49 } |
50 | |
144 | 51 goto meta(context, C_insertNode); |
86 | 52 } |
53 | |
160 | 54 __code putRedBlackTree_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
55 struct Node* newNode = &ALLOCATE(context, Node)->Node; |
172 | 56 goto putRedBlackTree(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
57 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
220 | 58 Gearef(context, Tree)->node, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
59 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.root, |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
60 newNode |
124 | 61 ); |
121 | 62 } |
63 | |
172 | 64 __code replaceNode(struct Context* context, struct RedBlackTree* traverse, struct Node* oldNode, struct Node* newNode, struct Stack* nodeStack) { |
138 | 65 traverse->previous = newNode; |
121 | 66 *newNode = *oldNode; |
138 | 67 nodeStack->stack = (union Data*)traverse->nodeStack; |
133 | 68 nodeStack->data = (union Data*)(newNode); |
144 | 69 nodeStack->next = C_replaceNode1; |
138 | 70 goto meta(context, traverse->nodeStack->push); |
86 | 71 } |
72 | |
121 | 73 __code replaceNode_stub(struct Context* context) { |
74 goto replaceNode(context, | |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
75 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
76 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, |
172 | 77 //context->data[D_RedBlackTree]->RedBlackTree.newNode, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
78 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.newNode, |
220 | 79 Gearef(context, Stack)); |
121 | 80 } |
81 | |
174 | 82 __code replaceNode1(struct Context* context, struct RedBlackTree* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, struct Node* newnewNode, int result, enum Code next) { |
86 | 83 if (result == EQ) { |
121 | 84 newNode->value = node->value; |
117 | 85 // go to stack clear |
174 | 86 goto meta(context, next); |
86 | 87 } else if (result == GT) { |
91 | 88 traverse->current = oldNode->right; |
121 | 89 newNode->right = newnewNode; |
86 | 90 } else { |
91 | 91 traverse->current = oldNode->left; |
121 | 92 newNode->left = newnewNode; |
86 | 93 } |
122 | 94 traverse->newNode = newnewNode; |
91 | 95 if (traverse->current) { |
131
a4507906938c
Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
130
diff
changeset
|
96 traverse->result = compare(traverse->current, node); |
144 | 97 goto meta(context, C_replaceNode); |
86 | 98 } |
144 | 99 goto meta(context, C_insertNode); |
121 | 100 |
86 | 101 } |
102 | |
121 | 103 __code replaceNode1_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
104 struct Node* newnewNode = &ALLOCATE(context, Node)->Node; |
121 | 105 goto replaceNode1(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
106 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
220 | 107 Gearef(context, Tree)->node, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
108 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, |
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
109 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.previous, |
124 | 110 newnewNode, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
111 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.result, |
174 | 112 Gearef(context, Tree)->next); |
86 | 113 } |
114 | |
172 | 115 __code insertNode(struct Context* context, struct RedBlackTree* traverse, struct Stack *nodeStack, struct Node* node, struct Node* newNode) { |
86 | 116 *newNode = *node; |
122 | 117 newNode->color = Red; |
91 | 118 traverse->current = newNode; |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
119 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 120 nodeStack->next = C_insertCase1; |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
121 goto meta(context, traverse->nodeStack->get2); |
86 | 122 } |
123 | |
124 __code insertNode_stub(struct Context* context) { | |
91 | 125 goto insertNode(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
126 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
220 | 127 Gearef(context, Stack), |
128 Gearef(context, Tree)->node, | |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
129 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.newNode); |
86 | 130 } |
131 | |
173 | 132 __code insertCase1(struct Context* context, struct RedBlackTree* traverse, struct Node *parent, struct Node *grandparent) { |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
133 if (parent != NULL) { |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
134 traverse->parent = parent; |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
135 traverse->grandparent = grandparent; |
144 | 136 goto meta(context,C_insertCase2); |
122 | 137 } |
173 | 138 traverse->root->color = Black; |
144 | 139 goto meta(context, C_stackClear); |
86 | 140 } |
141 | |
144 | 142 __code insertCase1_stub(struct Context* context) { |
127 | 143 goto insertCase1(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
144 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
145 &context->data[D_Stack]->Stack.data->Node, |
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
146 &context->data[D_Stack]->Stack.data1->Node); |
86 | 147 } |
148 | |
172 | 149 __code insertCase2(struct Context* context, struct RedBlackTree* traverse) { |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
150 if (traverse->parent->color == Black) { |
144 | 151 goto meta(context, C_stackClear); |
86 | 152 } |
144 | 153 goto meta(context,C_insertCase3); |
86 | 154 } |
155 | |
144 | 156 __code insertCase2_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
157 goto insertCase2(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree); |
86 | 158 } |
159 | |
172 | 160 __code insertCase3(struct Context* context, struct RedBlackTree* traverse, struct Stack* nodeStack) { |
86 | 161 struct Node* uncle; |
162 | |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
163 if (traverse->grandparent->left == traverse->parent) |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
164 uncle = traverse->grandparent->right; |
86 | 165 else |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
166 uncle = traverse->grandparent->left; |
86 | 167 |
168 if (uncle && (uncle->color == Red)) { | |
117 | 169 // do insertcase1 on grandparent, stack must be pop by two |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
170 traverse->parent->color = Black; |
86 | 171 uncle->color = Black; |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
172 traverse->grandparent->color = Red; |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
173 traverse->current = traverse->grandparent; |
138 | 174 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 175 nodeStack->next = C_insertCase1; |
138 | 176 goto meta(context, traverse->nodeStack->pop2); |
86 | 177 } |
144 | 178 goto meta(context, C_insertCase4); |
86 | 179 } |
180 | |
144 | 181 __code insertCase3_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
182 goto insertCase3(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
220 | 183 Gearef(context, Stack)); |
86 | 184 } |
185 | |
172 | 186 __code insertCase4(struct Context* context, struct RedBlackTree* traverse, struct RotateTree* rotateTree) { |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
187 struct Stack* nodeStack = traverse->nodeStack; |
86 | 188 |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
189 if ((traverse->current == traverse->parent->right) && (traverse->parent == traverse->grandparent->left)) { |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
190 traverse->current = traverse->current->left; |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
191 traverse->parent = traverse->grandparent; |
147 | 192 |
193 rotateTree->traverse = traverse; | |
194 rotateTree->next = C_insertCase5; | |
195 | |
138 | 196 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 197 nodeStack->next = C_rotateLeft; |
139 | 198 goto meta(context, nodeStack->pop); |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
199 } else if ((traverse->current == traverse->parent->left) && (traverse->parent == traverse->grandparent->right)) { |
147 | 200 traverse->parent = traverse->grandparent; |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
201 traverse->current = traverse->current->right; |
147 | 202 |
203 rotateTree->traverse = traverse; | |
204 rotateTree->next = C_insertCase5; | |
205 | |
138 | 206 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 207 nodeStack->next = C_rotateRight; |
139 | 208 goto meta(context, nodeStack->pop); |
86 | 209 } |
210 | |
144 | 211 goto meta(context, C_insertCase5); |
86 | 212 } |
213 | |
144 | 214 __code insertCase4_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
215 goto insertCase4(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, RotateTree)); |
86 | 216 } |
217 | |
172 | 218 __code insertCase5(struct Context* context, struct RedBlackTree* traverse,struct Stack *nodeStack) { |
138 | 219 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 220 nodeStack->next = C_insertCase51; |
141
4f6a660c14a1
stack interface worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
140
diff
changeset
|
221 goto meta(context, traverse->nodeStack->pop2); |
122 | 222 } |
223 | |
144 | 224 __code insertCase5_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
225 goto insertCase5(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Stack)); |
86 | 226 } |
227 | |
172 | 228 __code insertCase51(struct Context* context, struct RedBlackTree* traverse, struct RotateTree *rotateTree, struct Node* current, struct Node* parent, struct Node* grandparent) { |
143
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
229 traverse->parent = parent; |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
230 traverse->grandparent = grandparent; |
34a7a21edc36
recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
141
diff
changeset
|
231 |
86 | 232 parent->color = Black; |
233 grandparent->color = Red; | |
234 | |
91 | 235 traverse->current = grandparent; |
147 | 236 |
237 rotateTree->traverse = traverse; | |
238 rotateTree->next = C_stackClear; | |
239 | |
86 | 240 if ((current == parent->left) && (parent == grandparent->left)) |
144 | 241 goto meta(context, C_rotateRight); |
86 | 242 else |
144 | 243 goto meta(context, C_rotateLeft); |
86 | 244 } |
245 | |
144 | 246 __code insertCase51_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
247 struct Node* parent = &context->data[D_Stack]->Stack.data->Node; |
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
248 struct Node* grandparent = &context->data[D_Stack]->Stack.data1->Node; |
220 | 249 goto insertCase51(context, |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
250 &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, |
220 | 251 Gearef(context, RotateTree), |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
252 Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, |
220 | 253 parent, |
254 grandparent); | |
86 | 255 } |
256 | |
172 | 257 __code rotateLeft(struct Context* context, struct RedBlackTree* traverse,struct Stack* nodeStack) { |
138 | 258 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 259 nodeStack->next = C_rotateLeft1; |
140 | 260 goto meta(context, traverse->nodeStack->get); |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
261 } |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
262 |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
263 __code rotateLeft_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
264 struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; |
220 | 265 goto rotateLeft(context, traverse, Gearef(context, Stack)); |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
266 } |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
267 |
172 | 268 __code rotateLeft1(struct Context* context, struct Node* node, struct RedBlackTree* traverse, struct Node *parent,struct RotateTree *rotateTree) { |
86 | 269 struct Node* tmp = node->right; |
123 | 270 |
271 if (parent) { | |
146 | 272 if (node == parent->left) |
123 | 273 parent->left = tmp; |
274 else | |
275 parent->right = tmp; | |
276 } else { | |
172 | 277 traverse->root = tmp; |
123 | 278 } |
117 | 279 |
123 | 280 node->right = tmp->left; |
281 tmp->left = node; | |
282 traverse->current = tmp; | |
283 | |
147 | 284 goto meta(context, rotateTree->next); |
123 | 285 } |
286 | |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
287 __code rotateLeft1_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
288 struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; |
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
289 struct Node* parent = &context->data[D_Stack]->Stack.data->Node; |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
290 goto rotateLeft1(context, |
147 | 291 traverse->current, |
292 traverse, | |
293 parent, | |
220 | 294 Gearef(context, RotateTree)); |
123 | 295 } |
86 | 296 |
172 | 297 __code rotateRight(struct Context* context, struct RedBlackTree* traverse,struct Stack *nodeStack) { |
140 | 298 nodeStack->stack = (union Data*)traverse->nodeStack; |
144 | 299 nodeStack->next = C_rotateRight1; |
140 | 300 goto meta(context, traverse->nodeStack->get); |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
301 } |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
302 |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
303 __code rotateRight_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
304 struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; |
220 | 305 goto rotateLeft(context, traverse, Gearef(context, Stack)); |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
306 } |
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
307 |
172 | 308 __code rotateRight1(struct Context* context, struct Node* node, struct RedBlackTree* traverse,struct Node *parent,struct RotateTree *rotateTree) { |
123 | 309 struct Node* tmp = node->left; |
310 | |
86 | 311 if (parent) { |
146 | 312 if (node == parent->left) |
86 | 313 parent->left = tmp; |
314 else | |
315 parent->right = tmp; | |
316 } else { | |
172 | 317 traverse->root = tmp; |
86 | 318 } |
319 | |
320 node->left = tmp->right; | |
321 tmp->right = node; | |
91 | 322 traverse->current = tmp; |
86 | 323 |
147 | 324 goto meta(context, rotateTree->next); |
86 | 325 } |
326 | |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
327 __code rotateRight1_stub(struct Context* context) { |
217
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
328 struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; |
c34e6aa10967
Fix DataGear access name
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
195
diff
changeset
|
329 struct Node* parent = &context->data[D_Stack]->Stack.data->Node; |
134
2eccf4564efe
fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
330 goto rotateRight1(context, |
147 | 331 traverse->current, |
332 traverse, | |
333 parent, | |
220 | 334 Gearef(context, RotateTree)); |
86 | 335 } |
336 | |
174 | 337 __code stackClear(struct Context* context, struct RedBlackTree* traverse,struct Stack *nodeStack, enum Code next) { |
91 | 338 traverse->current = 0; |
145
cc071cf1ba85
add stack clear interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
144
diff
changeset
|
339 nodeStack->stack = (union Data*)traverse->nodeStack; |
174 | 340 nodeStack->next = next; |
145
cc071cf1ba85
add stack clear interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
144
diff
changeset
|
341 goto meta(context, traverse->nodeStack->clear); |
86 | 342 } |
343 | |
344 __code stackClear_stub(struct Context* context) { | |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
345 goto stackClear(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Stack), |
174 | 346 Gearef(context, Tree)->next); |
86 | 347 } |
348 | |
349 | |
174 | 350 __code getRedBlackTree(struct Context* context, struct RedBlackTree* traverse, enum Code next) { |
173 | 351 if (traverse->root) { |
352 traverse->current = traverse->root; | |
86 | 353 |
144 | 354 goto meta(context, C_search); |
92 | 355 } |
86 | 356 |
174 | 357 goto meta(context, next); |
92 | 358 } |
86 | 359 |
160 | 360 __code getRedBlackTree_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
361 goto getRedBlackTree(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Tree)->next); |
92 | 362 } |
86 | 363 |
174 | 364 __code search(struct Context* context, struct RedBlackTree* traverse, struct Node* node, enum Code next) { |
131
a4507906938c
Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
130
diff
changeset
|
365 // compare(context, traverse, traverse->current->key, node->key); |
a4507906938c
Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
130
diff
changeset
|
366 traverse->result = compare(traverse->current, node); |
91 | 367 if (traverse->result == EQ) { |
368 *node = *traverse->current; | |
86 | 369 |
174 | 370 goto meta(context, next); |
91 | 371 } else if (traverse->result == GT) { |
372 traverse->current = traverse->current->right; | |
373 } else { | |
374 traverse->current = traverse->current->left; | |
375 } | |
86 | 376 |
91 | 377 if (traverse->current) |
144 | 378 goto meta(context, C_search); |
86 | 379 |
174 | 380 goto meta(context, next); |
91 | 381 } |
86 | 382 |
91 | 383 __code search_stub(struct Context* context) { |
221
2454f4392316
Success create Task and inqueue Task
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
220
diff
changeset
|
384 goto search(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Node), Gearef(context, Tree)->next); |
91 | 385 } |
86 | 386 |
387 /* /\* __code delete(struct Context* context, struct Tree* tree) { *\/ */ | |
388 /* /\* if (tree->root) { *\/ */ | |
389 /* /\* stack_push(context->code_stack, &context->next); *\/ */ | |
390 /* /\* context->next = Delete1; *\/ */ | |
391 /* /\* goto meta(context, Get); *\/ */ | |
392 /* /\* } *\/ */ | |
393 | |
394 /* /\* goto meta(context, context->next); *\/ */ | |
395 /* /\* } *\/ */ | |
396 | |
397 /* /\* __code delete_stub(struct Context* context) { *\/ */ | |
398 /* /\* goto delete(context, &context->data[Tree]->tree); *\/ */ | |
399 /* /\* } *\/ */ | |
400 | |
401 /* /\* __code delete1(struct Context* context, struct Tree* tree, struct Allocate* allocate) { *\/ */ | |
402 /* /\* allocate->size = sizeof(struct Node); *\/ */ | |
403 /* /\* allocator(context); *\/ */ | |
404 | |
405 /* /\* struct Node* root = tree->root; *\/ */ | |
406 | |
407 /* /\* tree->root = &context->data[context->dataNum]->node; *\/ */ | |
408 /* /\* tree->current = root; *\/ */ | |
409 | |
410 /* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ | |
411 | |
412 /* /\* goto meta(context, Replace_d1); *\/ */ | |
413 /* /\* } *\/ */ | |
414 | |
415 /* /\* __code delete1_stub(struct Context* context) { *\/ */ | |
416 /* /\* goto delete1(context, &context->data[Tree]->tree, &context->data[Allocate]->allocate); *\/ */ | |
417 /* /\* } *\/ */ | |
418 | |
419 /* /\* __code delete2(struct Context* context, struct Node* current) { *\/ */ | |
420 /* /\* if (current->color == Black) { *\/ */ | |
421 /* /\* struct Node* child = current->right == NULL ? current->left : current->right; *\/ */ | |
422 /* /\* current->color = child == NULL ? Black : child->color; *\/ */ | |
423 | |
424 /* /\* goto meta(context, DeleteCase1); *\/ */ | |
425 /* /\* } *\/ */ | |
426 | |
427 /* /\* goto meta(context, Delete3); *\/ */ | |
428 /* /\* } *\/ */ | |
429 | |
430 /* /\* __code delete2_stub(struct Context* context) { *\/ */ | |
431 /* /\* goto delete2(context, context->data[Tree]->tree.current); *\/ */ | |
432 /* /\* } *\/ */ | |
433 | |
434 /* /\* __code delete3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ | |
435 /* /\* struct Node* tmp = current->right == NULL ? current->left : current->right; *\/ */ | |
436 | |
437 /* /\* if (current->parent) { *\/ */ | |
438 /* /\* if (current == current->parent->left) *\/ */ | |
439 /* /\* current->parent->left = tmp; *\/ */ | |
440 /* /\* else *\/ */ | |
441 /* /\* current->parent->right = tmp; *\/ */ | |
442 /* /\* } else { *\/ */ | |
443 /* /\* tree->root = tmp; *\/ */ | |
444 /* /\* } *\/ */ | |
445 | |
446 /* /\* if (tmp) *\/ */ | |
447 /* /\* tmp->parent = current->parent; *\/ */ | |
448 | |
449 /* /\* if (current->parent == NULL && tmp) *\/ */ | |
450 /* /\* tmp->color = Black; *\/ */ | |
451 | |
452 /* /\* current == current->parent->left ? (current->parent->left = NULL) : (current->parent->right = NULL); *\/ */ | |
453 | |
454 /* /\* stack_pop(context->code_stack, &context->next); *\/ */ | |
455 /* /\* goto meta(context, context->next); *\/ */ | |
456 /* /\* } *\/ */ | |
457 | |
458 /* /\* __code delete3_stub(struct Context* context) { *\/ */ | |
459 /* /\* goto delete3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ | |
460 /* /\* } *\/ */ | |
461 | |
462 /* /\* __code replaceNodeForDelete1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode, int result) { *\/ */ | |
463 /* /\* *newNode = *oldNode; *\/ */ | |
464 | |
465 /* /\* if (result == EQ) *\/ */ | |
466 /* /\* goto meta(context, Replace_d2); *\/ */ | |
467 /* /\* else if (result == GT) *\/ */ | |
468 /* /\* tree->current = newNode->right; *\/ */ | |
469 /* /\* else *\/ */ | |
470 /* /\* tree->current = newNode->left; *\/ */ | |
471 | |
472 /* /\* tree->current->parent = newNode; *\/ */ | |
473 | |
474 /* /\* if (tree->current->left == NULL && tree->current->right == NULL) *\/ */ | |
475 /* /\* goto meta(context, Delete2); *\/ */ | |
476 | |
477 /* /\* if (result == GT) *\/ */ | |
478 /* /\* newNode->right = context->heap; *\/ */ | |
479 /* /\* else if (result == LT) *\/ */ | |
480 /* /\* newNode->left = context->heap; *\/ */ | |
481 | |
482 /* /\* allocator(context); *\/ */ | |
483 | |
484 /* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ | |
485 | |
486 /* /\* goto meta(context, Replace_d1); *\/ */ | |
487 /* /\* } *\/ */ | |
488 | |
489 /* /\* __code replaceNodeForDelete1_stub(struct Context* context) { *\/ */ | |
490 /* /\* goto replaceNodeForDelete1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node, context->data[Tree]->tree.result); *\/ */ | |
491 /* /\* } *\/ */ | |
492 | |
493 /* /\* __code replaceNodeForDelete2(struct Context* context, struct Tree* tree, struct Node* newNode) { *\/ */ | |
494 /* /\* if (tree->current->left && tree->current->right) { *\/ */ | |
495 /* /\* newNode->left->parent = newNode; *\/ */ | |
496 /* /\* tree->current = newNode->left; *\/ */ | |
497 /* /\* newNode->left = context->heap; *\/ */ | |
498 /* /\* tree->deleted = newNode; *\/ */ | |
499 | |
500 /* /\* allocator(context); *\/ */ | |
501 /* /\* tree->current->parent = newNode; *\/ */ | |
502 | |
503 /* /\* goto meta(context, FindMax1); *\/ */ | |
504 /* /\* } *\/ */ | |
505 | |
506 /* /\* goto meta(context, Delete2); *\/ */ | |
507 /* /\* } *\/ */ | |
508 | |
509 /* /\* __code replaceNodeForDelete2_stub(struct Context* context) { *\/ */ | |
510 /* /\* goto replaceNodeForDelete2(context, &context->data[Tree]->tree, &context->data[context->dataNum]->node); *\/ */ | |
511 /* /\* } *\/ */ | |
512 | |
513 /* /\* __code findMax1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ | |
514 /* /\* *newNode = *oldNode; *\/ */ | |
515 | |
516 /* /\* if (newNode->right) *\/ */ | |
517 /* /\* goto meta(context, FindMax2); *\/ */ | |
518 | |
519 /* /\* tree->deleted->key = newNode->key; *\/ */ | |
520 /* /\* tree->deleted->value = newNode->value; *\/ */ | |
521 | |
522 /* /\* tree->current = newNode; *\/ */ | |
523 | |
524 /* /\* goto meta(context, Delete2); *\/ */ | |
525 /* /\* } *\/ */ | |
526 | |
527 /* /\* __code findMax1_stub(struct Context* context) { *\/ */ | |
528 /* /\* goto findMax1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ | |
529 /* /\* } *\/ */ | |
530 | |
531 | |
532 /* /\* __code findMax2(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ | |
533 /* /\* *newNode = *oldNode; *\/ */ | |
534 | |
535 /* /\* if (newNode->right->right) { *\/ */ | |
536 /* /\* tree->current = newNode->right; *\/ */ | |
537 /* /\* newNode->right = context->heap; *\/ */ | |
538 | |
539 /* /\* allocator(context); *\/ */ | |
540 /* /\* tree->current->parent = newNode; *\/ */ | |
541 | |
542 /* /\* goto meta(context, FindMax2); *\/ */ | |
543 /* /\* } *\/ */ | |
544 | |
545 /* /\* tree->deleted->key = newNode->right->key; *\/ */ | |
546 /* /\* tree->deleted->value = newNode->right->value; *\/ */ | |
547 | |
548 /* /\* tree->current = newNode; *\/ */ | |
549 | |
550 /* /\* goto meta(context, Delete2); *\/ */ | |
551 /* /\* } *\/ */ | |
552 | |
553 /* /\* __code findMax2_stub(struct Context* context) { *\/ */ | |
554 /* /\* goto findMax2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ | |
555 /* /\* } *\/ */ | |
556 | |
557 /* /\* __code deleteCase1(struct Context* context, struct Node* current) { *\/ */ | |
558 /* /\* if (current->parent) *\/ */ | |
559 /* /\* goto meta(context, DeleteCase2); *\/ */ | |
560 | |
561 /* /\* goto meta(context, Delete3); *\/ */ | |
562 /* /\* } *\/ */ | |
563 | |
564 /* /\* __code deleteCase1_stub(struct Context* context) { *\/ */ | |
565 /* /\* goto deleteCase1(context, context->data[Tree]->tree.current); *\/ */ | |
566 /* /\* } *\/ */ | |
567 | |
568 /* /\* __code deleteCase2(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ | |
569 /* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ | |
570 | |
571 /* /\* if ((sibling == NULL ? Black : sibling->color) == Red) { *\/ */ | |
572 /* /\* current->parent->color = Red; *\/ */ | |
573 /* /\* sibling->color = Black; *\/ */ | |
574 | |
575 /* /\* current == current->parent->left ? (current->parent->left = context->heap) : (current->parent->right = context->heap); *\/ */ | |
576 /* /\* allocator(context); *\/ */ | |
577 /* /\* context->data[context->dataNum]->node = *sibling; *\/ */ | |
578 | |
579 /* /\* tree->current = current->parent; *\/ */ | |
580 | |
581 /* /\* context->next = DeleteCase3; *\/ */ | |
582 /* /\* stack_push(context->code_stack, &context->next); *\/ */ | |
583 | |
584 /* /\* if (current == current->parent->left) *\/ */ | |
585 /* /\* goto meta(context, RotateL); *\/ */ | |
586 /* /\* else *\/ */ | |
587 /* /\* goto meta(context, RotateR); *\/ */ | |
588 /* /\* } *\/ */ | |
589 | |
590 /* /\* goto meta(context, DeleteCase3); *\/ */ | |
591 /* /\* } *\/ */ | |
592 | |
593 /* /\* __code deleteCase2_stub(struct Context* context) { *\/ */ | |
594 /* /\* goto deleteCase2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ | |
595 /* /\* } *\/ */ | |
596 | |
597 /* /\* __code deleteCase3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ | |
598 /* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ | |
599 | |
600 /* /\* if (current->parent->color == Black && *\/ */ | |
601 /* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ | |
602 /* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ | |
603 /* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ | |
604 /* /\* sibling->color = Red; *\/ */ | |
605 | |
606 /* /\* tree->current = current->parent; *\/ */ | |
607 /* /\* goto meta(context, DeleteCase1); *\/ */ | |
608 /* /\* } *\/ */ | |
609 | |
610 /* /\* goto meta(context, DeleteCase4); *\/ */ | |
611 /* /\* } *\/ */ | |
612 | |
613 /* /\* __code deleteCase3_stub(struct Context* context) { *\/ */ | |
614 /* /\* goto deleteCase3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ | |
615 /* /\* } *\/ */ | |
616 | |
617 /* /\* __code deleteCase4(struct Context* context, struct Node* current) { *\/ */ | |
618 /* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ | |
619 | |
620 /* /\* if (current->parent->color == Red && *\/ */ | |
621 /* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ | |
622 /* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ | |
623 /* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ | |
624 /* /\* sibling->color = Red; *\/ */ | |
625 /* /\* current->parent->color = Black; *\/ */ | |
626 | |
627 /* /\* goto meta(context, Delete3); *\/ */ | |
628 /* /\* } *\/ */ | |
629 | |
630 /* /\* goto meta(context, DeleteCase5); *\/ */ | |
631 /* /\* } *\/ */ | |
632 | |
633 /* /\* __code deleteCase4_stub(struct Context* context) { *\/ */ | |
634 /* /\* goto deleteCase4(context, context->data[Tree]->tree.current); *\/ */ | |
635 /* /\* } *\/ */ | |
636 | |
637 /* /\* __code deleteCase5(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ | |
638 /* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ | |
639 /* /\* sibling->parent = current->parent; *\/ */ | |
640 | |
641 /* /\* if (current == current->parent->left && *\/ */ | |
642 /* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ | |
643 /* /\* (sibling->left == NULL ? Black : sibling->left->color) == Red && *\/ */ | |
644 /* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ | |
645 /* /\* sibling->color = Red; *\/ */ | |
646 /* /\* sibling->left->color = Black; *\/ */ | |
647 | |
648 /* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ | |
649 /* /\* allocator(context); *\/ */ | |
650 /* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ | |
651 /* /\* *tmp = *sibling; *\/ */ | |
652 /* /\* tmp->parent = current; *\/ */ | |
653 | |
654 /* /\* tmp->left = context->heap; *\/ */ | |
655 /* /\* allocator(context); *\/ */ | |
656 /* /\* context->data[context->dataNum]->node = *sibling->left; *\/ */ | |
657 /* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ | |
658 | |
659 /* /\* tree->current = tmp; *\/ */ | |
660 | |
661 /* /\* context->next = DeleteCase6; *\/ */ | |
662 /* /\* stack_push(context->code_stack, &context->next); *\/ */ | |
663 | |
664 /* /\* goto meta(context, RotateR); *\/ */ | |
665 /* /\* } else if (current == current->parent->right && *\/ */ | |
666 /* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ | |
667 /* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ | |
668 /* /\* (sibling->right == NULL ? Black : sibling->right->color) == Red) { *\/ */ | |
669 /* /\* sibling->color = Red; *\/ */ | |
670 /* /\* sibling->right->color = Black; *\/ */ | |
671 | |
672 /* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ | |
673 /* /\* allocator(context); *\/ */ | |
674 /* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ | |
675 /* /\* *tmp = *sibling; *\/ */ | |
676 /* /\* tmp->parent = current; *\/ */ | |
677 | |
678 /* /\* tmp->right = context->heap; *\/ */ | |
679 /* /\* allocator(context); *\/ */ | |
680 /* /\* context->data[context->dataNum]->node = *sibling->right; *\/ */ | |
681 /* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ | |
682 | |
683 /* /\* tree->current = tmp; *\/ */ | |
684 | |
685 /* /\* context->next = DeleteCase6; *\/ */ | |
686 /* /\* stack_push(context->code_stack, &context->next); *\/ */ | |
687 /* /\* goto meta(context, RotateL); *\/ */ | |
688 /* /\* } *\/ */ | |
689 | |
690 /* /\* goto meta(context, DeleteCase6); *\/ */ | |
691 /* /\* } *\/ */ | |
692 | |
693 /* /\* __code deleteCase5_stub(struct Context* context) { *\/ */ | |
694 /* /\* goto deleteCase5(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ | |
695 /* /\* } *\/ */ | |
696 | |
697 /* /\* __code deleteCase6(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ | |
698 /* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ | |
699 | |
700 /* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ | |
701 /* /\* allocator(context); *\/ */ | |
702 /* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ | |
703 /* /\* *tmp = *sibling; *\/ */ | |
704 /* /\* tmp->parent = current; *\/ */ | |
705 | |
706 /* /\* tmp->color = current->parent->color; *\/ */ | |
707 /* /\* current->parent->color = Black; *\/ */ | |
708 | |
709 /* /\* context->next = Delete3; *\/ */ | |
710 /* /\* stack_push(context->code_stack, &context->next); *\/ */ | |
711 | |
712 /* /\* if (current == current->parent->left) { *\/ */ | |
713 /* /\* tmp->right->color = Black; *\/ */ | |
714 /* /\* tree->current = current->parent; *\/ */ | |
715 | |
716 /* /\* goto meta(context, RotateL); *\/ */ | |
717 /* /\* } else { *\/ */ | |
718 /* /\* tmp->left->color = Black; *\/ */ | |
719 /* /\* tree->current = current->parent; *\/ */ | |
720 | |
721 /* /\* goto meta(context, RotateR); *\/ */ | |
722 /* /\* } *\/ */ | |
723 /* /\* } *\/ */ | |
724 | |
725 /* /\* __code deleteCase6_stub(struct Context* context) { *\/ */ | |
726 /* /\* goto deleteCase6(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ | |
727 /* /\* } *\/ */ |