Salome HOME
mergefrom branch BR_V511_PR tag mergeto_trunk_03feb09
[modules/yacs.git] / src / engine / DataPort.cxx
1 //  Copyright (C) 2006-2008  CEA/DEN, EDF R&D
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.
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 #include "DataPort.hxx"
20 #include "TypeCode.hxx"
21 #include <iostream>
22
23 using namespace YACS::ENGINE;
24 using namespace std;
25
26 const char DataPort::NAME[]="DataPort";
27
28 DataPort::~DataPort()
29 {
30   _type->decrRef();
31 }
32
33 DataPort::DataPort(const std::string& name, Node *node, TypeCode* type):Port(node),_name(name),_type(type)
34 {
35   _type->incrRef();
36 }
37
38 DataPort::DataPort(const DataPort& other, Node *newHelder):Port(other,newHelder),_name(other._name),_type(other._type)
39 {
40   _type->incrRef();
41 }
42
43 void DataPort::edSetType(TypeCode* type)
44 {
45   if(_type)
46     _type->decrRef();
47   _type=type;
48   if(_type)
49     _type->incrRef();
50 }
51
52 string DataPort::getNameOfTypeOfCurrentInstance() const
53 {
54   return NAME;
55 }
56
57 bool DataPort::isDifferentTypeOf(const DataPort *other) const
58 {
59   return getTypeOfChannel()!=other->getTypeOfChannel();
60 }
61
62 /*!
63  * If in historyOfLink different type of Port are detected : The first one (by starting from the end of 'historyOfLink')
64  * is returned. Else 0 is returned if they are all of the same type.
65  */
66 DataPort *DataPort::isCrossingType(const std::vector<DataPort *>& historyOfLink)
67 {
68   vector<DataPort *>::const_reverse_iterator iter=historyOfLink.rbegin()+1;
69   const DataPort *base=historyOfLink.back();
70   for(;iter!=historyOfLink.rend();iter++)
71     if(base->isDifferentTypeOf(*iter))
72       return *iter;
73   return 0;
74 }
75
76 //! returns port value as a string that can be used in a GUI for example
77 /*!
78  * Do nothing here. To subclass
79  */
80 std::string DataPort::getAsString()
81 {
82   return "";
83 }