Mercurial > hg > Gears > Gears
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;