changeset 133:933c80f48d06

node stack rewrite
author ikkun
date Wed, 28 Sep 2016 19:02:25 +0900
parents 73a679a85c04
children 36ac17d37be4
files src/parallel_execution/rb_tree.c
diffstat 1 files changed, 39 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- 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);