view src/insert_verification/akashaLLRBContext.c @ 11:b13d2c8d4b47

Fix iterator
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Wed, 16 Mar 2016 17:19:50 +0900
parents e864ede359cc
children 78dce131e9d6
line wrap: on
line source

#include <stdlib.h>

#include "akashaLLRBContext.h"

extern __code insertOnce_stub(struct Context*);
extern __code showTree_stub(struct Context*);
extern __code iterateInsertion_stub(struct Context*);

/* definitions from llrb */
extern __code meta(struct Context*, enum Code next);
extern __code put_stub(struct Context*);
extern __code replaceNode_stub(struct Context*);
extern __code insertNode_stub(struct Context*);
extern __code rotateLeft_stub(struct Context*);
extern __code rotateRight_stub(struct Context*);
extern __code colorFlip_stub(struct Context*);
extern __code fixUp_stub(struct Context*);
extern __code changeReference_stub(struct Context*);
extern __code insert1_stub(struct Context*);
extern __code insert2_stub(struct Context*);
extern __code insert3_stub(struct Context*);
extern __code insert4_stub(struct Context*);
extern __code insert4_1_stub(struct Context*);
extern __code insert4_2_stub(struct Context*);
extern __code insert5_stub(struct Context*);
extern __code stackClear_stub(struct Context*);
extern __code get_stub(struct Context*);
extern __code search_stub(struct Context*);
extern __code delete_stub(struct Context*);
extern __code delete1_stub(struct Context*);
extern __code delete2_stub(struct Context*);
extern __code delete3_stub(struct Context*);
extern __code replaceNodeForDelete1_stub(struct Context*);
extern __code replaceNodeForDelete2_stub(struct Context*);
extern __code findMax1_stub(struct Context*);
extern __code findMax2_stub(struct Context*);
extern __code deleteCase1_stub(struct Context*);
extern __code deleteCase2_stub(struct Context*);
extern __code deleteCase3_stub(struct Context*);
extern __code deleteCase4_stub(struct Context*);
extern __code deleteCase5_stub(struct Context*);
extern __code deleteCase6_stub(struct Context*);
extern __code exitCode(struct Context*);

__code initIterator(struct Context*);
__code initFinishIterator(struct Context*, struct IterElem*);

__code initLLRBContext(struct Context* context, enum Code next) {
    context->heapLimit = sizeof(union Data)*ALLOCATE_SIZE;
    context->code      = malloc(sizeof(__code*)*ALLOCATE_SIZE);
    context->data      = malloc(sizeof(union Data*)*ALLOCATE_SIZE);
    context->heapStart = malloc(context->heapLimit);

    context->codeNum = Exit;

    context->code[InsertOnce]       = insertOnce_stub;
    context->code[ShowTree]         = showTree_stub;
    context->code[IterateInsertion] = iterateInsertion_stub;

    /* definitions from llrb */
    context->code[Put]           = put_stub;
    context->code[Replace]       = replaceNode_stub;
    context->code[Insert]        = insertNode_stub;
    context->code[RotateL]       = rotateLeft_stub;
    context->code[RotateR]       = rotateRight_stub;
    context->code[InsertCase1]   = insert1_stub;
    context->code[InsertCase2]   = insert2_stub;
    context->code[InsertCase3]   = insert3_stub;
    context->code[InsertCase4]   = insert4_stub;
    context->code[InsertCase4_1] = insert4_1_stub;
    context->code[InsertCase4_2] = insert4_2_stub;
    context->code[InsertCase5]   = insert5_stub;
    context->code[StackClear]    = stackClear_stub;
    context->code[Exit]          = exitCode;

    context->heap = context->heapStart;

    context->data[Allocate] = context->heap;
    context->heap += sizeof(struct Allocate);

    context->data[Tree] = context->heap;
    context->heap += sizeof(struct Tree);

    context->data[Node] = context->heap;
    context->heap += sizeof(struct Node);

    context->data[Iter] = context->heap;
    context->heap += sizeof(struct Iterator);

    context->dataNum = Iter;

    struct Tree* tree = &context->data[Tree]->tree;
    tree->root = 0;
    tree->current = 0;
    tree->deleted = 0;

    context->node_stack = stack_init(sizeof(struct Node*), 100);
    context->code_stack = stack_init(sizeof(enum Code), 100);

    context->next = next;
    goto initIterator(context);
}

__code initIterator(struct Context* context) {
    struct IterElem* ie   = (struct IterElem*)malloc(sizeof(struct IterElem));
    struct Iterator* iter = &context->data[Iter]->iterator;

    ie->val    = 0;
    ie->next   = NULL;
    iter->tree = NULL;
    iter->head = ie;

    goto initIteratorElem(context, ie);
}

__code initIteratorElem(struct Context* context, struct IterElem* prev) {
    if (prev->val >= LIMIT_OF_VERIFICATION_SIZE) { goto initFinishIterator(context, prev); }

    struct IterElem* ie = (struct IterElem *)malloc(sizeof(struct IterElem));
    ie->val             = prev->val + 1;
    prev->next          = ie;
    goto initIteratorElem(context, ie);
}

__code initFinishIterator(struct Context* context, struct IterElem* elem) {
    struct Iterator* iter = &context->data[Iter]->iterator;
    elem->next            = iter->head;
    iter->last            = iter->head;
    goto meta(context, context->next);
}