#ifndef _PL_FORK_H_ #define _PL_FORK_H_ #include "PipeLine.h" // p1e1 p1e2 p1e3 ... p1eN // p2e1 p2e2... p2eN class PL_Fork : public PipeLineElem { public: enum ForkBy { // do nothing FB_NONE, // time 1: p1e1 p1e2 [p1e3 ... p1eN] // time 2: p1e1 p1e2 [p2e1 p2e2... p2eN] FB_TURNS, // p1e1 p1e2 [p1e3 ... p1eN]|[p2e1 p2e2... p2eN] FB_RANDOM, // supported now! // p1e1 p1e2 TYPE1[p1e3 ... p1eN] TYPE2[p2e1 p2e2... p2eN] // Sync behavior depends on ForkSync FB_PM_TYPE, // supported now! FB_MB_TYPE, // FS_MAIN_PL_FIRST: p1e1 p1e2 [p1e3 p2e1] [p1e4 p2e2] ... // FS_MAIN_PL_LAST : p1e1 p1e2 [p2e1 p1e3] [p2e2 p1e4] ... FB_ALTERNATE }; enum ForkSync { // do nothing FS_NONE, // supported now! FS_PARALLEL, // Result of main pl will be paid to branch pl FS_MAIN_PL_FIRST, // Result of branch pl will be paid to main pl FS_BRANCH_PL_FIRST }; public: PL_Fork(); virtual ~PL_Fork(); virtual bool init(void* args); virtual void finit(); virtual bool pay(const PipeMaterial& pm); virtual bool gain(PipeMaterial& pm); void attach_pipe_line(PipeLine* pl); private: void* internal; PipeLine* pl; }; struct PL_Fork_Config { PL_Fork::ForkBy forkBy; PL_Fork::ForkSync forkSync; int mainPLType; int branchPLType; PL_Fork_Config() : forkBy(PL_Fork::FB_NONE), forkSync(PL_Fork::FS_NONE), mainPLType(0), branchPLType(0) { } }; PipeLineElem* create_PL_Fork(); #endif