1 // SUPERV GraphBase : contains fondamental classes for Services, Input Ports, Output Ports Links and Nodes.
3 // Copyright (C) 2003 CEA/DEN, EDF R&D
7 // File : DataFlowBase_StreamNode.cxx
8 // Author : Jean Rahuel
14 #include "DataFlowBase_StreamNode.hxx"
16 GraphBase::StreamNode::StreamNode() :
17 GraphBase::PortsOfNode::PortsOfNode() {
19 _Kind = SUPERV::UnknownNode ;
20 _LinkedNodesSize = 0 ;
21 _LinkedFromNodesSize = 0 ;
22 _LinkedStreamNodesSize = 0 ;
27 _GraphMacroNode = SUPERV::Graph::_nil() ;
29 _GraphMacroLevel = 0 ;
31 _SubStreamGraphNumber = 0 ;
32 cdebug << "GraphBase::StreamNode::StreamNode " << this << " " << endl ;
35 GraphBase::StreamNode::StreamNode( const char * NodeName ,
36 const SUPERV::KindOfNode DataFlowkind ,
37 int * Graph_prof_debug ,
38 ofstream * Graph_fdebug ) :
39 GraphBase::PortsOfNode::PortsOfNode( NodeName ) {
40 if ( NodeName != NULLSTRING && strlen( NodeName ) ) {
41 _Name = new char[ strlen( NodeName )+1 ] ;
42 strcpy( _Name , NodeName ) ;
47 Kind( DataFlowkind ) ;
48 _LinkedNodesSize = 0 ;
49 _LinkedFromNodesSize = 0 ;
50 _LinkedStreamNodesSize = 0 ;
55 _GraphMacroNode = SUPERV::Graph::_nil() ;
57 _GraphMacroLevel = 0 ;
59 _SubStreamGraphNumber = 0 ;
60 cdebug << "GraphBase::StreamNode::StreamNode " << NodeName << " "
61 << this << " " << endl ;
64 GraphBase::StreamNode::~StreamNode() {
65 cdebug << "GraphBase::StreamNode::~StreamNode " << this << endl ;
68 bool GraphBase::StreamNode::Name( const char * aName) {
69 cdebug_in << "GraphBase::StreamNode::Name " << _Name << endl;
71 cdebug << "GraphBase::StreamNode::ReName " << _Name << " --> " << aName << endl ;
74 _Name = new char[strlen(aName)+1] ;
75 strcpy( _Name , aName ) ;
76 cdebug_out << "GraphBase::StreamNode::Name " << _Name << endl;
80 void GraphBase::StreamNode::SetSubStreamGraph( int SubStreamGraphsNumber , int & RetVal ) {
82 cdebug_in << Name() << " GraphBase::StreamNode::SetSubStreamGraph Level "<< Level() << " SortedIndex "
83 << SortedIndex() << " SubStreamGraphsNumber " << SubStreamGraphsNumber << " RetVal " << RetVal
85 if ( SubStreamGraph() == 0 || SubStreamGraph() == SubStreamGraphsNumber ) {
86 SubStreamGraph( SubStreamGraphsNumber ) ;
87 cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " SetSubStreamGraph LinkedStreamNodesSize "
88 << LinkedStreamNodesSize() << endl ;
89 for ( jnode = 0 ; jnode < LinkedStreamNodesSize() ; jnode++ ) {
90 if ( LinkedStreamNodes( jnode )->Level() > Level() ||
91 ( LinkedStreamNodes( jnode )->Level() == Level() &&
92 LinkedStreamNodes( jnode )->SortedIndex() > SortedIndex() ) ) {
93 LinkedStreamNodes( jnode )->SetSubStreamGraph( SubStreamGraphsNumber , RetVal ) ;
94 if ( RetVal != SubStreamGraphsNumber ) {
98 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() == 0 ) {
99 LinkedStreamNodes( jnode )->SubStreamGraph( SubStreamGraphsNumber ) ;
100 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
101 << LinkedStreamNodes( jnode )->SubStreamGraph() << endl ;
103 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() != SubStreamGraphsNumber ) {
104 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
105 << LinkedStreamNodes( jnode )->SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
106 RetVal = LinkedStreamNodes( jnode )->SubStreamGraph() ;
112 cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
113 RetVal = SubStreamGraph() ;
116 cdebug_out << Name() << "->GraphBase::StreamNode::SetSubStreamGraph RetVal " << RetVal << endl ;
120 void GraphBase::StreamNode::AddLinkedNode( GraphBase::StreamNode * ToNode ) {
121 int index = GetLinkedNodeIndex( ToNode->Name() ) ;
123 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
124 << " ) new LinkedNode " << endl ;
125 _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
126 _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
127 _LinkedNodes[ _LinkedNodesSize ] = ToNode ;
128 _LinkedInPortsNumber[ _LinkedNodesSize ] = 1 ;
129 SetLinkedNodeIndex( ToNode->Name() , _LinkedNodesSize ) ;
130 index = _LinkedNodesSize ;
134 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
135 << " ) old LinkedNode " << _LinkedNodes[index ]->Name() << endl ;
136 _LinkedInPortsNumber[ index ] += 1 ;
138 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
139 << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
140 << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
142 index = ToNode->GetLinkedFromNodeIndex( Name() ) ;
144 cdebug << ToNode->Name() << "<-GraphBase::StreamNode::AddLinkedFromNode( " << Name()
145 << " ) new LinkedFromNode " << endl ;
146 ToNode->_LinkedFromNodes.resize( ToNode->_LinkedFromNodesSize+1 ) ;
147 ToNode->_LinkedFromInPortsNumber.resize( ToNode->_LinkedFromNodesSize+1 ) ;
148 ToNode->_LinkedFromNodes[ ToNode->_LinkedFromNodesSize ] = this ;
149 ToNode->_LinkedFromInPortsNumber[ ToNode->_LinkedFromNodesSize ] = 1 ;
150 ToNode->SetLinkedFromNodeIndex( Name() , ToNode->_LinkedFromNodesSize ) ;
151 index = ToNode->_LinkedFromNodesSize ;
152 ToNode->_LinkedFromNodesSize++ ;
155 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedFromNode( " << ToNode->Name()
156 << " ) old LinkedFromNode " << ToNode->_LinkedFromNodes[index ]->Name() << endl ;
157 ToNode->_LinkedFromInPortsNumber[ index ] += 1 ;
159 cdebug << ToNode->Name() << "->GraphBase::StreamNode::AddLinkedFromNode( " << Name()
160 << " ) LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << " [ " << index
161 << " ] _LinkedFromInPortsNumber " << ToNode->_LinkedFromInPortsNumber[ index ] << endl ;
164 bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ,
165 bool DoLinkedFromNode ) {
166 cdebug_in << "StreamNode::RemoveLinkedNode between " << Name() << " LinkedNodesSize "
167 << LinkedNodesSize() << " and " << ToNode->Name() << " LinkedFromNodesSize "
168 << ToNode->LinkedFromNodesSize() << endl ;
170 map< string , int >::iterator aMapOfLinkedNodesIterator ;
172 for ( aMapOfLinkedNodesIterator = _MapOfLinkedNodes.begin() ;
173 aMapOfLinkedNodesIterator != _MapOfLinkedNodes.end() && i < _LinkedNodesSize ;
174 aMapOfLinkedNodesIterator++ ) {
175 cdebug << "_MapOfLinkedNodes" << i++ << " of " << Name() << " : "
176 << aMapOfLinkedNodesIterator->first << " --> " << aMapOfLinkedNodesIterator->second
181 map< string , int >::iterator aMapOfLinkedFromNodesIterator ;
183 for ( aMapOfLinkedFromNodesIterator = ToNode->_MapOfLinkedFromNodes.begin() ;
184 aMapOfLinkedFromNodesIterator != ToNode->_MapOfLinkedFromNodes.end() &&
185 ifrom < ToNode->_LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator++ ) {
186 cdebug << "_MapOfLinkedFromNodes" << ifrom++ << " of " << ToNode->Name() << " : "
187 << aMapOfLinkedFromNodesIterator->first << " --> "
188 << aMapOfLinkedFromNodesIterator->second << endl ;
193 if ( _LinkedNodesSize ) {
194 index = GetLinkedNodeIndex( ToNode->Name() ) ;
197 cdebug << "GraphBase::StreamNode::RemoveLinkedNode to " << ToNode->Name() << " from "
198 << Name() << " index : " << index << " LinkedInPortsNumber "
199 << _LinkedInPortsNumber[ index ] << " - 1" << endl ;
200 _LinkedInPortsNumber[ index ] -= 1 ;
201 if ( _LinkedInPortsNumber[ index ] == 0 ) {
203 cdebug << "GraphBase::StreamNode::RemoveLinkedNode new LinkedNodesSize "
204 << _LinkedNodesSize << " " << ToNode->Name() << " removed from "
205 << " linkednodes of " << Name() << endl ;
207 for ( i = index ; i < _LinkedNodesSize ; i++ ) {
208 _LinkedNodes[ i ] = _LinkedNodes[ i+1 ] ;
209 _LinkedInPortsNumber[ i ] = _LinkedInPortsNumber[ i+1 ] ;
210 SetLinkedNodeIndex( _LinkedNodes[ i ]->Name() , i ) ;
212 DelLinkedNodeIndex( ToNode->Name() ) ;
213 _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
214 _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
218 cdebug << "StreamNode::RemoveLinkedNode index Error " << ToNode->Name() << " <-- " << Name() << " : " << index
219 << " _LinkedNodesSize " << ToNode->_LinkedNodesSize << endl ;
223 if ( ToNode->_LinkedFromNodesSize ) {
224 fromindex = ToNode->GetLinkedFromNodeIndex( Name() ) ;
226 if ( fromindex >= 0 ) {
227 cdebug << "GraphBase::StreamNode::RemoveLinkedFromNode from " << ToNode->Name() << " to "
228 << Name() << " index : " << fromindex << " LinkedFromInPortsNumber "
229 << ToNode->_LinkedFromInPortsNumber[ fromindex ] << " - 1" << endl ;
230 ToNode->_LinkedFromInPortsNumber[ fromindex ] -= 1 ;
231 if ( ToNode->_LinkedFromInPortsNumber[ fromindex ] == 0 ) {
232 ToNode->_LinkedFromNodesSize-- ;
233 cdebug << "GraphBase::StreamNode::RemoveLinkedFromNode new LinkedFromNodesSize "
234 << ToNode->_LinkedFromNodesSize << " " << Name() << " removed from "
235 << " linkedFromnodes of " << ToNode->Name() << endl ;
237 for ( i = 0 ; i < ToNode->_LinkedFromNodesSize ; i++ ) {
238 if ( i >= fromindex ) {
239 ToNode->_LinkedFromNodes[ i ] = ToNode->_LinkedFromNodes[ i+1 ] ;
240 ToNode->_LinkedFromInPortsNumber[ i ] = ToNode->_LinkedFromInPortsNumber[ i+1 ] ;
241 ToNode->SetLinkedFromNodeIndex( ToNode->_LinkedFromNodes[ i ]->Name() , i ) ;
243 cdebug << "StreamNode::RemoveLinkedFromNode" << i << " "
244 << ToNode->_LinkedFromNodes[ i ]->Name() << endl ;
246 ToNode->DelLinkedFromNodeIndex( Name() ) ;
247 ToNode->_LinkedFromNodes.resize( ToNode->_LinkedFromNodesSize+1 ) ;
248 ToNode->_LinkedFromInPortsNumber.resize( ToNode->_LinkedFromNodesSize+1 ) ;
251 else if ( DoLinkedFromNode ) {
252 cdebug << "StreamNode::RemoveLinkedFromNode index Error " << ToNode->Name() << " --> "
253 << Name() << " : " << fromindex
254 << " _LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << endl ;
257 cdebug << "StreamNode::RemoveLinkedFromNode index " << ToNode->Name() << " --> " << Name()
258 << " : " << fromindex
259 << " _LinkedFromNodesSize " << ToNode->_LinkedFromNodesSize << endl ;
260 fromindex = 0 ; // No error in EndSwitchNodes
264 map< string , int >::iterator aMapOfLinkedNodesIterator1 ;
266 for ( aMapOfLinkedNodesIterator1 = _MapOfLinkedNodes.begin() ;
267 aMapOfLinkedNodesIterator1 != _MapOfLinkedNodes.end() && ii < _LinkedNodesSize ;
268 aMapOfLinkedNodesIterator1++ ) {
269 if ( aMapOfLinkedNodesIterator1->second ) {
270 cdebug << "_MapOfLinkedNodes" << ii++ << " of " << Name() << " : "
271 << aMapOfLinkedNodesIterator1->first << " --> " << aMapOfLinkedNodesIterator1->second
272 << " " << _LinkedNodes[ aMapOfLinkedNodesIterator1->second - 1 ]->Name() << endl ;
275 cdebug << "_MapOfLinkedNodes" << ii << " of " << Name() << " : "
276 << aMapOfLinkedNodesIterator1->second - 1 << endl ;
281 map< string , int >::iterator aMapOfLinkedFromNodesIterator1 ;
283 for ( aMapOfLinkedFromNodesIterator1 = ToNode->_MapOfLinkedFromNodes.begin() ;
284 aMapOfLinkedFromNodesIterator1 != ToNode->_MapOfLinkedFromNodes.end() &&
285 iifrom < ToNode->_LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator1++ ) {
286 if ( aMapOfLinkedFromNodesIterator1->second ) {
287 cdebug << "_MapOfLinkedFromNodes" << iifrom++ << " of " << ToNode->Name() << " : "
288 << aMapOfLinkedFromNodesIterator1->first << " --> "
289 << aMapOfLinkedFromNodesIterator1->second << " "
290 << ToNode->_LinkedFromNodes[ aMapOfLinkedFromNodesIterator1->second - 1 ]->Name()
294 cdebug << "_MapOfLinkedFromNodes" << iifrom << " of " << ToNode->Name() << " : "
295 << aMapOfLinkedFromNodesIterator1->second - 1 << endl ;
299 cdebug_out << "StreamNode::RemoveLinkedNode between " << Name() << " and " << ToNode->Name()
300 << " " << (index >= 0) << " " << (fromindex >= 0) << endl ;
301 return (index >= 0 ) && (fromindex >= 0 ) ;
304 void GraphBase::StreamNode::ReNameLinkedNode( const char* OldNodeName ,
305 const char* NewNodeName ) {
306 cdebug_in << Name() << "->GraphBase::StreamNode::ReNameLinkedNode (" << OldNodeName << " , "
307 << NewNodeName << ") _LinkedNodesSize " << _LinkedNodesSize << endl;
308 int index = GetLinkedNodeIndex( OldNodeName ) ;
310 // _MapOfLinkedNodes.erase( OldNodeName ) ;
311 DelLinkedNodeIndex( OldNodeName ) ;
312 SetLinkedNodeIndex( NewNodeName , index ) ;
315 cdebug << "GraphBase::StreamNode::ReNameLinkedNode ERROR " << OldNodeName << " not found in "
319 map< string , int >::iterator aMapOfLinkedNodesIterator1 ;
321 for ( aMapOfLinkedNodesIterator1 = _MapOfLinkedNodes.begin() ;
322 aMapOfLinkedNodesIterator1 != _MapOfLinkedNodes.end() && ii < _LinkedNodesSize ;
323 aMapOfLinkedNodesIterator1++ ) {
324 cdebug << "_MapOfLinkedNodes" << ii++ << " of " << Name() << " : "
325 << aMapOfLinkedNodesIterator1->first << " --> " << aMapOfLinkedNodesIterator1->second
326 << " " << _LinkedNodes[ aMapOfLinkedNodesIterator1->second - 1 ]->Name() << endl ;
329 cdebug_out << Name() << "->GraphBase::StreamNode::ReNameLinkedNode" << endl ;
332 void GraphBase::StreamNode::ReNameLinkedFromNode( const char* OldNodeName ,
333 const char* NewNodeName ) {
334 cdebug_in << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode (" << OldNodeName
335 << " , " << NewNodeName << ") _LinkedFromNodesSize " << _LinkedFromNodesSize
337 int index = GetLinkedFromNodeIndex( OldNodeName ) ;
339 // _MapOfLinkedFromNodes.erase( OldNodeName ) ;
340 DelLinkedFromNodeIndex( OldNodeName ) ;
341 SetLinkedFromNodeIndex( NewNodeName , index ) ;
344 cdebug << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode ERROR " << OldNodeName
345 << " not found in " << Name() << endl ;
348 map< string , int >::iterator aMapOfLinkedFromNodesIterator1 ;
350 for ( aMapOfLinkedFromNodesIterator1 = _MapOfLinkedFromNodes.begin() ;
351 aMapOfLinkedFromNodesIterator1 != _MapOfLinkedFromNodes.end() &&
352 iifrom < _LinkedFromNodesSize ; aMapOfLinkedFromNodesIterator1++ ) {
353 cdebug << "_MapOfLinkedFromNodes" << iifrom++ << " of " << Name() << " : "
354 << aMapOfLinkedFromNodesIterator1->first << " --> "
355 << aMapOfLinkedFromNodesIterator1->second << " "
356 << _LinkedFromNodes[ aMapOfLinkedFromNodesIterator1->second - 1 ]->Name()
360 cdebug_out << Name() << "->GraphBase::StreamNode::ReNameLinkedFromNode" << endl ;
363 void GraphBase::StreamNode::AddStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
364 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
366 cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
367 << " ) new LinkedNode " << endl ;
368 _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
369 _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
370 _LinkedStreamNodes[ _LinkedStreamNodesSize ] = ToNode ;
371 _LinkedInStreamPortsNumber[ _LinkedStreamNodesSize ] = 1 ;
372 SetLinkedStreamNodeIndex( ToNode->Name() , _LinkedStreamNodesSize ) ;
373 index = _LinkedStreamNodesSize ;
374 _LinkedStreamNodesSize++ ;
377 cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
378 << " ) old LinkedNode " << _LinkedStreamNodes[index ]->Name() << endl ;
379 _LinkedInStreamPortsNumber[ index ] += 1 ;
381 cdebug_out << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
382 << " ) LinkedStreamNodesSize " << _LinkedStreamNodesSize << " [ " << index
383 << " ] _LinkedInStreamPortsNumber " << _LinkedInStreamPortsNumber[ index ] << endl ;
386 bool GraphBase::StreamNode::RemoveStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
387 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
389 cdebug << "GraphBase::StreamNode::RemoveStreamLinkedNode( to " << ToNode->Name() << " from "
390 << Name() << " index : " << index << " LinkedInStreamPortsNumber "
391 << _LinkedInStreamPortsNumber[ index ] << " - 1" << endl ;
392 _LinkedInStreamPortsNumber[ index ] -= 1 ;
393 if ( _LinkedInStreamPortsNumber[ index ] == 0 ) {
394 _LinkedStreamNodesSize-- ;
395 cdebug << "GraphBase::StreamNode::RemoveStreamLinkedNode new LinkedNodesSize "
396 << _LinkedStreamNodesSize << " " << ToNode->Name() << " removed from "
397 << " linkednodes of " << Name() << endl ;
399 for ( i = index ; i < _LinkedStreamNodesSize ; i++ ) {
400 _LinkedStreamNodes[ i ] = _LinkedStreamNodes[ i+1 ] ;
401 _LinkedInStreamPortsNumber[ i ] = _LinkedInStreamPortsNumber[ i+1 ] ;
402 SetLinkedStreamNodeIndex( _LinkedStreamNodes[ i ]->Name() , i ) ;
404 DelLinkedStreamNodeIndex( ToNode->Name() ) ;
405 _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
406 _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
410 cdebug << "StreamNode::RemoveStreamLinkedNode Error index " << index << endl ;
412 return (index >= 0 ) ;
415 void GraphBase::StreamNode::ReNameStreamLinkedNode( const char* OldNodeName ,
416 const char* NewNodeName ) {
417 cdebug_in << "GraphBase::StreamNode::ReNameStreamLinkedNode (" << OldNodeName << " , "
418 << NewNodeName << ")" << endl;
419 int index = GetLinkedStreamNodeIndex( OldNodeName ) ;
421 // _MapOfLinkedNodes.erase( OldNodeName ) ;
422 DelLinkedStreamNodeIndex( OldNodeName ) ;
423 SetLinkedStreamNodeIndex( NewNodeName , index ) ;
425 cdebug_out << "GraphBase::StreamNode::ReNameStreamLinkedNode" << endl ;