Salome HOME
SMH: 3.0.0 preparation = merged version (POLYWORK + RTVDEBUG01) + adopation for new GUI
[modules/superv.git] / src / GraphBase / DataFlowBase_StreamNode.cxx
index c31485ea7451092a7877bc0b8f2169bcdd3cbfd7..fb0a7a150fb0bbc85b44462528c48069f2c92bc7 100644 (file)
@@ -18,13 +18,14 @@ GraphBase::StreamNode::StreamNode() :
   _Name = NULL ;
   _Kind = SUPERV::UnknownNode ;
   _LinkedNodesSize = 0 ;
+  _LinkedFromNodesSize = 0 ;
   _LinkedStreamNodesSize = 0 ;
   _HeadNode = false ;
   _LevelNumber = -1 ;
   _SortedIndex = -1 ;
   _GraphEditor = NULL ;
-  _GraphExecutor = NULL ;
   _GraphMacroNode =  SUPERV::Graph::_nil() ;
+  _GraphOfNode = NULL ;
   _GraphMacroLevel = 0 ;
   _SubGraphNumber = 0 ;
   _SubStreamGraphNumber = 0 ;
@@ -45,13 +46,14 @@ GraphBase::StreamNode::StreamNode( const char * NodeName ,
   }
   Kind( DataFlowkind ) ;
   _LinkedNodesSize = 0 ;
+  _LinkedFromNodesSize = 0 ;
   _LinkedStreamNodesSize = 0 ;
   _HeadNode = false ;
   _LevelNumber = -1 ;
   _SortedIndex = -1 ;
   _GraphEditor = NULL ;
-  _GraphExecutor = NULL ;
   _GraphMacroNode =  SUPERV::Graph::_nil() ;
+  _GraphOfNode = NULL ;
   _GraphMacroLevel = 0 ;
   _SubGraphNumber = 0 ;
   _SubStreamGraphNumber = 0 ;
@@ -136,12 +138,63 @@ void GraphBase::StreamNode::AddLinkedNode( GraphBase::StreamNode * ToNode ) {
   cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
          << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
          << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
+
+  index = ToNode->GetLinkedFromNodeIndex( Name() ) ;
+  if ( index < 0 ) {
+    cdebug << ToNode->Name() << "<-GraphBase::StreamNode::AddLinkedFromNode( " << Name()
+           << " ) new LinkedFromNode " << endl ;
+    ToNode->_LinkedFromNodes.resize( ToNode->_LinkedFromNodesSize+1 ) ;
+    ToNode->_LinkedFromInPortsNumber.resize( ToNode->_LinkedFromNodesSize+1 ) ;
+    ToNode->_LinkedFromNodes[ ToNode->_LinkedFromNodesSize ] = this ;
+    ToNode->_LinkedFromInPortsNumber[ ToNode->_LinkedFromNodesSize ] = 1 ;
+    ToNode->SetLinkedFromNodeIndex( Name() , ToNode->_LinkedFromNodesSize ) ;
+    index = ToNode->_LinkedFromNodesSize ;
+    ToNode->_LinkedFromNodesSize++ ;
+  }
+  else {
+    cdebug << Name() << "->GraphBase::StreamNode::AddLinkedFromNode( " << ToNode->Name()
+           << " ) old LinkedFromNode " << ToNode->_LinkedFromNodes[index ]->Name() << endl ;
+    ToNode->_LinkedFromInPortsNumber[ index ] += 1 ;
+  }
+  cdebug << ToNode->Name() << "->GraphBase::StreamNode::AddLinkedFromNode( " << Name()
+         << " ) LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << " [ " << index
+         << " ] _LinkedFromInPortsNumber " << ToNode->_LinkedFromInPortsNumber[ index ] << endl ;
 }
 
-bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ) {
-  int index = GetLinkedNodeIndex( ToNode->Name() ) ;
+bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ,
+                                              bool DoLinkedFromNode ) {
+  cdebug_in << "StreamNode::RemoveLinkedNode between " << Name() << " LinkedNodesSize "
+            << LinkedNodesSize() << " and " << ToNode->Name() << " LinkedFromNodesSize "
+            << ToNode->LinkedFromNodesSize() << endl ;
+#if 1
+  map< string , int >::iterator aMapOfLinkedNodesIterator ;
+  int i = 0 ;
+  for ( aMapOfLinkedNodesIterator = _MapOfLinkedNodes.begin() ;
+        aMapOfLinkedNodesIterator != _MapOfLinkedNodes.end() && i < _LinkedNodesSize ;
+        aMapOfLinkedNodesIterator++ ) {
+    cdebug << "_MapOfLinkedNodes" << i++ << " of " << Name() << " : "
+           << aMapOfLinkedNodesIterator->first << " --> " << aMapOfLinkedNodesIterator->second
+           << endl ;
+  }
+#endif
+#if 1
+  map< string , int >::iterator aMapOfLinkedFromNodesIterator ;
+  int ifrom = 0 ;
+  for ( aMapOfLinkedFromNodesIterator = ToNode->_MapOfLinkedFromNodes.begin() ;
+        aMapOfLinkedFromNodesIterator != ToNode->_MapOfLinkedFromNodes.end() &&
+        ifrom < ToNode->_LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator++ ) {
+    cdebug << "_MapOfLinkedFromNodes" << ifrom++ << " of " << ToNode->Name() << " : "
+           << aMapOfLinkedFromNodesIterator->first << " --> "
+           << aMapOfLinkedFromNodesIterator->second << endl ;
+  }
+#endif
+
+  int index = -1 ;
+  if ( _LinkedNodesSize ) {
+    index = GetLinkedNodeIndex( ToNode->Name() ) ;
+  }
   if ( index >= 0 ) {
-    cdebug << "GraphBase::StreamNode::RemoveLinkedNode( to " << ToNode->Name() << " from "
+    cdebug << "GraphBase::StreamNode::RemoveLinkedNode to " << ToNode->Name() << " from "
            << Name() << " index : " << index << " LinkedInPortsNumber "
            << _LinkedInPortsNumber[ index ] << " - 1" << endl ;
     _LinkedInPortsNumber[ index ] -= 1 ;
@@ -162,32 +215,149 @@ bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ) {
     }
   }
   else {
-    cdebug << "StreamNode::RemoveLinkedNode index Error " << Name() << " --> " << ToNode->Name() << " : " << index
-           << " _LinkedNodesSize " << _LinkedNodesSize << endl ;
+    cdebug << "StreamNode::RemoveLinkedNode index Error " << ToNode->Name() << " <-- " << Name() << " : " << index
+           << " _LinkedNodesSize " << ToNode->_LinkedNodesSize << endl ;
+  }
+  int fromindex = 0 ;
+  fromindex = -1 ;
+  if ( ToNode->_LinkedFromNodesSize ) {
+    fromindex = ToNode->GetLinkedFromNodeIndex( Name() ) ;
+  }
+  if ( fromindex >= 0 ) {
+    cdebug << "GraphBase::StreamNode::RemoveLinkedFromNode from " << ToNode->Name() << " to "
+           << Name() << " index : " << fromindex << " LinkedFromInPortsNumber "
+           << ToNode->_LinkedFromInPortsNumber[ fromindex ] << " - 1" << endl ;
+    ToNode->_LinkedFromInPortsNumber[ fromindex ] -= 1 ;
+    if ( ToNode->_LinkedFromInPortsNumber[ fromindex ] == 0 ) {
+      ToNode->_LinkedFromNodesSize-- ;
+      cdebug << "GraphBase::StreamNode::RemoveLinkedFromNode new LinkedFromNodesSize "
+             << ToNode->_LinkedFromNodesSize << " " << Name() << " removed from "
+             << " linkedFromnodes of " << ToNode->Name() << endl ;
+      int i ;
+      for ( i = 0 ; i < ToNode->_LinkedFromNodesSize ; i++ ) {
+        if ( i >= fromindex ) {
+          ToNode->_LinkedFromNodes[ i ] = ToNode->_LinkedFromNodes[ i+1 ] ;
+          ToNode->_LinkedFromInPortsNumber[ i ] =  ToNode->_LinkedFromInPortsNumber[ i+1 ] ;
+          ToNode->SetLinkedFromNodeIndex( ToNode->_LinkedFromNodes[ i ]->Name() , i ) ;
+       }
+        cdebug << "StreamNode::RemoveLinkedFromNode" << i << " "
+               << ToNode->_LinkedFromNodes[ i ]->Name() << endl ;
+      }
+      ToNode->DelLinkedFromNodeIndex( Name() ) ;
+      ToNode->_LinkedFromNodes.resize( ToNode->_LinkedFromNodesSize+1 ) ;
+      ToNode->_LinkedFromInPortsNumber.resize( ToNode->_LinkedFromNodesSize+1 ) ;
+    }
+  }
+  else if ( DoLinkedFromNode ) {
+    cdebug << "StreamNode::RemoveLinkedFromNode index Error " << ToNode->Name() << " --> "
+           << Name() << " : " << fromindex
+           << " _LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << endl ;
+  }
+  else {
+    cdebug << "StreamNode::RemoveLinkedFromNode index " << ToNode->Name() << " --> " << Name()
+           << " : " << fromindex
+           << " _LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << endl ;
+    fromindex = 0 ; // No error in EndSwitchNodes
+  }
+
 #if 1
-    map< string , int >::iterator aMapOfLinkedNodesIterator ;
-    int i = 0 ;
-    for ( aMapOfLinkedNodesIterator = _MapOfLinkedNodes.begin() ;
-          aMapOfLinkedNodesIterator != _MapOfLinkedNodes.end() ; aMapOfLinkedNodesIterator++ ) {
-      cdebug << "_MapOfLinkedNodes" << i++ << " " << aMapOfLinkedNodesIterator->first << " --> "
-             << aMapOfLinkedNodesIterator->second << endl ;
+  map< string , int >::iterator aMapOfLinkedNodesIterator1 ;
+  int ii = 0 ;
+  for ( aMapOfLinkedNodesIterator1 = _MapOfLinkedNodes.begin() ;
+        aMapOfLinkedNodesIterator1 != _MapOfLinkedNodes.end() && ii < _LinkedNodesSize ;
+        aMapOfLinkedNodesIterator1++ ) {
+    if ( aMapOfLinkedNodesIterator1->second ) {
+      cdebug << "_MapOfLinkedNodes" << ii++ << " of " << Name() << " : "
+             << aMapOfLinkedNodesIterator1->first << " --> " << aMapOfLinkedNodesIterator1->second
+             << " " << _LinkedNodes[ aMapOfLinkedNodesIterator1->second - 1 ]->Name() << endl ;
     }
+    else {
+      cdebug << "_MapOfLinkedNodes" << ii << " of " << Name() << " : "
+             << aMapOfLinkedNodesIterator1->second - 1 << endl ;
+    }
+  }
 #endif
+#if 1
+  map< string , int >::iterator aMapOfLinkedFromNodesIterator1 ;
+  int iifrom = 0 ;
+  for ( aMapOfLinkedFromNodesIterator1 = ToNode->_MapOfLinkedFromNodes.begin() ;
+        aMapOfLinkedFromNodesIterator1 != ToNode->_MapOfLinkedFromNodes.end() &&
+        iifrom < ToNode->_LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator1++ ) {
+    if ( aMapOfLinkedFromNodesIterator1->second ) {
+      cdebug << "_MapOfLinkedFromNodes" << iifrom++ << " of " << ToNode->Name() << " : "
+             << aMapOfLinkedFromNodesIterator1->first << " --> "
+             << aMapOfLinkedFromNodesIterator1->second << " "
+             << ToNode->_LinkedFromNodes[ aMapOfLinkedFromNodesIterator1->second - 1 ]->Name()
+             << endl ;
+    }
+    else {
+      cdebug << "_MapOfLinkedFromNodes" << iifrom << " of " << ToNode->Name() << " : "
+             << aMapOfLinkedFromNodesIterator1->second - 1 << endl ;
+    }
   }
-  return (index >= 0 ) ;
+#endif
+  cdebug_out << "StreamNode::RemoveLinkedNode between " << Name() << " and " << ToNode->Name()
+             << " " << (index >= 0) << " " << (fromindex >= 0) << endl ;
+  return (index >= 0 ) && (fromindex >= 0 ) ;
 }
 
 void GraphBase::StreamNode::ReNameLinkedNode( const char* OldNodeName ,
-                                           const char* NewNodeName ) {
-  cdebug_in << "GraphBase::StreamNode::ReNameLink (" << OldNodeName << " , "
-            << NewNodeName << ")" << endl;
+                                              const char* NewNodeName ) {
+  cdebug_in << Name() << "->GraphBase::StreamNode::ReNameLinkedNode (" << OldNodeName << " , "
+            << NewNodeName << ") _LinkedNodesSize " << _LinkedNodesSize << endl;
   int index = GetLinkedNodeIndex( OldNodeName ) ;
   if ( index >= 0 ) {
 //    _MapOfLinkedNodes.erase( OldNodeName ) ;
     DelLinkedNodeIndex( OldNodeName ) ;
     SetLinkedNodeIndex( NewNodeName , index ) ;
   }
-  cdebug_out << "GraphBase::StreamNode::ReNameLink" << endl ;
+  else {
+    cdebug << "GraphBase::StreamNode::ReNameLinkedNode ERROR " << OldNodeName << " not found in "
+           << Name() << endl ;
+  }
+#if 1
+  map< string , int >::iterator aMapOfLinkedNodesIterator1 ;
+  int ii = 0 ;
+  for ( aMapOfLinkedNodesIterator1 = _MapOfLinkedNodes.begin() ;
+        aMapOfLinkedNodesIterator1 != _MapOfLinkedNodes.end() && ii < _LinkedNodesSize ;
+        aMapOfLinkedNodesIterator1++ ) {
+    cdebug << "_MapOfLinkedNodes" << ii++ << " of " << Name() << " : "
+           << aMapOfLinkedNodesIterator1->first << " --> " << aMapOfLinkedNodesIterator1->second
+           << " " << _LinkedNodes[ aMapOfLinkedNodesIterator1->second - 1 ]->Name() << endl ;
+  }
+#endif
+  cdebug_out << Name() << "->GraphBase::StreamNode::ReNameLinkedNode" << endl ;
+}
+
+void GraphBase::StreamNode::ReNameLinkedFromNode( const char* OldNodeName ,
+                                                  const char* NewNodeName ) {
+  cdebug_in << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode (" << OldNodeName
+            << " , " << NewNodeName << ") _LinkedFromNodesSize " << _LinkedFromNodesSize
+            << endl;
+  int index = GetLinkedFromNodeIndex( OldNodeName ) ;
+  if ( index >= 0 ) {
+//    _MapOfLinkedFromNodes.erase( OldNodeName ) ;
+    DelLinkedFromNodeIndex( OldNodeName ) ;
+    SetLinkedFromNodeIndex( NewNodeName , index ) ;
+  }
+  else {
+    cdebug << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode ERROR " << OldNodeName
+           << " not found in " << Name() << endl ;
+  }
+#if 1
+  map< string , int >::iterator aMapOfLinkedFromNodesIterator1 ;
+  int iifrom = 0 ;
+  for ( aMapOfLinkedFromNodesIterator1 = _MapOfLinkedFromNodes.begin() ;
+        aMapOfLinkedFromNodesIterator1 != _MapOfLinkedFromNodes.end() &&
+        iifrom < _LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator1++ ) {
+    cdebug << "_MapOfLinkedFromNodes" << iifrom++ << " of " << Name() << " : "
+           << aMapOfLinkedFromNodesIterator1->first << " --> "
+           << aMapOfLinkedFromNodesIterator1->second << " "
+           << _LinkedFromNodes[ aMapOfLinkedFromNodesIterator1->second - 1 ]->Name()
+           << endl ;
+  }
+#endif
+  cdebug_out << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode" << endl ;
 }
 
 void GraphBase::StreamNode::AddStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
@@ -254,4 +424,3 @@ void GraphBase::StreamNode::ReNameStreamLinkedNode( const char* OldNodeName ,
   }
   cdebug_out << "GraphBase::StreamNode::ReNameStreamLinkedNode" << endl ;
 }
-