03d471b7aa3440f95b9d22db8e84ea312ecaab0f
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef PORT_HXX_
17 #define PORT_HXX_
18
19 #include <string>
20 #include <vector>
21
22 #include "utilities.hxx"
23 #include "Model.hxx"
24 #include "model/BaseObject.hxx"
25
26 namespace org_scilab_modules_scicos
27 {
28 namespace model
29 {
30
31 class Port: public BaseObject
32 {
33 public:
34     Port() : BaseObject(PORT), m_uid(), m_dataType(0), m_sourceBlock(ScicosID()), m_kind(PORT_UNDEF), m_implicit(false),
35         m_style(), m_label(), m_firing(0)
36     {
37         m_connectedSignals = {ScicosID()};
38     }
39     Port(const Port& o) : BaseObject(PORT), m_uid(o.m_uid), m_dataType(o.m_dataType), m_sourceBlock(o.m_sourceBlock), m_kind(o.m_kind), m_implicit(o.m_implicit),
40         m_style(o.m_style), m_label(o.m_label), m_firing(0), m_connectedSignals(o.m_connectedSignals) {};
41     ~Port() = default;
42
43 private:
44     friend class ::org_scilab_modules_scicos::Model;
45
46     void getUID(std::string& data) const
47     {
48         data = m_uid;
49     }
50
51     update_status_t setUID(const std::string& data)
52     {
53         if (data == m_uid)
54         {
55             return NO_CHANGES;
56         }
57
58         m_uid = data;
59         return SUCCESS;
60     }
61
62     const std::vector<ScicosID>& getConnectedSignals() const
63     {
64         return m_connectedSignals;
65     }
66
67     update_status_t setConnectedSignals(const std::vector<ScicosID>& connectedSignals)
68     {
69         if (this->m_connectedSignals == connectedSignals)
70         {
71             return NO_CHANGES;
72         }
73
74         this->m_connectedSignals = connectedSignals;
75         if (m_connectedSignals.empty())
76         {
77             m_connectedSignals = std::vector<ScicosID> (1, 0);
78         }
79         return SUCCESS;
80     }
81
82     void getDataType(std::vector<int>& v) const
83     {
84         if (m_dataType == 0)
85         {
86             // By default, size is set to [-1,1] and type to real (1)
87             v.resize(3, 1);
88             v[0] = -1;
89         }
90         else
91         {
92             v.resize(3);
93             v[0] = m_dataType->m_rows;
94             v[1] = m_dataType->m_columns;
95             v[2] = m_dataType->m_datatype_id;
96         }
97     }
98
99     update_status_t setDataType(Model* model, const std::vector<int>& v)
100     {
101         if (v.size() != 3)
102         {
103             return FAIL;
104         }
105
106         model::Datatype datatype = model::Datatype(v);
107         if (this->m_dataType != 0 && *this->m_dataType == datatype)
108         {
109             return NO_CHANGES;
110         }
111
112         this->m_dataType = model->flyweight(datatype);
113         return SUCCESS;
114     }
115
116     void getKind(int& k) const
117     {
118         k = m_kind;
119     }
120
121     update_status_t setKind(int k)
122     {
123         if (k < PORT_UNDEF || k > PORT_EOUT)
124         {
125             return FAIL;
126         }
127
128         if (k == m_kind)
129         {
130             return NO_CHANGES;
131         }
132
133         m_kind = static_cast<portKind>(k);
134         return SUCCESS;
135     }
136
137     void getSourceBlock(ScicosID& sb) const
138     {
139         sb = m_sourceBlock;
140     }
141
142     update_status_t setSourceBlock(const ScicosID sb)
143     {
144         if (sb == this->m_sourceBlock)
145         {
146             return NO_CHANGES;
147         }
148         this->m_sourceBlock = sb;
149         return SUCCESS;
150     }
151
152     void getImplicit(bool& v) const
153     {
154         v = m_implicit;
155     }
156
157     update_status_t setImplicit(bool implicit)
158     {
159         if (implicit == this->m_implicit)
160         {
161             return NO_CHANGES;
162         }
163         this->m_implicit = implicit;
164         return SUCCESS;
165     }
166
167     void getStyle(std::string& s) const
168     {
169         s = m_style;
170     }
171
172     update_status_t setStyle(const std::string& style)
173     {
174         if (style == this->m_style)
175         {
176             return NO_CHANGES;
177         }
178         this->m_style = style;
179         return SUCCESS;
180     }
181
182     void getLabel(std::string& l) const
183     {
184         l = m_label;
185     }
186
187     update_status_t setLabel(const std::string& label)
188     {
189         if (label == this->m_label)
190         {
191             return NO_CHANGES;
192         }
193         this->m_label = label;
194         return SUCCESS;
195     }
196
197     void getFiring(double& f) const
198     {
199         f = m_firing;
200     }
201
202     update_status_t setFiring(double firing)
203     {
204         if (firing == this->m_firing)
205         {
206             return NO_CHANGES;
207         }
208         this->m_firing = firing;
209         return SUCCESS;
210     }
211
212 private:
213     std::string m_uid;
214     Datatype* m_dataType;
215     ScicosID m_sourceBlock;
216     portKind m_kind;
217     bool m_implicit;
218     std::string m_style;
219     std::string m_label;
220     double m_firing;
221
222     std::vector<ScicosID> m_connectedSignals;
223 };
224
225 } /* namespace model */
226 } /* namespace org_scilab_modules_scicos */
227
228 #endif /* PORT_HXX_ */