Version: 9.16.0
OutputPort.cxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#include "OutputPort.hxx"
21#include "ComposedNode.hxx"
22#include "InputPort.hxx"
23#include "InPropertyPort.hxx"
24#include "Runtime.hxx"
25#include "Node.hxx"
26
27#include <sstream>
28#include <iostream>
29
30//#define _DEVDEBUG_
31#include "YacsTrace.hxx"
32
33using namespace YACS::ENGINE;
34using namespace std;
35
36const char OutputPort::NAME[]="OutputPort";
37
38OutputPort::OutputPort(const OutputPort& other, Node *newHelder):DataFlowPort(other,newHelder),OutPort(other,newHelder),
39 DataPort(other,newHelder),Port(other,newHelder)
40{
41}
42
43OutputPort::OutputPort(const std::string& name, Node *node, TypeCode* type):DataFlowPort(name,node,type),OutPort(name,node,type),
44 DataPort(name,node,type),Port(node)
45{
46}
47
49{
50 return NAME;
51}
52
54{
55 set<InputPort *>::iterator iter;
56 set<InputPort *> vec(_setOfInputPort);
57 for( set<InputPort *>::iterator iter2=vec.begin();iter2!=vec.end();iter2++)
58 edRemoveInputPort(*iter2,true);
59 _setOfInputPort.clear();
60}
61
63{
64}
65
66void OutputPort::put(const void *data)
67{
68 for(set<InputPort *>::iterator iter = _setOfInputPort.begin(); iter != _setOfInputPort.end(); iter++)
69 (*iter)->put(data);
70}
71
76{
77 DEBTRACE("OutputPort::edAddInputPort");
78 if(!isAlreadyInSet(phyPort))
79 {
80 InputPort *pwrap = getRuntime()->adapt(phyPort,
82 this->edGetType());
83 _setOfInputPort.insert(pwrap);
84 modified();
85 phyPort->modified();
86 return true;
87 }
88 else
89 return false;
90}
91
93{
94 DEBTRACE("OutputPort::edAddInPropertyPort");
95 if(!isAlreadyInSet(phyPort))
96 {
97 InputPort *pwrap = getRuntime()->adapt(phyPort,
99 this->edGetType());
100 _setOfInputPort.insert(pwrap);
101 modified();
102 phyPort->modified();
103 return true;
104 }
105 else
106 return false;
107}
108
114int OutputPort::edRemoveInputPort(InputPort *inputPort, bool forward)
115{
116 if(forward)
117 {
118 set<InPort *> s;
119 inputPort->getAllRepresentants(s);
120 DEBTRACE("+++");
121 for(set<InPort *>::iterator iter=s.begin();iter!=s.end();iter++)
122 {
123 DEBTRACE("---");
124 _node->getRootNode()->edRemoveLink(this,*iter);
125 }
126 return -1;
127 }
128 else
129 {
130#ifdef NOCOVARIANT
131 InPort *publicRepr=inputPort->getPublicRepresentant();
132#else
133 InputPort *publicRepr=inputPort->getPublicRepresentant();
134#endif
135 set<InputPort *>::iterator iter;
136 for(iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
137 if((*iter)->getPublicRepresentant()==publicRepr)
138 break;
139 if(iter!=_setOfInputPort.end())
140 {
141 (*iter)->modified();
142 if((*iter)->isIntermediate())
143 delete (*iter);
144 _setOfInputPort.erase(iter);
145 modified();
146 return edGetNumberOfOutLinks();
147 }
148 else
149 throw Exception("OutputPort::edRemoveInputPort : link does not exist, unable to remove it");
150 }
151}
152
154{
155 set<InputPort *>::iterator iter;
156 for(iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
157 {
158 delete (*iter);
159 }
160}
161
163{
164 InPort *publicRepr=with->getPublicRepresentant();
165 set<InPort *> s;
166 set<InputPort *>::const_iterator iter;
167 for(iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
168 {
169 if((*iter)->getPublicRepresentant() == publicRepr)
170 return true;
171 }
172 for(iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
173 (*iter)->getAllRepresentants(s);
174 for(set<InPort *>::iterator iter2=s.begin();iter2!=s.end();iter2++)
175 {
176 if((*iter2)->getPublicRepresentant() == publicRepr)
177 return true;
178 }
179 return false;
180}
181
183{
184#ifdef NOCOVARIANT
185 InPort *publicRepr=inputPort->getPublicRepresentant();
186#else
187 InputPort *publicRepr=inputPort->getPublicRepresentant();
188#endif
189 for(set<InputPort *>::const_iterator iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
190 if((*iter)->getPublicRepresentant()==publicRepr)
191 return true;
192 return false;
193}
194
195bool
197{
198 return !_setOfInputPort.empty();
199}
200
201
206{
207 DEBTRACE("OutputPort::addInPort");
210 {
211 string what="not compatible type of port requested during building of link FROM ";
212 what+=NAME; what+=" TO "; what+=inPort->getNameOfTypeOfCurrentInstance();
213 throw Exception(what);
214 }
216 {
217 return edAddInputPort(static_cast<InputPort*>(inPort));
218 }
219 else
220 {
221 return edAddInPropertyPort(static_cast<InPropertyPort*>(inPort));
222 }
223}
224
228int OutputPort::removeInPort(InPort *inPort, bool forward)
229{
230 if(inPort->getNameOfTypeOfCurrentInstance()!=InputPort::NAME && !forward)
231 {
232 string what="not compatible type of port requested during destruction of for link FROM ";
233 what+=NAME; what+=" TO "; what+=inPort->getNameOfTypeOfCurrentInstance();
234 throw Exception(what);
235 }
236 return edRemoveInputPort(static_cast<InputPort*>(inPort),forward);
237}
238
239std::set<InPort *> OutputPort::edSetInPort() const
240{
241 set<InPort *> s;
242 for(set<InputPort *>::const_iterator iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
243 (*iter)->getAllRepresentants(s);
244 return s;
245}
246
247std::string OutputPort::dump()
248{
249 string xmldump = "<value><error> NO_SERIALISATION_AVAILABLE </error></value>";
250 return xmldump;
251}
252
253
255const std::set<InputPort *>& OutputPort::getSetOfPhyLinks() const
256{
257 return _setOfInputPort;
258}
259
262{
263}
#define DEBTRACE(msg)
Definition: YacsTrace.hxx:31
void edRemoveLink(OutPort *start, InPort *end)
Remove a dataflow link.
std::string getNameOfTypeOfCurrentInstance() const
Definition: DataPort.cxx:56
virtual InPort * getPublicRepresentant()
Definition: InPort.hxx:63
virtual void getAllRepresentants(std::set< InPort * > &repr) const
Definition: InPort.cxx:110
class for Input Property Ports
Base class for Input Ports.
Definition: InputPort.hxx:44
static const char NAME[]
Definition: InputPort.hxx:48
virtual InputPort * getPublicRepresentant()
returns the final physical port behind 'this'.
Definition: InputPort.hxx:57
Base class for all nodes.
Definition: Node.hxx:70
virtual ComposedNode * getRootNode() const
Definition: Node.cxx:431
std::string getImplementation() const
Definition: Node.cxx:350
virtual int edGetNumberOfOutLinks() const
Definition: OutPort.cxx:50
virtual void put(const void *data)
Definition: OutputPort.cxx:66
bool addInPort(InPort *inPort)
Definition: OutputPort.cxx:205
int removeInPort(InPort *inPort, bool forward)
Definition: OutputPort.cxx:228
std::set< InputPort * > _setOfInputPort
Definition: OutputPort.hxx:77
virtual bool edAddInPropertyPort(InPropertyPort *phyPort)
Definition: OutputPort.cxx:92
std::set< InPort * > edSetInPort() const
Definition: OutputPort.cxx:239
virtual bool edAddInputPort(InputPort *phyPort)
Definition: OutputPort.cxx:75
virtual int edRemoveInputPort(InputPort *inputPort, bool forward)
Definition: OutputPort.cxx:114
OutputPort(const OutputPort &other, Node *newHelder)
Definition: OutputPort.cxx:38
virtual std::string dump()
Definition: OutputPort.cxx:247
std::string getNameOfTypeOfCurrentInstance() const
Definition: OutputPort.cxx:48
const std::set< InputPort * > & getSetOfPhyLinks() const
Returns physical links linked to this. Contrary to edSetInPort that returns semantic links.
Definition: OutputPort.cxx:255
bool isAlreadyLinkedWith(InPort *withp) const
Definition: OutputPort.cxx:162
virtual void checkBasicConsistency() const
Check validity of output port. Nothing on base class.
Definition: OutputPort.cxx:261
bool isAlreadyInSet(InputPort *inputPort) const
Definition: OutputPort.cxx:182
static const char NAME[]
Definition: OutputPort.hxx:79
virtual void exInit()
Definition: OutputPort.cxx:62
Base class for all ports.
Definition: Port.hxx:43
void modified()
Definition: Port.cxx:53
Node * _node
Definition: Port.hxx:55
virtual InputPort * adapt(InputPort *source, const std::string &impl, TypeCode *type, bool init=false)=0
Base class for all type objects.
Definition: TypeCode.hxx:68
YACSLIBENGINE_EXPORT Runtime * getRuntime()
Definition: Runtime.cxx:61