view src/parallel_execution/examples/gearsFile/GearsFileImpl.cbc @ 1032:793b21a8ea12

fix include
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 24 Oct 2023 12:25:40 +0900
parents 0034a63e9c85
children
line wrap: on
line source

#include <stdio.h>
#interface "GearsFile.h"
#interface "Queue.h"
#interface "FileData.h"
#impl "GearsFile" as "GearsFileImpl.h".h

// ----
// typedef struct GearsFileImpl <> impl GearsFile {
//     __code next(...);
// } GearsFileImpl;
// ----

GearsFile* createGearsFileImpl(struct Context* context) {
    struct GearsFile* gearsFile  = new GearsFile();
    struct GearsFileImpl* gears_file_impl = new GearsFileImpl();
    gearsFile->gearsFile = (union Data*)gears_file_impl;

    gears_file_impl->inputQueue = createSingleLinkedQueue(context);
    gears_file_impl->outputQueue = createSingleLinkedQueue(context);
    gears_file_impl->mainQueue = createSingleLinkedQueue(context);

    gearsFile->readData = C_readDataGearsFileImpl;
    gearsFile->writeData = C_writeDataGearsFileImpl;
    gearsFile->test = C_testGearsFileImpl;
    return gearsFile;
}

__code readData(struct GearsFileImpl* gearsFile, __code next(...)) {
    struct Queue* iQueue = gearsFile->inputQueue;
    goto iQueue->take(test);
}

__code writeData(struct GearsFileImpl* gearsFile, Data* data,__code next(...)) {
    printf("writeData\n");
    struct Queue* queue = gearsFile->inputQueue;
    Gearef(context, GearsFile)->fileData = data; //手入力
    goto putInputQueue(fileData, next);
}

__code putInputQueue(struct GearsFileImpl* gearsFile, FileData* fileData, __code next(...)){
    printf("putInputQueue\n", fileData->string);
    struct Queue* iQueue = gearsFile->inputQueue;
    goto iQueue->put(fileData, takeInputQueue); 
}

__code takeInputQueue(struct GearsFileImpl* gearsFile, __code next(...)){
    printf("takeInputQueue\n");
    struct Queue* iQueue = gearsFile->inputQueue;
    goto iQueue->take(putMainQueue); 
}

__code putMainQueue(struct GearsFileImpl* gearsFile, FileData* fileData, __code next(...)){
    printf("putMainQueue\n", fileData->string);
    struct Queue* mainQueue = gearsFile->mainQueue;
    goto mainQueue->put(fileData, takeMainQueue); 
}

__code putMainQueue_stub(Context* context){
	GearsFileImpl* gearsFile = (GearsFileImpl*)GearImpl(context, GearsFile, gearsFile);
    FileData* fileData = Gearef(context, Queue)->data;
    enum Code next = Gearef(context, GearsFile)->next;
    goto putMainQueueGearsFileImpl(context, gearsFile, fileData, next);
}

__code takeMainQueue(struct GearsFileImpl* gearsFile, __code next(...)){
    printf("takeMainQueue\n");
    struct Queue* mainQueue = gearsFile->mainQueue;
    goto mainQueue->take(test); 
}

__code test(struct GearsFileImpl* gearsFile, FileData* fileData, __code next(...)) {
    if (fileData == NULL){
        printf("End of File\n");
        goto exit_code();
    } else {
        printf("%s\n", fileData->string);
        goto next(...);
    }
}

__code testGearsFileImpl_stub(struct Context* context){
	GearsFileImpl* gearsFile = (GearsFileImpl*)GearImpl(context, GearsFile, gearsFile);
    FileData* fileData = Gearef(context, Queue)->data;
    enum Code next = Gearef(context, GearsFile)->next;
    goto testGearsFileImpl(context, gearsFile, fileData, next);
}