comparison src/parallel_execution/rb_tree.c @ 136:c7ac153f86dd

Fix rotate cs stack
author one
date Thu, 29 Sep 2016 19:02:49 +0900
parents 9ae7ce6c83f5
children fe1fbfec7d01
comparison
equal deleted inserted replaced
135:9ae7ce6c83f5 136:c7ac153f86dd
4 #include "origin_cs.h" 4 #include "origin_cs.h"
5 5
6 extern void allocator(struct Context* context); 6 extern void allocator(struct Context* context);
7 extern void compare(struct Context* context, struct Traverse* traverse, int key1, int key2); 7 extern void compare(struct Context* context, struct Traverse* traverse, int key1, int key2);
8 8
9 extern int num; 9 void printTree1(union Data* data) {
10 struct Node* node = (struct Node*)data;
11 if (node == NULL) {
12 printf("NULL");
13 } else {
14 printf("key = %d (", node->key);
15 printTree1((union Data*)node->right);
16 printf("), (");
17 printTree1((union Data*)node->left);
18 printf(")");
19 }
20 }
21
22 void printTree(union Data* data) {
23 printTree1(data);
24 printf("\n");
25 }
10 26
11 __code put(struct Context* context, struct Tree* tree, struct Node* node, struct Traverse* traverse, struct Node* root, struct Node* newNode) { 27 __code put(struct Context* context, struct Tree* tree, struct Node* node, struct Traverse* traverse, struct Node* root, struct Node* newNode) {
28 printTree((union Data*)tree->root);
12 traverse->newNode = newNode; 29 traverse->newNode = newNode;
13 tree->root = newNode; // this should done at stackClear 30 tree->root = newNode; // this should done at stackClear
14 if (root) { 31 if (root) {
15 traverse->current = root; 32 traverse->current = root;
16 // traverse->result=compare(...) 33 // traverse->result=compare(...)
184 &context->data[Traverse]->traverse.nodeStack->data->node, 201 &context->data[Traverse]->traverse.nodeStack->data->node,
185 &context->data[Traverse]->traverse.nodeStack->next->data->node); 202 &context->data[Traverse]->traverse.nodeStack->next->data->node);
186 } 203 }
187 204
188 __code insertCase4_01(struct Context* context, struct Traverse* traverse) { 205 __code insertCase4_01(struct Context* context, struct Traverse* traverse) {
189 context->data[Traverse]->traverse.nodeStack = context->data[Traverse]->traverse.nodeStack -> next; 206 traverse->nodeStack = traverse->nodeStack -> next;
207 traverse->rotateNext = InsertCase5;
190 goto meta(context, RotateL); 208 goto meta(context, RotateL);
191 } 209 }
192 210
193 __code insert4_01_stub(struct Context* context) { 211 __code insert4_01_stub(struct Context* context) {
194 goto insertCase4_01(context, &context->data[Traverse]->traverse); 212 goto insertCase4_01(context, &context->data[Traverse]->traverse);
206 struct Traverse* traverse = &context->data[Traverse]->traverse; 224 struct Traverse* traverse = &context->data[Traverse]->traverse;
207 element->data = (union Data*)traverse->current; 225 element->data = (union Data*)traverse->current;
208 goto insertCase4_1(context, &context->data[Traverse]->traverse); 226 goto insertCase4_1(context, &context->data[Traverse]->traverse);
209 } 227 }
210 __code insertCase4_02(struct Context* context, struct Traverse* traverse) { 228 __code insertCase4_02(struct Context* context, struct Traverse* traverse) {
211 context->data[Traverse]->traverse.nodeStack = context->data[Traverse]->traverse.nodeStack -> next; 229 traverse->nodeStack = traverse->nodeStack -> next;
230 traverse->rotateNext = InsertCase5;
212 goto meta(context, RotateR); 231 goto meta(context, RotateR);
213 } 232 }
214 233
215 __code insert4_02_stub(struct Context* context) { 234 __code insert4_02_stub(struct Context* context) {
216 goto insertCase4_02(context, &context->data[Traverse]->traverse); 235 goto insertCase4_02(context, &context->data[Traverse]->traverse);
250 traverse->nodeStack = traverse->nodeStack->next->next; 269 traverse->nodeStack = traverse->nodeStack->next->next;
251 goto insertCase5(context, &context->data[Traverse]->traverse, context->data[Traverse]->traverse.current, parent, grandparent); 270 goto insertCase5(context, &context->data[Traverse]->traverse, context->data[Traverse]->traverse.current, parent, grandparent);
252 } 271 }
253 272
254 // put rotateLeft's continuation as argument 273 // put rotateLeft's continuation as argument
255 __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent, struct Element* element) { 274 __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent) {
256 struct Node* tmp = node->right; 275 struct Node* tmp = node->right;
257 276
258 if (parent) { 277 if (parent) {
259 if (node == parent->left) 278 if (node == parent->left)
260 parent->left = tmp; 279 parent->left = tmp;
261 else 280 else
262 parent->right = tmp; 281 parent->right = tmp;
263 } else { 282 } else {
264 tree->root = tmp; 283 tree->root = tmp;
265 } 284 }
266 element->data = (union Data*)parent;
267 285
268 node->right = tmp->left; 286 node->right = tmp->left;
269 tmp->left = node; 287 tmp->left = node;
270 traverse->current = tmp; 288 traverse->current = tmp;
271 289
273 } 291 }
274 292
275 __code rotateLeft_stub(struct Context* context) { 293 __code rotateLeft_stub(struct Context* context) {
276 struct Traverse* traverse = &context->data[Traverse]->traverse; 294 struct Traverse* traverse = &context->data[Traverse]->traverse;
277 struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL; 295 struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL;
278 traverse->nodeStack = traverse->nodeStack->next;
279 struct Allocate* allocate = &context->data[Allocate]->allocate;
280 allocate->size = sizeof(struct Element);
281 allocator(context);
282 struct Element* element = &context->data[context->dataNum]->element;
283 goto rotateLeft(context, 296 goto rotateLeft(context,
284 context->data[Traverse]->traverse.current, 297 context->data[Traverse]->traverse.current,
285 &context->data[Tree]->tree, 298 &context->data[Tree]->tree,
286 &context->data[Traverse]->traverse, 299 &context->data[Traverse]->traverse,
287 parent, 300 parent);
288 element); 301 }
289 } 302
290 303 __code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent) {
291 __code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent, struct Element* element) {
292 struct Node* tmp = node->left; 304 struct Node* tmp = node->left;
293 305
294 if (parent) { 306 if (parent) {
295 if (node == parent->left) 307 if (node == parent->left)
296 parent->left = tmp; 308 parent->left = tmp;
298 parent->right = tmp; 310 parent->right = tmp;
299 } else { 311 } else {
300 tree->root = tmp; 312 tree->root = tmp;
301 } 313 }
302 314
303 element->data = (union Data*)parent;
304
305 node->left = tmp->right; 315 node->left = tmp->right;
306 tmp->right = node; 316 tmp->right = node;
307 traverse->current = tmp; 317 traverse->current = tmp;
308 318
309 goto meta(context, traverse->rotateNext); 319 goto meta(context, traverse->rotateNext);
310 } 320 }
311 321
312 __code rotateRight_stub(struct Context* context) { 322 __code rotateRight_stub(struct Context* context) {
313 struct Traverse* traverse = &context->data[Traverse]->traverse; 323 struct Traverse* traverse = &context->data[Traverse]->traverse;
314 struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL; 324 struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL;
315 traverse->nodeStack = traverse->nodeStack->next;
316 struct Allocate* allocate = &context->data[Allocate]->allocate;
317 allocate->size = sizeof(struct Element);
318 allocator(context);
319 struct Element* element = &context->data[context->dataNum]->element;
320 goto rotateRight(context, 325 goto rotateRight(context,
321 context->data[Traverse]->traverse.current, 326 context->data[Traverse]->traverse.current,
322 &context->data[Tree]->tree, 327 &context->data[Tree]->tree,
323 &context->data[Traverse]->traverse, 328 &context->data[Traverse]->traverse,
324 parent, 329 parent);
325 element);
326 } 330 }
327 331
328 __code stackClear(struct Context* context, stack_ptr node_stack, struct Traverse* traverse) { 332 __code stackClear(struct Context* context, stack_ptr node_stack, struct Traverse* traverse) {
329 traverse->current = 0; 333 traverse->current = 0;
330 334