changeset 1039:23528e058b25

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Tue, 07 Nov 2023 11:58:03 +0900
parents 9a8eba5d27f8
children cf2aa790afe7
files src/parallel_execution/RedBlackTree.cbc
diffstat 1 files changed, 60 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Mon Nov 06 15:23:19 2023 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Tue Nov 07 11:58:03 2023 +0900
@@ -95,7 +95,66 @@
     struct Node* newNode = tree->newNode;
     tree->previous = newNode;
     *newNode = *oldNode;
-    goto nodeStack->push((union Data*)newNode, copyRedBlackTree1);
+    goto nodeStack->push((union Data*)newNode, leftDown);
+}
+
+__code leftDown(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    // ノードをアロケートしてinputStackに入れる
+    struct Node* newNode = &ALLOCATE(context, Node)->Node;
+    newNode->key = tree->current->key;
+    newNode->value = tree->current->value;
+    newNode->color = tree->current->color;
+    newNode->right = tree->current->right;
+    struct Stack* nodeStack = tree->nodeStack;
+    goto nodeStack->push(newNode, leftDown1);
+}
+
+__code leftDown1(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    // if tree->left goto leftDown(tree->left, inputStack, outputStack)
+    // else if tree->right goto rightDown(tree->right, inputStack, outputStack)
+    // else goto up(tree, inputStack, outputStack)
+    if (tree->left) {
+        goto leftDown(tree->left, inputStack, outputStack);
+    } else if (tree->right) {
+        goto rightDown(tree->right, inputStack, outputStack);
+    } else {
+        goto up(tree, inputStack, outputStack);
+    }
+}
+
+__code rightDown(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    // ノードをアロケートしてinputStackに入れる
+    struct Node* newNode = &ALLOCATE(context, Node)->Node;
+    newNode->key = tree->current->key;
+    newNode->value = tree->current->value;
+    newNode->color = tree->current->color;
+    tree->current = tree->current->right;
+    struct Stack* nodeStack = tree->nodeStack;
+    goto nodeStack->push(newNode, leftDown);
+}
+
+__code up(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    // if 左からきたら inputStack->top->leftを埋める
+    //    goto rightDown()
+    // if 右からきたら
+    //     pop inputStack
+    //     pop outputStack
+    //     inputStack->top->rightを埋めてgoto up(tree, inputStack, outputStack)
+    struct Stack* nodeStack = tree->nodeStack;
+    struct Node* newNode = tree->newNode;
+    if (nodeStack->top->left) {
+        nodeStack->top->left = newNode;
+        goto rightDown(tree, inputStack, outputStack);
+    } else {
+        goto nodeStack->pop(up1);
+    }
+}
+
+__code up1(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+    //     inputStack->top->rightを埋めてgoto up(tree, inputStack, outputStack)
+    struct Stack* nodeStack = tree->nodeStack;
+    tree->current->right = nodeStack->top->right;
+    goto up(tree, inputStack, outputStack);
 }
 
 __code copyRedBlackTree1(struct RedBlackTree* tree, struct Node* node, __code next(...)) {
@@ -124,13 +183,6 @@
     
 }
 
-__code copyRedBlackTreePop(struct RedBlackTree* tree, struct Node* node, __code next(...)) {
-    struct Stack* nodeStack = tree->nodeStack;
-    if (->right != Null) {
-        goto nodeStack->pop(rotateLeft);
-    }
-}
-
 __code insertNode(struct RedBlackTree* tree, struct Node* node) {
     struct Stack* nodeStack = tree->nodeStack;
     struct Node* newNode = tree->newNode;