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 _LinkedNodesSize = 0 ;
20 _LinkedStreamNodesSize = 0 ;
23 _SubStreamGraphNumber = 0 ;
24 cdebug << "GraphBase::StreamNode::StreamNode " << this << " " << endl ;
27 GraphBase::StreamNode::StreamNode( const char * NodeName ) :
28 GraphBase::PortsOfNode::PortsOfNode( NodeName ) {
29 if ( NodeName != NULLSTRING && strlen( NodeName ) ) {
30 _Name = new char[ strlen( NodeName )+1 ] ;
31 strcpy( _Name , NodeName ) ;
36 _LinkedNodesSize = 0 ;
37 _LinkedStreamNodesSize = 0 ;
40 _SubStreamGraphNumber = 0 ;
41 cdebug << "GraphBase::StreamNode::StreamNode " << NodeName << " "
42 << this << " " << endl ;
45 GraphBase::StreamNode::~StreamNode() {
46 cdebug << "GraphBase::StreamNode::~StreamNode " << this << endl ;
49 bool GraphBase::StreamNode::Name( const char * aName) {
50 cdebug_in << "GraphBase::StreamNode::Name " << _Name << endl;
52 cdebug << "GraphBase::StreamNode::ReName " << _Name << " --> " << aName << endl ;
55 _Name = new char[strlen(aName)+1] ;
56 strcpy( _Name , aName ) ;
57 cdebug_out << "GraphBase::StreamNode::Name " << _Name << endl;
61 void GraphBase::StreamNode::SetSubStreamGraph( int SubStreamGraphsNumber , int & RetVal ) {
63 cdebug_in << Name() << " GraphBase::StreamNode::SetSubStreamGraph Level "<< Level() << " SortedIndex "
64 << SortedIndex() << " SubStreamGraphsNumber " << SubStreamGraphsNumber << " RetVal " << RetVal
66 if ( SubStreamGraph() == 0 || SubStreamGraph() == SubStreamGraphsNumber ) {
67 SubStreamGraph( SubStreamGraphsNumber ) ;
68 cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " SetSubStreamGraph LinkedStreamNodesSize "
69 << LinkedStreamNodesSize() << endl ;
70 for ( jnode = 0 ; jnode < LinkedStreamNodesSize() ; jnode++ ) {
71 if ( LinkedStreamNodes( jnode )->Level() > Level() ||
72 ( LinkedStreamNodes( jnode )->Level() == Level() &&
73 LinkedStreamNodes( jnode )->SortedIndex() > SortedIndex() ) ) {
74 LinkedStreamNodes( jnode )->SetSubStreamGraph( SubStreamGraphsNumber , RetVal ) ;
75 if ( RetVal != SubStreamGraphsNumber ) {
79 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() == 0 ) {
80 LinkedStreamNodes( jnode )->SubStreamGraph( SubStreamGraphsNumber ) ;
81 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
82 << LinkedStreamNodes( jnode )->SubStreamGraph() << endl ;
84 else if ( LinkedStreamNodes( jnode )->SubStreamGraph() != SubStreamGraphsNumber ) {
85 cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
86 << LinkedStreamNodes( jnode )->SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
87 RetVal = LinkedStreamNodes( jnode )->SubStreamGraph() ;
93 cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
94 RetVal = SubStreamGraph() ;
97 cdebug_out << Name() << "->GraphBase::StreamNode::SetSubStreamGraph RetVal " << RetVal << endl ;
101 void GraphBase::StreamNode::AddLink( GraphBase::StreamNode * ToNode ) {
102 int index = GetLinkedNodeIndex( ToNode->Name() ) ;
104 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
105 << " ) new LinkedNode " << endl ;
106 _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
107 _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
108 _LinkedNodes[ _LinkedNodesSize ] = ToNode ;
109 _LinkedInPortsNumber[ _LinkedNodesSize ] = 1 ;
110 SetLinkedNodeIndex( ToNode->Name() , _LinkedNodesSize ) ;
111 index = _LinkedNodesSize ;
115 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
116 << " ) old LinkedNode " << _LinkedNodes[index ]->Name() << endl ;
117 _LinkedInPortsNumber[ index ] += 1 ;
119 cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
120 << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
121 << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
124 bool GraphBase::StreamNode::RemoveLink( GraphBase::StreamNode * ToNode ) {
125 int index = GetLinkedNodeIndex( ToNode->Name() ) ;
127 cdebug << "GraphBase::StreamNode::RemoveLink( to " << ToNode->Name() << " from "
128 << Name() << " index : " << index << " LinkedInPortsNumber "
129 << _LinkedInPortsNumber[ index ] << " - 1" << endl ;
130 _LinkedInPortsNumber[ index ] -= 1 ;
131 if ( _LinkedInPortsNumber[ index ] == 0 ) {
133 cdebug << "GraphBase::StreamNode::RemoveLink new LinkedNodesSize "
134 << _LinkedNodesSize << " " << ToNode->Name() << " removed from "
135 << " linkednodes of " << Name() << endl ;
137 for ( i = index ; i < _LinkedNodesSize ; i++ ) {
138 _LinkedNodes[ i ] = _LinkedNodes[ i+1 ] ;
139 _LinkedInPortsNumber[ i ] = _LinkedInPortsNumber[ i+1 ] ;
140 SetLinkedNodeIndex( _LinkedNodes[ i ]->Name() , i ) ;
142 DelLinkedNodeIndex( ToNode->Name() ) ;
143 _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
144 _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
148 cdebug << " Error index " << index << endl ;
150 return (index >= 0 ) ;
153 void GraphBase::StreamNode::ReNameLink( const char* OldNodeName ,
154 const char* NewNodeName ) {
155 cdebug_in << "GraphBase::StreamNode::ReNameLink (" << OldNodeName << " , "
156 << NewNodeName << ")" << endl;
157 int index = GetLinkedNodeIndex( OldNodeName ) ;
159 // _MapOfLinkedNodes.erase( OldNodeName ) ;
160 DelLinkedNodeIndex( OldNodeName ) ;
161 SetLinkedNodeIndex( NewNodeName , index ) ;
163 cdebug_out << "GraphBase::StreamNode::ReNameLink" << endl ;
166 void GraphBase::StreamNode::AddStreamLink( GraphBase::StreamNode * ToNode ) {
167 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
169 cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLink( " << ToNode->Name()
170 << " ) new LinkedNode " << endl ;
171 _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
172 _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
173 _LinkedStreamNodes[ _LinkedStreamNodesSize ] = ToNode ;
174 _LinkedInStreamPortsNumber[ _LinkedStreamNodesSize ] = 1 ;
175 SetLinkedStreamNodeIndex( ToNode->Name() , _LinkedStreamNodesSize ) ;
176 index = _LinkedStreamNodesSize ;
177 _LinkedStreamNodesSize++ ;
180 cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLink( " << ToNode->Name()
181 << " ) old LinkedNode " << _LinkedStreamNodes[index ]->Name() << endl ;
182 _LinkedInStreamPortsNumber[ index ] += 1 ;
184 cdebug_out << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
185 << " ) LinkedStreamNodesSize " << _LinkedStreamNodesSize << " [ " << index
186 << " ] _LinkedInStreamPortsNumber " << _LinkedInStreamPortsNumber[ index ] << endl ;
189 bool GraphBase::StreamNode::RemoveStreamLink( GraphBase::StreamNode * ToNode ) {
190 int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
192 cdebug << "GraphBase::StreamNode::RemoveStreamLink( to " << ToNode->Name() << " from "
193 << Name() << " index : " << index << " LinkedInStreamPortsNumber "
194 << _LinkedInStreamPortsNumber[ index ] << " - 1" << endl ;
195 _LinkedInStreamPortsNumber[ index ] -= 1 ;
196 if ( _LinkedInStreamPortsNumber[ index ] == 0 ) {
197 _LinkedStreamNodesSize-- ;
198 cdebug << "GraphBase::StreamNode::RemoveStreamLink new LinkedNodesSize "
199 << _LinkedStreamNodesSize << " " << ToNode->Name() << " removed from "
200 << " linkednodes of " << Name() << endl ;
202 for ( i = index ; i < _LinkedStreamNodesSize ; i++ ) {
203 _LinkedStreamNodes[ i ] = _LinkedStreamNodes[ i+1 ] ;
204 _LinkedInStreamPortsNumber[ i ] = _LinkedInStreamPortsNumber[ i+1 ] ;
205 SetLinkedStreamNodeIndex( _LinkedStreamNodes[ i ]->Name() , i ) ;
207 DelLinkedStreamNodeIndex( ToNode->Name() ) ;
208 _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
209 _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
213 cdebug << " Error index " << index << endl ;
215 return (index >= 0 ) ;
218 void GraphBase::StreamNode::ReNameStreamLink( const char* OldNodeName ,
219 const char* NewNodeName ) {
220 cdebug_in << "GraphBase::StreamNode::ReNameStreamLink (" << OldNodeName << " , "
221 << NewNodeName << ")" << endl;
222 int index = GetLinkedStreamNodeIndex( OldNodeName ) ;
224 // _MapOfLinkedNodes.erase( OldNodeName ) ;
225 DelLinkedStreamNodeIndex( OldNodeName ) ;
226 SetLinkedStreamNodeIndex( NewNodeName , index ) ;
228 cdebug_out << "GraphBase::StreamNode::ReNameStreamLink" << endl ;