]> SALOME platform Git repositories - modules/yacs.git/blobdiff - src/engine/ElementaryNode.cxx
Salome HOME
PR: merge from BR_DATACONV_PR tag "mergeto_trunk_25oct06"
[modules/yacs.git] / src / engine / ElementaryNode.cxx
index b1913d906de0c447e11b372c9b4d1a338d219781..ea7a84115c578e2d044014c6c81cb7ea8a57a4d0 100644 (file)
@@ -1,4 +1,5 @@
 #include "ElementaryNode.hxx"
+#include "Runtime.hxx"
 #include "InputPort.hxx"
 #include "OutputPort.hxx"
 #include "ComposedNode.hxx"
 #include "OutputDataStreamPort.hxx"
 
 using namespace YACS::ENGINE;
+using namespace std;
 
-ElementaryNode::ElementaryNode(const std::string& name):Node(name)
+ElementaryNode::ElementaryNode(const string& name):Node(name)
 {
 }
 
 ElementaryNode::~ElementaryNode()
 {
-  for(std::list<InputPort *>::iterator iter1=_listOfInputPort.begin();iter1!=_listOfInputPort.end();iter1++)
+  for(set<InputPort *>::iterator iter1=_setOfInputPort.begin();iter1!=_setOfInputPort.end();iter1++)
     delete *iter1;
-  for(std::list<OutputPort *>::iterator iter2=_listOfOutputPort.begin();iter2!=_listOfOutputPort.end();iter2++)
+  for(set<OutputPort *>::iterator iter2=_setOfOutputPort.begin();iter2!=_setOfOutputPort.end();iter2++)
     delete *iter2;
-  for(std::list<InputDataStreamPort *>::iterator iter3=_listOfInputDataStreamPort.begin();iter3!=_listOfInputDataStreamPort.end();iter3++)
+  for(set<InputDataStreamPort *>::iterator iter3=_setOfInputDataStreamPort.begin();iter3!=_setOfInputDataStreamPort.end();iter3++)
     delete *iter3;
-  for(std::list<OutputDataStreamPort *>::iterator iter4=_listOfOutputDataStreamPort.begin();iter4!=_listOfOutputDataStreamPort.end();iter4++)
+  for(set<OutputDataStreamPort *>::iterator iter4=_setOfOutputDataStreamPort.begin();iter4!=_setOfOutputDataStreamPort.end();iter4++)
     delete *iter4;
 }
 
-void ElementaryNode::getReadyTasks(std::vector<Task *>& tasks)
+/**
+ * add this node task to a given set of ready tasks, if this task is ready to activate
+ */
+
+void ElementaryNode::getReadyTasks(vector<Task *>& tasks)
 {
   if(_state==YACS::TOACTIVATE)
     tasks.push_back(this);
 }
 
+/**
+ * remove port from node at edition. Ports are typed.
+ */
+
 void ElementaryNode::edRemovePort(Port *port) throw(Exception)
 {
   if(port->getNode()!=this)
-    throw Exception("ElementaryNode::edRemovePort : Port is not ownered by this");
-  std::string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
+    throw Exception("ElementaryNode::edRemovePort : Port is not owned by this");
+  string typeOfPortInstance=port->getNameOfTypeOfCurrentInstance();
   if(typeOfPortInstance==InputPort::NAME)
-    edRemovePortTypedFromList<InputPort>(dynamic_cast<InputPort *>(port),_listOfInputPort);
+    edRemovePortTypedFromSet<InputPort>(dynamic_cast<InputPort *>(port),_setOfInputPort);
   else if(typeOfPortInstance==OutputPort::NAME)
-    edRemovePortTypedFromList<OutputPort>(dynamic_cast<OutputPort *>(port),_listOfOutputPort);
+    edRemovePortTypedFromSet<OutputPort>(dynamic_cast<OutputPort *>(port),_setOfOutputPort);
   else if(typeOfPortInstance==InputDataStreamPort::NAME)
-    edRemovePortTypedFromList<InputDataStreamPort>(dynamic_cast<InputDataStreamPort *>(port),_listOfInputDataStreamPort);
+    edRemovePortTypedFromSet<InputDataStreamPort>(dynamic_cast<InputDataStreamPort *>(port),_setOfInputDataStreamPort);
   else if(typeOfPortInstance==OutputDataStreamPort::NAME)
-    edRemovePortTypedFromList<OutputDataStreamPort>(dynamic_cast<OutputDataStreamPort *>(port),_listOfOutputDataStreamPort);
+    edRemovePortTypedFromSet<OutputDataStreamPort>(dynamic_cast<OutputDataStreamPort *>(port),_setOfOutputDataStreamPort);
   else
     throw Exception("ElementaryNode::edRemovePort : unknown port type");
   delete port;
 }
 
-std::list<ElementaryNode *> ElementaryNode::getRecursiveConstituents()
+/**
+ * @return a set with only this node. (Same method in composed nodes)
+ */
+
+set<ElementaryNode *> ElementaryNode::getRecursiveConstituents()
 {
-  std::list<ElementaryNode *> ret;
-  ret.push_back(this);
+  set<ElementaryNode *> ret;
+  ret.insert(this);
   return ret;
 }
 
-InputPort *ElementaryNode::edAddInputPort(const std::string& inputPortName, YACS::DynType type) throw(Exception)
+/**
+ * the input port is also published recursively in ancestors because it may be visible from everywhere.
+ * WARNING: CHECK CASE OF BLOC: ONLY INPUT PORTS NOT INTERNALLY CONNECTED MUST BE VISIBLE.
+ */
+
+InputPort *ElementaryNode::edAddInputPort(const string& inputPortName, TypeCode* type) throw(Exception)
 {
-  InputPort *ret=edAddPort<InputPort,YACS::DynType>(inputPortName,_listOfInputPort,type);
-  //By default all inputports are seen from upper level nodes NOT outputports
-  ComposedNode *iter=_father;
-  while(iter)
+  InputPort *ret = 0;
+  if (edCheckAddPort<InputPort, TypeCode*>(inputPortName,_setOfInputPort,type))
     {
-      iter->publishInputPort(_listOfInputPort.back());
-      iter=iter->_father;
+      //InputPort *ret=edAddPort<InputPort, TypeCode*>(inputPortName,_setOfInputPort,type);
+      ret = getRuntime()->createInputPort(inputPortName, _implementation, this, type);
+      _setOfInputPort.insert(ret);
+      //By default all inputports are seen from upper level nodes NOT outputports
+      ComposedNode *iter=_father;
+      while(iter)
+       {
+         iter->publishInputPort(ret);
+         iter=iter->_father;
+       }
     }
   return ret;
 }
 
-OutputPort *ElementaryNode::edAddOutputPort(const std::string& outputPortName, YACS::DynType type) throw(Exception)
+/**
+ * The output port is not published in father. Father must create an output port.
+ */ 
+
+OutputPort *ElementaryNode::edAddOutputPort(const string& outputPortName, TypeCode* type) throw(Exception)
 {
-  return edAddPort<OutputPort,YACS::DynType>(outputPortName,_listOfOutputPort,type);
+  OutputPort *ret =0;
+  if (edCheckAddPort<OutputPort, TypeCode*>(outputPortName,_setOfOutputPort,type))
+    {
+      ret = getRuntime()->createOutputPort(outputPortName, _implementation, this, type);
+      _setOfOutputPort.insert(ret);
+    }
+  return ret;
 }
 
-InputDataStreamPort *ElementaryNode::edAddInputDataStreamPort(const std::string& inputPortDSName, YACS::StreamType type) throw(Exception)
+InputDataStreamPort *ElementaryNode::edAddInputDataStreamPort(const string& inputPortDSName, TypeCode* type) throw(Exception)
 {
-  return edAddPort<InputDataStreamPort,YACS::StreamType>(inputPortDSName,_listOfInputDataStreamPort,type);
+  return edAddPort<InputDataStreamPort,TypeCode*>(inputPortDSName,_setOfInputDataStreamPort,type);
 }
 
-OutputDataStreamPort *ElementaryNode::edAddOutputDataStreamPort(const std::string& outputPortDSName, YACS::StreamType type) throw(Exception)
+OutputDataStreamPort *ElementaryNode::edAddOutputDataStreamPort(const string& outputPortDSName, TypeCode* type) throw(Exception)
 {
-  return edAddPort<OutputDataStreamPort,YACS::StreamType>(outputPortDSName,_listOfOutputDataStreamPort,type);
+  return edAddPort<OutputDataStreamPort,TypeCode*>(outputPortDSName,_setOfOutputDataStreamPort,type);
 }
 
+/**
+ * Disconnect all links from output ports of this node to input ports of a given node
+ */
+
 void ElementaryNode::disconnectAllLinksConnectedTo(Node *node)
 {
-  std::list<InputPort *> inputDF=node->getListOfInputPort();
-  for(std::list<OutputPort *>::iterator iter1=_listOfOutputPort.begin();iter1!=_listOfOutputPort.end();iter1++)
-    for(std::list<InputPort *>::iterator iter2=inputDF.begin();iter2!=inputDF.end();iter2++)
-      (*iter1)->edRemoveInputPort(*iter2);
-  std::list<InputDataStreamPort *> inputDS=node->getListOfInputDataStreamPort();
-  for(std::list<OutputDataStreamPort *>::iterator iter3=_listOfOutputDataStreamPort.begin();iter3!=_listOfOutputDataStreamPort.end();iter3++)
-    for(std::list<InputDataStreamPort *>::iterator iter4=inputDS.begin();iter4!=inputDS.end();iter4++)
-      (*iter3)->edRemoveInputDataStreamPort(*iter4);
+  set<InputPort *> inputDF=node->getSetOfInputPort();
+  for(set<OutputPort *>::iterator iter1=_setOfOutputPort.begin();iter1!=_setOfOutputPort.end();iter1++)
+    for(set<InputPort *>::iterator iter2=inputDF.begin();iter2!=inputDF.end();iter2++)
+      (*iter1)->edRemoveInputPortOneWay(*iter2);
+  set<InputDataStreamPort *> inputDS=node->getSetOfInputDataStreamPort();
+  for(set<OutputDataStreamPort *>::iterator iter3=_setOfOutputDataStreamPort.begin();iter3!=_setOfOutputDataStreamPort.end();iter3++)
+    for(set<InputDataStreamPort *>::iterator iter4=inputDS.begin();iter4!=inputDS.end();iter4++)
+      (*iter3)->edRemoveInputDataStreamPortOneWay(*iter4);
+  _outGate.edRemoveInGateOneWay(node->getInGate());
+}
+
+/**
+ * get the input port name used by the current node (see composed nodes)
+ */
+
+const string ElementaryNode::getInputPortName(const InputPort * inputPort) throw (Exception)
+{
+  Node *node = inputPort->getNode();
+  if ( node != this ) 
+    {
+      string what("InputPort "); what += inputPort->getName(); what += " does not belong to node "; what += node->getName();
+      throw Exception(what);
+    }
+  return inputPort->getName();
+}
+
+const string ElementaryNode::getOutputPortName(const OutputPort *outputPort) throw (Exception)
+{
 }
 
 void ElementaryNode::begin()