Xcos MVC: Fixed default datatype
[scilab.git] / scilab / modules / scicos / src / cpp / model / Port.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014-2014 - Scilab Enterprises - Clement DAVID
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef PORT_HXX_
14 #define PORT_HXX_
15
16 #include <string>
17 #include <vector>
18
19 #include "Model.hxx"
20 #include "model/BaseObject.hxx"
21
22 namespace org_scilab_modules_scicos
23 {
24 namespace model
25 {
26
27 enum portKind
28 {
29     UNDEF, IN, OUT, EIN, EOUT
30 };
31
32 class Port: public BaseObject
33 {
34     friend class ::org_scilab_modules_scicos::Model;
35
36 private:
37     Port() : BaseObject(PORT), dataType(0), sourceBlock(0), kind(UNDEF), implicit(false),
38         style(), label(), firing(0), connectedSignals(std::vector<ScicosID> (1, 0)) {};
39     Port(const Port& o) : BaseObject(PORT), dataType(o.dataType), sourceBlock(o.sourceBlock), kind(o.kind), implicit(o.implicit),
40         style(o.style), label(o.label), firing(0), connectedSignals(o.connectedSignals) {};
41     ~Port() {};
42
43     const std::vector<ScicosID>& getConnectedSignals() const
44     {
45         return connectedSignals;
46     }
47
48     update_status_t setConnectedSignals(const std::vector<ScicosID>& connectedSignals)
49     {
50         if (this->connectedSignals == connectedSignals)
51         {
52             return NO_CHANGES;
53         }
54
55         this->connectedSignals = connectedSignals;
56         return SUCCESS;
57     }
58
59     void getDataType(std::vector<int>& v) const
60     {
61         if (dataType == 0)
62         {
63             // By default, size is set to [-1,1] and type to real (1)
64             v.resize(3, 1);
65             v[0] = -1;
66         }
67         else
68         {
69             v.resize(3);
70             v[0] = dataType->rows;
71             v[1] = dataType->columns;
72             v[2] = dataType->datatype_id;
73         }
74     }
75
76     update_status_t setDataType(Model* model, const std::vector<int>& v)
77     {
78         if (v.size() != 3)
79         {
80             return FAIL;
81         }
82
83         model::Datatype datatype = model::Datatype(v);
84         if (this->dataType != 0 && *this->dataType == datatype)
85         {
86             return NO_CHANGES;
87         }
88
89         this->dataType = model->flyweight(datatype);
90         return SUCCESS;
91     }
92
93     void getKind(int& k) const
94     {
95         k = kind;
96     }
97
98     update_status_t setKind(int k)
99     {
100         if (k < UNDEF || k > EOUT)
101         {
102             return FAIL;
103         }
104
105         if (k == kind)
106         {
107             return NO_CHANGES;
108         }
109
110         kind = static_cast<portKind>(k);
111         return SUCCESS;
112     }
113
114     void getSourceBlock(ScicosID& sb) const
115     {
116         sb = sourceBlock;
117     }
118
119     update_status_t setSourceBlock(const ScicosID sb)
120     {
121         if (sb == this->sourceBlock)
122         {
123             return NO_CHANGES;
124         }
125         this->sourceBlock = sb;
126         return SUCCESS;
127     }
128
129     void getImplicit(bool& v) const
130     {
131         v = implicit;
132     }
133
134     update_status_t setImplicit(bool implicit)
135     {
136         if (implicit == this->implicit)
137         {
138             return NO_CHANGES;
139         }
140         this->implicit = implicit;
141         return SUCCESS;
142     }
143
144     void getStyle(std::string& s) const
145     {
146         s = style;
147     }
148
149     update_status_t setStyle(const std::string& style)
150     {
151         if (style == this->style)
152         {
153             return NO_CHANGES;
154         }
155         this->style = style;
156         return SUCCESS;
157     }
158
159     void getLabel(std::string& l) const
160     {
161         l = style;
162     }
163
164     update_status_t setLabel(const std::string& label)
165     {
166         if (label == this->label)
167         {
168             return NO_CHANGES;
169         }
170         this->label = label;
171         return SUCCESS;
172     }
173
174     void getFiring(double& f) const
175     {
176         f = firing;
177     }
178
179     update_status_t setFiring(double firing)
180     {
181         if (firing == this->firing)
182         {
183             return NO_CHANGES;
184         }
185         this->firing = firing;
186         return SUCCESS;
187     }
188
189 private:
190     Datatype* dataType;
191     ScicosID sourceBlock;
192     portKind kind;
193     bool implicit;
194     std::string style;
195     std::string label;
196     double firing;
197
198     std::vector<ScicosID> connectedSignals;
199 };
200
201 } /* namespace model */
202 } /* namespace org_scilab_modules_scicos */
203
204 #endif /* PORT_HXX_ */