# HG changeset patch # User Shohei KOKUBO # Date 1448887250 -32400 # Node ID 099d85f9d371e11f83d2d3bd785b13260742bb77 # Parent 618c03f25108cc35cdbdc2a8e660eb05fc7bef58 refactoring diff -r 618c03f25108 -r 099d85f9d371 src/llrb/llrb.c --- a/src/llrb/llrb.c Fri Nov 27 02:14:25 2015 +0900 +++ b/src/llrb/llrb.c Mon Nov 30 21:40:50 2015 +0900 @@ -16,6 +16,7 @@ if (tree->root) { tree->current = tree->root; + tree->root = &context->data[context->dataNum]->node; compare(context, tree, tree->current->key, context->data[Node]->node.key); goto meta(context, Replace); @@ -34,7 +35,8 @@ if (result == 0) { newNode->value = context->data[Node]->node.value; - goto meta(context, SetRoot); + stack_pop(context->code_stack, &context->next); + goto meta(context, context->next); } else if (result == 1) { tree->current = oldNode->right; newNode->right = context->heap; @@ -59,11 +61,29 @@ goto replaceNode(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node, context->data[Tree]->tree.result); } +__code insertNode(struct Context* context, struct Tree* tree, struct Node* node, struct Node* newNode) { + node->color = Red; + *newNode = *node; + newNode->parent = tree->current; + + tree->current = newNode; + + goto meta(context, Balance1); +} + +__code insertNode_stub(struct Context* context) { + goto insertNode(context, &context->data[Tree]->tree, &context->data[Node]->node, &context->data[context->dataNum]->node); +} + __code balance1(struct Context* context, struct Node* current) { - if (current->parent == 0) - goto meta(context, SetRoot); - else + if (current->parent == 0) { + current->color = Black; + + stack_pop(context->code_stack, &context->next); + goto meta(context, context->next); + } else { goto meta(context, Balance2); + } } __code balance1_stub(struct Context* context) { @@ -105,7 +125,7 @@ } __code balance3_stub(struct Context* context) { - goto balance3(context, context->data[Tree], context->data[Tree]->tree.current); + goto balance3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); } __code balance4(struct Context* context, struct Node* current) { @@ -136,7 +156,7 @@ } __code balance4_1_stub(struct Context* context) { - goto balance4_1(context, context->data[Tree]); + goto balance4_1(context, &context->data[Tree]->tree); } __code balance4_2(struct Context* context, struct Tree* tree) { @@ -145,16 +165,13 @@ } __code balance4_2_stub(struct Context* context) { - goto balance4_2(context, context->data[Tree]); + goto balance4_2(context, &context->data[Tree]->tree); } __code balance5(struct Context* context, struct Tree* tree, struct Node* current) { current->parent->color = Black; current->parent->parent->color = Red; - context->next = SetRoot; - - stack_push(context->code_stack, &context->next); tree->current = current->parent->parent; if ((current == current->parent->left) && (current->parent == current->parent->parent->left)) @@ -164,21 +181,7 @@ } __code balance5_stub(struct Context* context) { - goto balance5(context, context->data[Tree], context->data[Tree]->tree.current); -} - -__code insertNode(struct Context* context, struct Tree* tree, struct Node* node, struct Node* newNode) { - node->color = Red; - *newNode = *node; - newNode->parent = tree->current; - - tree->current = newNode; - - goto meta(context, Balance1); -} - -__code insertNode_stub(struct Context* context) { - goto insertNode(context, &context->data[Tree]->tree, &context->data[Node]->node, &context->data[context->dataNum]->node); + goto balance5(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); } __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree) {