changeset 1054:7274db9ef926

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Thu, 25 Jan 2024 22:58:56 +0900
parents e53cbb2fa8b0
children 81439e83c4d2
files src/parallel_execution/RedBlackTree.cbc
diffstat 1 files changed, 19 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Thu Jan 25 19:21:01 2024 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Thu Jan 25 22:58:56 2024 +0900
@@ -94,6 +94,7 @@
 
 __code copyRedBlackTree(struct RedBlackTree* tree) {
     tree->current = tree->root;
+    // 最初にrootノードをコピーしておきたい
     goto leftDown(tree);
 }
 
@@ -140,12 +141,14 @@
 }
 
 __code leftDown3(struct RedBlackTree* tree) {
-    struct Stack* inputStack = tree->inputStack;
+    struct Stack* nodeStack = tree->nodeStack;
     printf("leftDown3\n");
     if (tree->current) {
-        goto leftDown(tree, inputStack);
+        goto leftDown(tree);
     } else if (tree->current == NULL) {
-        goto inputStack->pop(up);
+        // ここでinputStackをpopする必要はない
+        // currentの付け替えをして
+        goto nodeStack->pop(leftDown4);
     } else if (tree->current->left) {
         // 謎の処理
         printf("nazo\n");
@@ -153,6 +156,14 @@
     }
 }
 
+__code leftDown4(struct RedBlackTree* tree, struct Stack* stack) {
+    struct Node* data = (Node*)(stack->data);
+    tree->current = data;
+    printf("leftDown4\n");
+
+    goto up();
+}
+
 __code rightDown(struct RedBlackTree* tree) {
     struct Stack* inputStack = tree->inputStack;
 
@@ -166,10 +177,10 @@
     struct Stack* inputStack = tree->inputStack;
     struct Node* newNode = &ALLOCATE(context, Node)->Node;
     struct Node* data = (Node*)(stack->data);
-    newNode->key = tree->current->key;
+    newNode->key = tree->current->right->key;
     newNode->value = (union Data*)new Integer();
-    ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value;
-    newNode->color = tree->current->color;
+    ((Integer*)newNode->value)->value = ((Integer*)tree->current->right->value)->value;
+    newNode->color = tree->current->right->color;
 
     if(data) {
         data->right = newNode;
@@ -221,7 +232,7 @@
 }
 
 __code up1(struct RedBlackTree* tree, struct Stack* stack) {
-    struct Stack* nodeStack = tree->nodeStack;
+    struct Stack* inputStack = tree->inputStack;
     struct Node* data = (Node*)(stack->data);
     tree->current = data;
 
@@ -234,7 +245,7 @@
     printf("up1\n");
 
     // rightの状態を見る前にpopしてしまっている気がする
-    goto nodeStack->pop(up2);
+    goto inputStack->pop(up2);
 }
 
 // rightを見てさらにupするか考える
@@ -242,7 +253,6 @@
     struct Stack* inputStack = tree->inputStack;
     printf("up2\n");
     if (tree->current->right) {
-        tree->current = tree->current->right;
         goto rightDown(tree);
     }