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 _LinkedStreamNodesSize = 0 ;
26 _GraphMacroNode = SUPERV::Graph::_nil() ;
28 _GraphMacroLevel = 0 ;
30 _SubStreamGraphNumber = 0 ;
31 cdebug << "GraphBase::StreamNode::StreamNode " << this << " " << endl ;
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 ) ;
46 Kind( DataFlowkind ) ;
47 _LinkedNodesSize = 0 ;
48 _LinkedStreamNodesSize = 0 ;
53 _GraphMacroNode = SUPERV::Graph::_nil() ;
55 _GraphMacroLevel = 0 ;
57 _SubStreamGraphNumber = 0 ;
58 cdebug << "GraphBase::StreamNode::StreamNode " << NodeName << " "
59 << this << " " << endl ;
62 GraphBase::StreamNode::~StreamNode() {
63 cdebug << "GraphBase::StreamNode::~StreamNode " << this << endl ;
66 bool GraphBase::StreamNode::Name( const char * aName) {
67 cdebug_in << "GraphBase::StreamNode::Name " << _Name << endl;
69 cdebug << "GraphBase::StreamNode::ReName " << _Name << " --> " << aName << endl ;
72 _Name = new char[strlen(aName)+1] ;
73 strcpy( _Name , aName ) ;
74 cdebug_out << "GraphBase::StreamNode::Name " << _Name << endl;
78 void GraphBase::StreamNode::SetSubStreamGraph( int SubStreamGraphsNumber , int & RetVal ) {
80 cdebug_in << Name() << " GraphBase::StreamNode::SetSubStreamGraph Level "<< Level() << " SortedIndex "
81 << SortedIndex() << " SubStreamGraphsNumber " << SubStreamGraphsNumber << " RetVal " << RetVal
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 ) {
96 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() == 0 ) {
97 LinkedStreamNodes( jnode )->SubStreamGraph( SubStreamGraphsNumber ) ;
98 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
99 << LinkedStreamNodes( jnode )->SubStreamGraph() << endl ;
101 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() != SubStreamGraphsNumber ) {
102 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
103 << LinkedStreamNodes( jnode )->SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
104 RetVal = LinkedStreamNodes( jnode )->SubStreamGraph() ;
110 cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
111 RetVal = SubStreamGraph() ;
114 cdebug_out << Name() << "->GraphBase::StreamNode::SetSubStreamGraph RetVal " << RetVal << endl ;
118 void GraphBase::StreamNode::AddLinkedNode( GraphBase::StreamNode * ToNode ) {
119 int index = GetLinkedNodeIndex( ToNode->Name() ) ;
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 ;
132 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
133 << " ) old LinkedNode " << _LinkedNodes[index ]->Name() << endl ;
134 _LinkedInPortsNumber[ index ] += 1 ;
136 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
137 << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
138 << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
141 bool GraphBase::StreamNode::RemoveLinkedNode( GraphBase::StreamNode * ToNode ) {
142 int index = GetLinkedNodeIndex( ToNode->Name() ) ;
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 ) {
150 cdebug << "GraphBase::StreamNode::RemoveLinkedNode new LinkedNodesSize "
151 << _LinkedNodesSize << " " << ToNode->Name() << " removed from "
152 << " linkednodes of " << Name() << endl ;
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 ) ;
159 DelLinkedNodeIndex( ToNode->Name() ) ;
160 _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
161 _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
165 cdebug << "StreamNode::RemoveLinkedNode index Error " << Name() << " --> " << ToNode->Name() << " : " << index
166 << " _LinkedNodesSize " << _LinkedNodesSize << endl ;
168 map< string , int >::iterator aMapOfLinkedNodesIterator ;
170 for ( aMapOfLinkedNodesIterator = _MapOfLinkedNodes.begin() ;
171 aMapOfLinkedNodesIterator != _MapOfLinkedNodes.end() ; aMapOfLinkedNodesIterator++ ) {
172 cdebug << "_MapOfLinkedNodes" << i++ << " " << aMapOfLinkedNodesIterator->first << " --> "
173 << aMapOfLinkedNodesIterator->second << endl ;
177 return (index >= 0 ) ;
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 ) ;
186 // _MapOfLinkedNodes.erase( OldNodeName ) ;
187 DelLinkedNodeIndex( OldNodeName ) ;
188 SetLinkedNodeIndex( NewNodeName , index ) ;
190 cdebug_out << "GraphBase::StreamNode::ReNameLink" << endl ;
193 void GraphBase::StreamNode::AddStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
194 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
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++ ;
207 cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
208 << " ) old LinkedNode " << _LinkedStreamNodes[index ]->Name() << endl ;
209 _LinkedInStreamPortsNumber[ index ] += 1 ;
211 cdebug_out << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
212 << " ) LinkedStreamNodesSize " << _LinkedStreamNodesSize << " [ " << index
213 << " ] _LinkedInStreamPortsNumber " << _LinkedInStreamPortsNumber[ index ] << endl ;
216 bool GraphBase::StreamNode::RemoveStreamLinkedNode( GraphBase::StreamNode * ToNode ) {
217 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
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 ;
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 ) ;
234 DelLinkedStreamNodeIndex( ToNode->Name() ) ;
235 _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
236 _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
240 cdebug << "StreamNode::RemoveStreamLinkedNode Error index " << index << endl ;
242 return (index >= 0 ) ;
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 ) ;
251 // _MapOfLinkedNodes.erase( OldNodeName ) ;
252 DelLinkedStreamNodeIndex( OldNodeName ) ;
253 SetLinkedStreamNodeIndex( NewNodeName , index ) ;
255 cdebug_out << "GraphBase::StreamNode::ReNameStreamLinkedNode" << endl ;