changeset 1051:62e938b798ec

copy up1
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Thu, 25 Jan 2024 17:24:51 +0900
parents 88ece4cac620
children cbcdd05bd65c
files src/parallel_execution/RedBlackTree.cbc
diffstat 1 files changed, 43 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Thu Jan 25 15:01:07 2024 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Thu Jan 25 17:24:51 2024 +0900
@@ -103,20 +103,33 @@
 //
 
 __code leftDown(struct RedBlackTree* tree) {
+    struct Stack* inputStack = tree->inputStack;
+
+    printf("leftDown\n");
+    
+    goto inputStack->get(leftDown0);
+}
+
+__code leftDown0(struct Node* node, struct RedBlackTree* tree, struct Stack* stack) {
+    struct Stack* inputStack = tree->inputStack;
     struct Node* newNode = &ALLOCATE(context, Node)->Node;
+    struct Node* data = (Node*)(stack->data);
     newNode->key = tree->current->key;
     newNode->value = (union Data*)new Integer();
     ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value;
     newNode->color = tree->current->color;
-    newNode->right = tree->current->right;
-    struct Stack* inputStack = tree->inputStack;
 
-    printf("leftDown\n");
-    
+    if(data) {
+        data->left = newNode;
+    }
+
+    printf("leftDown0\n");
+
     // 新規ノードをpushしている
     goto inputStack->push(newNode, leftDown1);
 }
 
+// 実際にDownする
 __code leftDown1(struct RedBlackTree* tree) {
     struct Stack* nodeStack = tree->nodeStack;
     struct Node* oldNode = tree->current;
@@ -129,12 +142,13 @@
 __code leftDown2(struct RedBlackTree* tree) {
     struct Stack* inputStack = tree->inputStack;
     printf("leftDown2\n");
-    if (tree->current->left) {
-        goto leftDown(tree->current->left, inputStack);
-    } else if (tree->current->right) {
-        goto rightDown(tree->current->right, inputStack);
-    } else {
+    if (tree->current) {
+        goto leftDown(tree, inputStack);
+    } else if (tree->current == NULL) {
         goto inputStack->pop(up);
+        // このあとnodeStack->popが必要
+    } else if (tree->current->left) {
+        goto rightDown(tree, inputStack);
     }
 }
 
@@ -151,26 +165,30 @@
     goto nodeStack->push(newNode, leftDown);
 }
 
-__code up(struct RedBlackTree* tree, struct Stack* inputStack) {
+//
+// upしつつright見つつ
+// NULLからのup
+__code up(struct RedBlackTree* tree) {
     struct Stack* nodeStack = tree->nodeStack;
-    struct Node* newNode = tree->newNode;
-    // inputStack->data見てるのは間違い
-    struct Node* node = tree->current;
+
     printf("up\n");
-    // popでNULLだった場合どうなる?
-    if (node->left) {
-        tree->current = node->right;
-        node->left = newNode;
-        goto nodeStack->push((union Data*)node, rightDown);
-    } else {
-        node->right = newNode;
-        newNode = node;
-        goto nodeStack->isEmpty(popWhenNoEmpty, popWhenEmpty);
-    }
+    // current付け替えしたい
+    // getして付け替えてpopだな...
+    goto nodeStack->get(up0);
 }
 
-// upするときにstackの情報を元にcurrentを付け替えないといけないのでは?
-__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) {
+__code up0(struct RedBlackTree* tree, struct Stack* stack) {
+    struct Stack* nodeStack = tree->nodeStack;
+    struct Node* data = (Node*)(stack->data);
+    tree->current = data;
+
+    printf("up0\n");
+
+    goto nodeStack->pop(up1);
+}
+
+// rightを見てさらにupするか考える
+__code up1(struct RedBlackTree* tree) {
     struct Stack* nodeStack = tree->nodeStack;
     printf("up1\n");
     goto nodeStack->pop(up2);