Salome HOME
DCQ : Merge with Ecole_Ete_a6.
[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   _LinkedNodesSize = 0 ;
20   _LinkedStreamNodesSize = 0 ;
21   _HeadNode = false ;
22   _SubGraphNumber = 0 ;
23   _SubStreamGraphNumber = 0 ;
24   cdebug << "GraphBase::StreamNode::StreamNode " << this << " "  << endl ;
25 }
26
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 ) ;
32   }
33   else {
34     _Name = NULLSTRING ;
35   }
36   _LinkedNodesSize = 0 ;
37   _LinkedStreamNodesSize = 0 ;
38   _HeadNode = false ;
39   _SubGraphNumber = 0 ;
40   _SubStreamGraphNumber = 0 ;
41   cdebug << "GraphBase::StreamNode::StreamNode " << NodeName << " "
42          << this << " "  << endl ;
43 }
44
45 GraphBase::StreamNode::~StreamNode() {
46   cdebug << "GraphBase::StreamNode::~StreamNode " << this << endl ;
47 }
48
49 bool GraphBase::StreamNode::Name( const char * aName) {
50   cdebug_in << "GraphBase::StreamNode::Name " << _Name << endl;
51   if ( _Name ) {
52     cdebug << "GraphBase::StreamNode::ReName "  << _Name << " --> " << aName << endl ;
53     delete [] _Name ;
54   }
55   _Name = new char[strlen(aName)+1] ;
56   strcpy( _Name , aName ) ;
57   cdebug_out << "GraphBase::StreamNode::Name " << _Name << endl;
58   return true ;
59 }
60
61 void GraphBase::StreamNode::SetSubStreamGraph( int SubStreamGraphsNumber , int & RetVal ) {
62   int jnode ;
63   cdebug_in << Name() << " GraphBase::StreamNode::SetSubStreamGraph Level "<< Level() << " SortedIndex "
64             << SortedIndex() << " SubStreamGraphsNumber " << SubStreamGraphsNumber << " RetVal " << RetVal
65             << endl ;
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 ) {
76           break ;
77         }
78       }
79       else if ( LinkedStreamNodes( jnode )->SubStreamGraph() == 0 ) {
80         LinkedStreamNodes( jnode )->SubStreamGraph( SubStreamGraphsNumber ) ;
81         cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
82                << LinkedStreamNodes( jnode )->SubStreamGraph() << endl ;
83       }
84       else if ( LinkedStreamNodes( jnode )->SubStreamGraph() != SubStreamGraphsNumber ) {
85         cdebug << LinkedStreamNodes( jnode )->Name() << " SubStreamGraph "
86                << LinkedStreamNodes( jnode )->SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
87         RetVal = LinkedStreamNodes( jnode )->SubStreamGraph() ;
88         break ;
89       }
90     }
91   }
92   else {
93     cdebug << Name() << " SubStreamGraph " << SubStreamGraph() << " != " << SubStreamGraphsNumber << endl ;
94     RetVal = SubStreamGraph() ;
95   }
96
97   cdebug_out << Name() << "->GraphBase::StreamNode::SetSubStreamGraph RetVal " << RetVal << endl ;
98   return ;
99 }
100
101 void GraphBase::StreamNode::AddLink( GraphBase::StreamNode * ToNode ) {
102   int index = GetLinkedNodeIndex( ToNode->Name() ) ;
103   if ( index < 0 ) {
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 ;
112     _LinkedNodesSize++ ;
113   }
114   else {
115     cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
116            << " ) old LinkedNode " << _LinkedNodes[index ]->Name() << endl ;
117     _LinkedInPortsNumber[ index ] += 1 ;
118   }
119   cdebug << Name() << "->GraphBase::StreamNode::AddLinkedNode( " << ToNode->Name()
120          << " ) LinkedNodesSize " << _LinkedNodesSize << " [ " << index
121          << " ] _LinkedInPortsNumber " << _LinkedInPortsNumber[ index ] << endl ;
122 }
123
124 bool GraphBase::StreamNode::RemoveLink( GraphBase::StreamNode * ToNode ) {
125   int index = GetLinkedNodeIndex( ToNode->Name() ) ;
126   if ( index >= 0 ) {
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 ) {
132       _LinkedNodesSize-- ;
133       cdebug << "GraphBase::StreamNode::RemoveLink new LinkedNodesSize "
134              << _LinkedNodesSize << " " << ToNode->Name() << " removed from "
135              << " linkednodes of " << Name() << endl ;
136       int i ;
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 ) ;
141       }
142       DelLinkedNodeIndex( ToNode->Name() ) ;
143       _LinkedNodes.resize( _LinkedNodesSize+1 ) ;
144       _LinkedInPortsNumber.resize( _LinkedNodesSize+1 ) ;
145     }
146   }
147   else {
148     cdebug << " Error index " << index << endl ;
149   }
150   return (index >= 0 ) ;
151 }
152
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 ) ;
158   if ( index >= 0 ) {
159 //    _MapOfLinkedNodes.erase( OldNodeName ) ;
160     DelLinkedNodeIndex( OldNodeName ) ;
161     SetLinkedNodeIndex( NewNodeName , index ) ;
162   }
163   cdebug_out << "GraphBase::StreamNode::ReNameLink" << endl ;
164 }
165
166 void GraphBase::StreamNode::AddStreamLink( GraphBase::StreamNode * ToNode ) {
167   int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
168   if ( index < 0 ) {
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++ ;
178   }
179   else {
180     cdebug_in << Name() << "->GraphBase::StreamNode::AddStreamLink( " << ToNode->Name()
181               << " ) old LinkedNode " << _LinkedStreamNodes[index ]->Name() << endl ;
182     _LinkedInStreamPortsNumber[ index ] += 1 ;
183   }
184   cdebug_out << Name() << "->GraphBase::StreamNode::AddStreamLinkedNode( " << ToNode->Name()
185              << " ) LinkedStreamNodesSize " << _LinkedStreamNodesSize << " [ " << index
186              << " ] _LinkedInStreamPortsNumber " << _LinkedInStreamPortsNumber[ index ] << endl ;
187 }
188
189 bool GraphBase::StreamNode::RemoveStreamLink( GraphBase::StreamNode * ToNode ) {
190   int index = GetLinkedStreamNodeIndex( ToNode->Name() ) ;
191   if ( index >= 0 ) {
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 ;
201       int i ;
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 ) ;
206       }
207       DelLinkedStreamNodeIndex( ToNode->Name() ) ;
208       _LinkedStreamNodes.resize( _LinkedStreamNodesSize+1 ) ;
209       _LinkedInStreamPortsNumber.resize( _LinkedStreamNodesSize+1 ) ;
210     }
211   }
212   else {
213     cdebug << " Error index " << index << endl ;
214   }
215   return (index >= 0 ) ;
216 }
217
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 ) ;
223   if ( index >= 0 ) {
224 //    _MapOfLinkedNodes.erase( OldNodeName ) ;
225     DelLinkedStreamNodeIndex( OldNodeName ) ;
226     SetLinkedStreamNodeIndex( NewNodeName , index ) ;
227   }
228   cdebug_out << "GraphBase::StreamNode::ReNameStreamLink" << endl ;
229 }
230