# HG changeset patch # User ikkun # Date 1475056945 -32400 # Node ID 933c80f48d0655ca0bc0bd7715a10b712888bfc2 # Parent 73a679a85c04b4ee9055ce6c4f50de8fd161cdf9 node stack rewrite diff -r 73a679a85c04 -r 933c80f48d06 src/parallel_execution/rb_tree.c --- a/src/parallel_execution/rb_tree.c Wed Sep 28 18:47:16 2016 +0900 +++ b/src/parallel_execution/rb_tree.c Wed Sep 28 19:02:25 2016 +0900 @@ -217,7 +217,7 @@ goto meta(context, InsertCase5); } -__code insert4_2_stub(struct Context* context) { +__code insert4_2_stub(struct Context* context) { struct Allocate* allocate = &context->data[Allocate]->allocate; allocate->size = sizeof(struct Element); allocator(context); @@ -249,11 +249,41 @@ // put rotateLeft's continuation as argument __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent) { struct Node* tmp = node->right; - struct Node* parent = 0; + + if (parent) { + if (node == parent->left) + parent->left = tmp; + else + parent->right = tmp; + } else { + tree->root = tmp; + } + element->data = (struct Data*)parent; - // if you have a pararent as an argument , we don't need stack operation - stack_pop(context->node_stack, &parent); + node->right = tmp->left; + tmp->left = node; + traverse->current = tmp; + + goto meta(context, traverse->rotateNext); +} + +__code rotateLeft_stub(struct Context* context) { + struct Traverse* traverse = context->data[Traverse]->traverse; + struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL; + traverse->nodeStack = traverse->nodeStack->next; + struct Allocate* allocate = &context->data[Allocate]->allocate; + allocate->size = sizeof(struct Element); + allocator(context); + struct Element* element = &context->data[context->dataNum]->node; + goto rotateLeft(context, + context->data[Traverse]->traverse.current, + &context->data[Tree]->tree, + &context->data[Traverse]->traverse); +} +__code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent, struct Node* element) { + struct Node* tmp = node->left; + if (parent) { if (node == parent->left) parent->left = tmp; @@ -263,39 +293,8 @@ tree->root = tmp; } - stack_push(context->node_stack, &parent); - - node->right = tmp->left; - tmp->left = node; - traverse->current = tmp; - - goto meta(context, traverse->rotateNext); -} - -__code rotateLeft_stub(struct Context* context) { - goto rotateLeft(context, - context->data[Traverse]->traverse.current, - &context->data[Tree]->tree, - &context->data[Traverse]->traverse); -} + element->data = (struct Data*)parent; -__code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse) { - struct Node* tmp = node->left; - struct Node* parent = 0; - - stack_pop(context->node_stack, &parent); - - if (parent) { - if (node == parent->left) - parent->left = tmp; - else - parent->right = tmp; - } else { - tree->root = tmp; - } - - stack_push(context->node_stack, &parent); - node->left = tmp->right; tmp->right = node; traverse->current = tmp; @@ -304,6 +303,10 @@ } __code rotateRight_stub(struct Context* context) { + struct Allocate* allocate = &context->data[Allocate]->allocate; + allocate->size = sizeof(struct Element); + allocator(context); + struct Element* element = &context->data[context->dataNum]->node; goto rotateRight(context, context->data[Traverse]->traverse.current, &context->data[Tree]->tree, @@ -311,9 +314,6 @@ } __code stackClear(struct Context* context, stack_ptr node_stack, struct Traverse* traverse) { - if (stack_pop(node_stack, &traverse->current) == 0) - goto meta(context, StackClear); - traverse->current = 0; goto meta(context, context->next);