changeset 1035:b331fcbdaec8

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Thu, 02 Nov 2023 16:28:25 +0900
parents 4761d569dcf5
children 9b95501b272b
files src/parallel_execution/RedBlackTree.cbc
diffstat 1 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Fri Oct 27 12:03:20 2023 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Thu Nov 02 16:28:25 2023 +0900
@@ -16,6 +16,7 @@
     tree->get = C_getRedBlackTree;
     tree->remove = C_removeRedBlackTree;
     // tree->clear = C_clearRedBlackTree;
+    tree->copy = C_copyRedBlackTree;
     return tree;
 }
 
@@ -88,6 +89,48 @@
     
 }
 
+__code copyTree(struct RedBlackTree* tree) {
+    struct Stack* nodeStack = tree->nodeStack;
+    struct Node* oldNode = tree->current;
+    struct Node* newNode = tree->newNode;
+    tree->previous = newNode;
+    *newNode = *oldNode;
+    goto nodeStack->push((union Data*)newNode, copyTree1);
+}
+
+__code copyTree1(struct RedBlackTree* tree, struct Node* node, __code next(...)) {
+    struct Node* oldNode = tree->current;
+    struct Node* newNode = tree->previous;
+    struct Node* newnewNode = &ALLOCATE(context, Node)->Node;
+    newnewNode->key = oldNode->key;
+    newnewNode->value = oldNode->value;
+    newnewNode->left = newNode->left;
+    if (newnewNode->left != Null) {
+        goto copyTree(newnewNode->left);
+    }
+    newnewNode->right = newNode->right;
+    if (newnewNode->right != Null) {
+        goto copyTree(newnewNode->right);
+    }
+    goto copyTreePop(tree);
+    tree->newNode = newnewNode;
+    
+    if (tree->current) {
+        tree->result = compare(tree->current, node);
+        goto findNode(tree);
+    }
+    goto meta(context, tree->findNodeNext);
+    //   gato tree->findNodeNext(tree, node);
+    
+}
+
+__code copyTreePop(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;