changeset 1047:e4b5151e2bb5

...
author matac42 <matac@cr.ie.u-ryukyu.ac.jp>
date Mon, 22 Jan 2024 23:25:28 +0900
parents b78e92bb5007
children 1a1b50736246
files src/parallel_execution/RedBlackTree.cbc src/parallel_execution/plautogen/impl/RedBlackTree.h src/parallel_execution/test/rbTreeCopy_test.cbc
diffstat 3 files changed, 43 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc	Tue Jan 16 18:46:41 2024 +0900
+++ b/src/parallel_execution/RedBlackTree.cbc	Mon Jan 22 23:25:28 2024 +0900
@@ -9,14 +9,17 @@
 Tree* createRedBlackTree(struct Context* context) {
     struct Tree* tree = new Tree();
     struct RedBlackTree* redBlackTree = new RedBlackTree();
+
     tree->tree = (union Data*)redBlackTree;
-    redBlackTree->root = NULL;
-    redBlackTree->nodeStack = createSingleLinkedStack(context);
     tree->put = C_putRedBlackTree;
     tree->get = C_getRedBlackTree;
     tree->remove = C_removeRedBlackTree;
     // tree->clear = C_clearRedBlackTree;
     tree->copy = C_copyRedBlackTree;
+
+    redBlackTree->root = NULL;
+    redBlackTree->nodeStack = createSingleLinkedStack(context);
+    redBlackTree->inputStack = createSingleLinkedStack(context);
     return tree;
 }
 
@@ -99,7 +102,7 @@
     goto nodeStack->push((union Data*)newNode, leftDown);
 }
 
-__code leftDown(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+__code leftDown(struct RedBlackTree* tree, struct Stack* outputStack) {
     struct Node* newNode = &ALLOCATE(context, Node)->Node;
     newNode->key = tree->current->key;
     // newNode->value = tree->current->value;
@@ -107,20 +110,24 @@
     ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value;
     newNode->color = tree->current->color;
     newNode->right = tree->current->right;
-    struct Stack* nodeStack = tree->nodeStack;
+    struct Stack* inputStack = tree->inputStack;
     printf("leftDown\n");
-    goto nodeStack->push(newNode, leftDown1);
+
+    // 新規ノードをpushしている
+    goto inputStack->push(newNode, leftDown1);
 }
 
-__code leftDown1(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
-    struct Stack* nodeStack = tree->nodeStack;
+__code leftDown1(struct RedBlackTree* tree, struct Stack* outputStack) {
+    struct Stack* inputStack = tree->inputStack;
     printf("leftDown1\n");
     if (tree->current->left) {
+        // ここではnodeStackを積みたいが......
+        // leftDown2を作るか
         goto leftDown(tree->current->left, inputStack, outputStack);
     } else if (tree->current->right) {
         goto rightDown(tree->current->right, inputStack, outputStack);
     } else {
-        goto nodeStack->pop(up);
+        goto inputStack->pop(up);
     }
 }
 
@@ -137,10 +144,12 @@
     goto nodeStack->push(newNode, leftDown);
 }
 
-__code up(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
+__code up(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) {
     struct Stack* nodeStack = tree->nodeStack;
     struct Node* newNode = tree->newNode;
+    struct Node* node = &(inputStack->data)->Node;
     printf("up\n");
+    // popでNULLだった場合どうなる?
     if (node->left) {
         tree->current = node->right;
         node->left = newNode;
@@ -167,9 +176,10 @@
 
 __code popWhenEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack, __code next(...)) {
     // treeの入れ替え
-    struct Tree* newTree = new Tree();
+    // struct Tree* newTree = new Tree();
     struct RedBlackTree* newRedBlackTree = new RedBlackTree();
-    newTree->tree = (union Data*)newRedBlackTree;
+    // newTree->tree = (union Data*)newRedBlackTree;
+    // ここtreeじゃなくてinputStackからpopしたNodeを入れてあげないといけない。
     newRedBlackTree->root = tree->newNode;
     newRedBlackTree->current = tree->newNode;
     tree = newRedBlackTree;
--- a/src/parallel_execution/plautogen/impl/RedBlackTree.h	Tue Jan 16 18:46:41 2024 +0900
+++ b/src/parallel_execution/plautogen/impl/RedBlackTree.h	Mon Jan 22 23:25:28 2024 +0900
@@ -6,6 +6,8 @@
   struct Node* parent;
   struct Node* grandparent;
   struct Stack* nodeStack;
+  struct Stack* inputStack;
+  struct Stack* outputStack;
   __code findNodeNext(...);
   int result;
 } RedBlackTree;
--- a/src/parallel_execution/test/rbTreeCopy_test.cbc	Tue Jan 16 18:46:41 2024 +0900
+++ b/src/parallel_execution/test/rbTreeCopy_test.cbc	Mon Jan 22 23:25:28 2024 +0900
@@ -21,15 +21,32 @@
 }
 
 __code rbTreeTest2(struct Tree* tree) {
-  printf("test2\n");
+  printf("Test2\n");
+  Node* node = new Node();
+  node->value = (union Data*)new Integer();
+  ((Integer*)node->value)->value = 2;
+  node->key = 2;
+  printf("value->%d,key->%d\n",((Integer*)node->value)->value,node->key);
+  goto tree->put(node, rbTreeTest3);
+}
+
+__code rbTreeTest2_stub(struct Context* context) {
+  printf("test2_stub\n");
+  Tree* tree = createRedBlackTree(context);
+  goto rbTreeTest2(context,tree);
+}
+
+__code rbTreeTest3(struct Tree* tree) {
+  printf("test3\n");
   Node* node = new Node();
   node->value = (union Data*)new Integer();
   goto tree->copy(node, exit_code);
 }
 
-__code rbTreeTest2_stub(struct Context* context) {
+__code rbTreeTest3_stub(struct Context* context) {
+  printf("test3_stub\n");
   Tree* tree = (struct Tree*)Gearef(context, Tree)->tree;
-  goto rbTreeTest2(context,tree);
+  goto rbTreeTest3(context,tree);
 }
 
 int main(int argc, char const* argv[]) {