Salome HOME
Merge with version on tag OCC-V2_1_0d
[modules/superv.git] / src / GraphBase / DataFlowBase_StreamNode.cxx
1 //  SUPERV GraphBase : contains fondamental classes for Services, Input Ports, Output Ports Links and Nodes.
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : DataFlowBase_StreamNode.cxx
8 //  Author : Jean Rahuel
9 //  Module : SUPERV
10 //  $Header:
11
12 using namespace std;
13
14 #include "DataFlowBase_StreamNode.hxx"
15
16 GraphBase::StreamNode::StreamNode() :
17   GraphBase::PortsOfNode::PortsOfNode() {
18   _Name = NULL ;
19   _Kind = SUPERV::UnknownNode ;
20   _LinkedNodesSize = 0 ;
21   _LinkedStreamNodesSize = 0 ;
22   _HeadNode = false ;
23   _LevelNumber = -1 ;
24   _SortedIndex = -1 ;
25   _GraphEditor = NULL ;
26   _GraphMacroNode =  SUPERV::Graph::_nil() ;
27   _GraphOfNode = NULL ;
28   _GraphMacroLevel = 0 ;
29   _SubGraphNumber = 0 ;
30   _SubStreamGraphNumber = 0 ;
31   cdebug << "GraphBase::StreamNode::StreamNode " << this << " "  << endl ;
32 }
33
34 GraphBase::StreamNode::StreamNode( const char * NodeName ,
35                                    const SUPERV::KindOfNode DataFlowkind ,
36                                    int * Graph_prof_debug ,
37                                    ofstream * Graph_fdebug ) :
38   GraphBase::PortsOfNode::PortsOfNode( NodeName ) {
39   if ( NodeName != NULLSTRING && strlen( NodeName ) ) {
40     _Name = new char[ strlen( NodeName )+1 ] ;
41     strcpy( _Name , NodeName ) ;
42   }
43   else {
44     _Name = NULLSTRING ;
45   }
46   Kind( DataFlowkind ) ;
47   _LinkedNodesSize = 0 ;
48   _LinkedStreamNodesSize = 0 ;
49   _HeadNode = false ;
50   _LevelNumber = -1 ;
51   _SortedIndex = -1 ;
52   _GraphEditor = NULL ;
53   _GraphMacroNode =  SUPERV::Graph::_nil() ;
54   _GraphOfNode = NULL ;
55   _GraphMacroLevel = 0 ;
56   _SubGraphNumber = 0 ;
57   _SubStreamGraphNumber = 0 ;
58   cdebug << "GraphBase::StreamNode::StreamNode " << NodeName << " "
59          << this << " "  << endl ;
60 }
61
62 GraphBase::StreamNode::~StreamNode() {
63   cdebug << "GraphBase::StreamNode::~StreamNode " << this << endl ;
64 }
65
66 bool GraphBase::StreamNode::Name( const char * aName) {
67   cdebug_in << "GraphBase::StreamNode::Name " << _Name << endl;
68   if ( _Name ) {
69     cdebug << "GraphBase::StreamNode::ReName "  << _Name << " --> " << aName << endl ;
70     delete [] _Name ;
71   }
72   _Name = new char[strlen(aName)+1] ;
73   strcpy( _Name , aName ) ;
74   cdebug_out << "GraphBase::StreamNode::Name " << _Name << endl;
75   return true ;
76 }
77
78 void GraphBase::StreamNode::SetSubStreamGraph( int SubStreamGraphsNumber , int & RetVal ) {
79   int jnode ;
80   cdebug_in << Name() << " GraphBase::StreamNode::SetSubStreamGraph Level "<< Level() << " SortedIndex "
81             << SortedIndex() << " SubStreamGraphsNumber " << SubStreamGraphsNumber << " RetVal " << RetVal
82             << endl ;
83   if ( SubStreamGraph() == 0 || SubStreamGraph() == SubStreamGraphsNumber ) {
84     SubStreamGraph( SubStreamGraphsNumber ) ;
85     cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " SetSubStreamGraph LinkedStreamNodesSize "
86            << LinkedStreamNodesSize() << endl ;
87     for ( jnode = 0 ; jnode < LinkedStreamNodesSize() ; jnode++ ) {
88       if ( LinkedStreamNodes( jnode )->Level() > Level() ||
89            ( LinkedStreamNodes( jnode )->Level() == Level() &&
90              LinkedStreamNodes( jnode )->SortedIndex() > SortedIndex() ) ) {
91         LinkedStreamNodes( jnode )->SetSubStreamGraph( SubStreamGraphsNumber , RetVal ) ;
92         if ( RetVal != SubStreamGraphsNumber ) {
93           break ;
94         }
95       }
96       else if ( LinkedStreamNodes( jnode )->SubStreamGraph() == 0 ) {
97         LinkedStreamNodes( jnode )->SubStreamGraph( SubStreamGraphsNumber ) ;
98         cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
99                << LinkedStreamNodes( jnode )->SubStreamGraph() << endl ;
100       }
101       else if ( LinkedStreamNodes( jnode )->SubStreamGraph() != SubStreamGraphsNumber ) {
102         cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
103                << LinkedStreamNodes( jnode )->SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
104         RetVal = LinkedStreamNodes( jnode )->SubStreamGraph() ;
105         break ;
106       }
107     }
108   }
109   else {
110     cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
111     RetVal = SubStreamGraph() ;
112   }
113
114   cdebug_out << Name() << "->GraphBase::StreamNode::SetSubStreamGraph RetVal " << RetVal << endl ;
115   return ;
116 }
117
118 void GraphBase::StreamNode::AddLinkedNode( GraphBase::StreamNode * ToNode ) {
119   int index = GetLinkedNodeIndex( ToNode->Name() ) ;
120   if ( index < 0 ) {
121     cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
122            << " ) new LinkedNode " << endl ;
123     _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
124     _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
125     _LinkedNodes[ _LinkedNodesSize ] = ToNode ;
126     _LinkedInPortsNumber[ _LinkedNodesSize ] = 1 ;
127     SetLinkedNodeIndex( ToNode->Name() , _LinkedNodesSize ) ;
128     index = _LinkedNodesSize ;
129     _LinkedNodesSize++ ;
130   }
131   else {
132     cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
133            << " ) old LinkedNode " << _LinkedNodes[index ]->Name() << endl ;
134     _LinkedInPortsNumber[ index ] += 1 ;
135   }
136   cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
137          << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
138          << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
139 }
140
141 bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ) {
142   int index = GetLinkedNodeIndex( ToNode->Name() ) ;
143   if ( index >= 0 ) {
144     cdebug << "GraphBase::StreamNode::RemoveLinkedNode( to " << ToNode->Name() << " from "
145            << Name() << " index : " << index << " LinkedInPortsNumber "
146            << _LinkedInPortsNumber[ index ] << " - 1" << endl ;
147     _LinkedInPortsNumber[ index ] -= 1 ;
148     if ( _LinkedInPortsNumber[ index ] == 0 ) {
149       _LinkedNodesSize-- ;
150       cdebug << "GraphBase::StreamNode::RemoveLinkedNode new LinkedNodesSize "
151              << _LinkedNodesSize << " " << ToNode->Name() << " removed from "
152              << " linkednodes of " << Name() << endl ;
153       int i ;
154       for ( i = index ; i < _LinkedNodesSize ; i++ ) {
155         _LinkedNodes[ i ] = _LinkedNodes[ i+1 ] ;
156         _LinkedInPortsNumber[ i ] =  _LinkedInPortsNumber[ i+1 ] ;
157         SetLinkedNodeIndex( _LinkedNodes[ i ]->Name() , i ) ;
158       }
159       DelLinkedNodeIndex( ToNode->Name() ) ;
160       _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
161       _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
162     }
163   }
164   else {
165     cdebug << "StreamNode::RemoveLinkedNode index Error " << Name() << " --> " << ToNode->Name() << " : " << index
166            << " _LinkedNodesSize " << _LinkedNodesSize << endl ;
167 #if 1
168     map< string , int >::iterator aMapOfLinkedNodesIterator ;
169     int i = 0 ;
170     for ( aMapOfLinkedNodesIterator = _MapOfLinkedNodes.begin() ;
171           aMapOfLinkedNodesIterator != _MapOfLinkedNodes.end() ; aMapOfLinkedNodesIterator++ ) {
172       cdebug << "_MapOfLinkedNodes" << i++ << " " << aMapOfLinkedNodesIterator->first << " --> "
173              << aMapOfLinkedNodesIterator->second << endl ;
174     }
175 #endif
176   }
177   return (index >= 0 ) ;
178 }
179
180 void GraphBase::StreamNode::ReNameLinkedNode( const char* OldNodeName ,
181                                            const char* NewNodeName ) {
182   cdebug_in << "GraphBase::StreamNode::ReNameLink (" << OldNodeName << " , "
183             << NewNodeName << ")" << endl;
184   int index = GetLinkedNodeIndex( OldNodeName ) ;
185   if ( index >= 0 ) {
186 //    _MapOfLinkedNodes.erase( OldNodeName ) ;
187     DelLinkedNodeIndex( OldNodeName ) ;
188     SetLinkedNodeIndex( NewNodeName , index ) ;
189   }
190   cdebug_out << "GraphBase::StreamNode::ReNameLink" << endl ;
191 }
192
193 void GraphBase::StreamNode::AddStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
194   int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
195   if ( index < 0 ) {
196     cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
197               << " ) new LinkedNode " << endl ;
198     _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
199     _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
200     _LinkedStreamNodes[ _LinkedStreamNodesSize ] = ToNode ;
201     _LinkedInStreamPortsNumber[ _LinkedStreamNodesSize ] = 1 ;
202     SetLinkedStreamNodeIndex( ToNode->Name() , _LinkedStreamNodesSize ) ;
203     index = _LinkedStreamNodesSize ;
204     _LinkedStreamNodesSize++ ;
205   }
206   else {
207     cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
208               << " ) old LinkedNode " << _LinkedStreamNodes[index ]->Name() << endl ;
209     _LinkedInStreamPortsNumber[ index ] += 1 ;
210   }
211   cdebug_out << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
212              << " ) LinkedStreamNodesSize " << _LinkedStreamNodesSize << " [ " << index
213              << " ] _LinkedInStreamPortsNumber " << _LinkedInStreamPortsNumber[ index ] << endl ;
214 }
215
216 bool GraphBase::StreamNode::RemoveStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
217   int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
218   if ( index >= 0 ) {
219     cdebug << "GraphBase::StreamNode::RemoveStreamLinkedNode( to " << ToNode->Name() << " from "
220            << Name() << " index : " << index << " LinkedInStreamPortsNumber "
221            << _LinkedInStreamPortsNumber[ index ] << " - 1" << endl ;
222     _LinkedInStreamPortsNumber[ index ] -= 1 ;
223     if ( _LinkedInStreamPortsNumber[ index ] == 0 ) {
224       _LinkedStreamNodesSize-- ;
225       cdebug << "GraphBase::StreamNode::RemoveStreamLinkedNode new LinkedNodesSize "
226              << _LinkedStreamNodesSize << " " << ToNode->Name() << " removed from "
227              << " linkednodes of " << Name() << endl ;
228       int i ;
229       for ( i = index ; i < _LinkedStreamNodesSize ; i++ ) {
230         _LinkedStreamNodes[ i ] = _LinkedStreamNodes[ i+1 ] ;
231         _LinkedInStreamPortsNumber[ i ] =  _LinkedInStreamPortsNumber[ i+1 ] ;
232         SetLinkedStreamNodeIndex( _LinkedStreamNodes[ i ]->Name() , i ) ;
233       }
234       DelLinkedStreamNodeIndex( ToNode->Name() ) ;
235       _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
236       _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
237     }
238   }
239   else {
240     cdebug << "StreamNode::RemoveStreamLinkedNode Error index " << index << endl ;
241   }
242   return (index >= 0 ) ;
243 }
244
245 void GraphBase::StreamNode::ReNameStreamLinkedNode( const char* OldNodeName ,
246                                               const char* NewNodeName ) {
247   cdebug_in << "GraphBase::StreamNode::ReNameStreamLinkedNode (" << OldNodeName << " , "
248             << NewNodeName << ")" << endl;
249   int index = GetLinkedStreamNodeIndex( OldNodeName ) ;
250   if ( index >= 0 ) {
251 //    _MapOfLinkedNodes.erase( OldNodeName ) ;
252     DelLinkedStreamNodeIndex( OldNodeName ) ;
253     SetLinkedStreamNodeIndex( NewNodeName , index ) ;
254   }
255   cdebug_out << "GraphBase::StreamNode::ReNameStreamLinkedNode" << endl ;
256 }