view src/parallel_execution/stack.c @ 217:c34e6aa10967

Fix DataGear access name
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Mon, 09 Jan 2017 01:18:13 +0900
parents 119c035e0e36
children ebc13549394c
line wrap: on
line source

#include "context.h"
#include "stack.h"
#include "origin_cs.h"
#include <stdio.h>

union Data* createSingleLinkedStack(struct Context* context) {
    struct Stack* stack = &ALLOCATE(context, Stack)->Stack;
    struct SingleLinkedStack* singleLinkedStack = &ALLOCATE(context, SingleLinkedStack)->SingleLinkedStack;
    stack->stack = (union Data*)singleLinkedStack;
    singleLinkedStack->top = NULL;
    stack->push = C_pushSingleLinkedStack;
    stack->pop  = C_popSingleLinkedStack;
    stack->pop2  = C_pop2SingleLinkedStack;
    stack->get  = C_getSingleLinkedStack;
    stack->get2  = C_get2SingleLinkedStack;
    stack->isEmpty = C_isEmptySingleLinkedStack;
    stack->clear = C_clearSingleLinkedStack;
    return (union Data*)(stack);
}

void printStack1(union Data* data) {
    struct Node* node = &data->Element.data->Node;
    if (node == NULL) {
        printf("NULL");
    } else {
        printf("key = %d ,", node->key);
        printStack1((union Data*)data->Element.next);
    }
}

void printStack(union Data* data) {
    printStack1(data);
    printf("\n");
}

__code clearSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack,enum Code next) {
    stack->top = NULL;
    goto meta(context, next);
}

__code clearSingleLinkedStack_stub(struct Context* context) {
    goto clearSingleLinkedStack(context, (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack, context->data[D_Stack]->Stack.next);
}

__code pushSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, struct Element* element, union Data* data, enum Code next) {
    element->next = stack->top;
    element->data = data;
    stack->top = element;
    goto meta(context, next);
}

__code pushSingleLinkedStack_stub(struct Context* context) {
    struct Element* element = &ALLOCATE(context, Element)->Element;
    goto pushSingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               element,
                               context->data[D_Stack]->Stack.data,
                               context->data[D_Stack]->Stack.next);
}

__code popSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** data, enum Code next) {
    if (stack->top) {
        *data = stack->top->data;
        stack->top = stack->top->next;
    } else {
        *data = NULL;
    }
    goto meta(context, next);
}

__code popSingleLinkedStack_stub(struct Context* context) {
    goto popSingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               &context->data[D_Stack]->Stack.data,
                               context->data[D_Stack]->Stack.next);
}

__code pop2SingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** data, union Data** data1, enum Code next) {
    if (stack->top) {
        *data = stack->top->data;
        stack->top = stack->top->next;
    } else {
        *data = NULL;
    }
    if (stack->top) {
        *data1 = stack->top->data;
        stack->top = stack->top->next;
    } else {
        *data1 = NULL;
    }
    goto meta(context, next);
}

__code pop2SingleLinkedStack_stub(struct Context* context) {
    goto pop2SingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               &context->data[D_Stack]->Stack.data,
                               &context->data[D_Stack]->Stack.data1,
                               context->data[D_Stack]->Stack.next);
}

__code getSingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** data, enum Code next) {
    if (stack->top)
        *data = stack->top->data;
    else
        *data = NULL;
    goto meta(context, next);
}

__code getSingleLinkedStack_stub(struct Context* context) {
    goto getSingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               &context->data[D_Stack]->Stack.data,
                               context->data[D_Stack]->Stack.next);
}

__code get2SingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, union Data** data, union Data** data1, enum Code next) {
    if (stack->top) {
        *data = stack->top->data;
        if (stack->top->next) {
            *data1 = stack->top->next->data;
        } else {
            *data1 = NULL;
        }
    } else {
        *data = NULL;
        *data1 = NULL;
    }
    goto meta(context, next);
}

__code get2SingleLinkedStack_stub(struct Context* context) {
    goto get2SingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               &context->data[D_Stack]->Stack.data,
                               &context->data[D_Stack]->Stack.data1,
                               context->data[D_Stack]->Stack.next);
}

__code isEmptySingleLinkedStack(struct Context* context, struct SingleLinkedStack* stack, enum Code next,enum Code whenEmpty) {
    if (stack->top)
        goto meta(context, next);
    else
        goto meta(context, whenEmpty);
}

__code isEmptySingleLinkedStack_stub(struct Context* context) {
    goto isEmptySingleLinkedStack(context,
                               (struct SingleLinkedStack *)context->data[D_Stack]->Stack.stack->Stack.stack,
                               context->data[D_Stack]->Stack.next,
                               context->data[D_Stack]->Stack.whenEmpty);
}