4 #include "StaticDefinedComposedNode.hxx"
5 #include "InputDataStreamPort.hxx"
6 #include "ElementaryNode.hxx"
7 #include "OutputPort.hxx"
8 #include "InputPort.hxx"
20 class InputPort4DF2DS : public InputPort
23 InputPort4DF2DS(DFToDSForLoop *node, TypeCode* type);
24 void getAllRepresentants(std::set<InPort *>& repr) const;
25 void put(const void *data) throw(ConversionException);
26 InputPort *clone(Node *newHelder) const;
27 void *get() const throw(Exception);
36 class DFToDSForLoop : public ElementaryNode
41 Loop *_loopArtificiallyBuiltMe;
43 DFToDSForLoop(Loop *loop, const std::string& name, TypeCode* type);
44 void loopHasOneMoreRef() { _nbOfTimeUsed++; }
45 bool loopHasOneLessRef() { return --_nbOfTimeUsed==0; }
46 void getReadyTasks(std::vector<Task *>& tasks);
47 InputPort *getInputPort(const std::string& name) const throw(Exception);
48 OutputDataStreamPort *getOutputDataStreamPort(const std::string& name) const throw(Exception);
49 Node *simpleClone(ComposedNode *father, bool editionOnly=true) const;
57 class OutputPort4DS2DF : public OutputPort
60 OutputPort4DS2DF(DSToDFForLoop *node, TypeCode *type);
61 void getAllRepresented(std::set<OutPort *>& represented) const;
62 void put(const void *data) throw(ConversionException);
63 OutputPort *clone(Node *newHelder) const;
70 class InputDataStreamPort4DS2DF : public InputDataStreamPort
73 InputDataStreamPort4DS2DF(DSToDFForLoop *node, TypeCode* type);
74 void getAllRepresentants(std::set<InPort *>& repr) const;
77 class DSToDFForLoop : public ElementaryNode
82 Loop *_loopArtificiallyBuiltMe;
84 DSToDFForLoop(Loop *loop, const std::string& name, TypeCode* type);
85 Node *simpleClone(ComposedNode *father, bool editionOnly=true) const;
86 void loopHasOneMoreRef() { _nbOfTimeUsed++; }
87 bool loopHasOneLessRef() { return --_nbOfTimeUsed==0; }
88 void getReadyTasks(std::vector<Task *>& tasks);
89 OutputPort *getOutputPort(const std::string& name) const throw(Exception);
90 InputDataStreamPort *getInputDataStreamPort(const std::string& name) const throw(Exception);
98 class FakeNodeForLoop : public ElementaryNode
100 friend class ForLoop;
101 friend class WhileLoop;
107 FakeNodeForLoop(Loop *loop, bool normalFinish, bool internalError=false);
108 FakeNodeForLoop(const FakeNodeForLoop& other);
109 Node *simpleClone(ComposedNode *father, bool editionOnly) const;
110 void exForwardFailed();
111 void exForwardFinished();
117 /*! \brief Base class for loop node
124 class Loop : public StaticDefinedComposedNode
126 friend class DSToDFForLoop;
127 friend class FakeNodeForLoop;
128 friend void NbDoneLoader(Loop* node, int val);
132 FakeNodeForLoop *_nodeForNullTurnOfLoops;
133 std::set<DSToDFForLoop *> _inputsTraducer;
134 std::set<DFToDSForLoop *> _outputsTraducer;
136 Loop(const Loop& other, ComposedNode *father, bool editionOnly);
137 Loop(const std::string& name);
139 void init(bool start=true);
140 int getNbOfTurns() const { return _nbOfTurns; }
141 Node *edSetNode(Node *node);
142 Node *edRemoveNode();
143 void getReadyTasks(std::vector<Task *>& tasks);
144 void edRemoveChild(Node *node) throw(Exception);
145 bool isRepeatedUnpredictablySeveralTimes() const { return true; }
146 void selectRunnableTasks(std::vector<Task *>& tasks);
147 std::set<Node *> edGetDirectDescendants() const;
148 void checkConsistency(ComposedNode *pointOfView) const throw(Exception);
149 Node *getChildByShortName(const std::string& name) const throw(Exception);
150 static TypeCode* MappingDF2DS(TypeCode* type) throw(Exception);
151 static TypeCode* MappingDS2DF(TypeCode* type) throw(Exception);
152 virtual bool edAddDFLink(OutPort *start, InPort *end) throw(Exception);
153 void writeDot(std::ostream &os);
154 virtual void accept(Visitor *visitor);
156 void buildDelegateOf(InPort * & port, OutPort *initialStart, const std::set<ComposedNode *>& pointsOfView);
157 void buildDelegateOf(std::pair<OutPort *, OutPort *>& port, InPort *finalTarget, const std::set<ComposedNode *>& pointsOfView);
158 void getDelegateOf(InPort * & port, OutPort *initialStart, const std::set<ComposedNode *>& pointsOfView) throw(Exception);
159 void getDelegateOf(std::pair<OutPort *, OutPort *>& port, InPort *finalTarget, const std::set<ComposedNode *>& pointsOfView) throw(Exception);
160 void releaseDelegateOf(InPort * & port, OutPort *initialStart, const std::set<ComposedNode *>& pointsOfView) throw(Exception);
161 void releaseDelegateOf(OutPort *portDwn, OutPort *portUp, InPort *finalTarget, const std::set<ComposedNode *>& pointsOfView) throw(Exception);
162 void checkNoCyclePassingThrough(Node *node) throw(Exception);
163 static bool isNecessaryToBuildSpecificDelegateDF2DS(const std::set<ComposedNode *>& pointsOfView);
166 void NbDoneLoader(Loop* node, int val);