Xcos MVC: standardize C++ code
[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     PORT_UNDEF, PORT_IN, PORT_OUT, PORT_EIN, PORT_EOUT
30 };
31
32 class Port: public BaseObject
33 {
34 public:
35     Port() : BaseObject(PORT), m_dataType(0), m_sourceBlock(0), m_kind(PORT_UNDEF), m_implicit(false),
36         m_style(), m_label(), m_firing(0), m_connectedSignals(std::vector<ScicosID> (1, 0)) {};
37     Port(const Port& o) : BaseObject(PORT), m_dataType(o.m_dataType), m_sourceBlock(o.m_sourceBlock), m_kind(o.m_kind), m_implicit(o.m_implicit),
38         m_style(o.m_style), m_label(o.m_label), m_firing(0), m_connectedSignals(o.m_connectedSignals) {};
39     ~Port() = default;
40
41 private:
42     friend class ::org_scilab_modules_scicos::Model;
43
44     const std::vector<ScicosID>& getConnectedSignals() const
45     {
46         return m_connectedSignals;
47     }
48
49     update_status_t setConnectedSignals(const std::vector<ScicosID>& connectedSignals)
50     {
51         if (this->m_connectedSignals == connectedSignals)
52         {
53             return NO_CHANGES;
54         }
55
56         this->m_connectedSignals = connectedSignals;
57         if (m_connectedSignals.empty())
58         {
59             m_connectedSignals = std::vector<ScicosID> (1, 0);
60         }
61         return SUCCESS;
62     }
63
64     void getDataType(std::vector<int>& v) const
65     {
66         if (m_dataType == 0)
67         {
68             // By default, size is set to [-1,1] and type to real (1)
69             v.resize(3, 1);
70             v[0] = -1;
71         }
72         else
73         {
74             v.resize(3);
75             v[0] = m_dataType->m_rows;
76             v[1] = m_dataType->m_columns;
77             v[2] = m_dataType->m_datatype_id;
78         }
79     }
80
81     update_status_t setDataType(Model* model, const std::vector<int>& v)
82     {
83         if (v.size() != 3)
84         {
85             return FAIL;
86         }
87
88         model::Datatype datatype = model::Datatype(v);
89         if (this->m_dataType != 0 && *this->m_dataType == datatype)
90         {
91             return NO_CHANGES;
92         }
93
94         this->m_dataType = model->flyweight(datatype);
95         return SUCCESS;
96     }
97
98     void getKind(int& k) const
99     {
100         k = m_kind;
101     }
102
103     update_status_t setKind(int k)
104     {
105         if (k < PORT_UNDEF || k > PORT_EOUT)
106         {
107             return FAIL;
108         }
109
110         if (k == m_kind)
111         {
112             return NO_CHANGES;
113         }
114
115         m_kind = static_cast<portKind>(k);
116         return SUCCESS;
117     }
118
119     void getSourceBlock(ScicosID& sb) const
120     {
121         sb = m_sourceBlock;
122     }
123
124     update_status_t setSourceBlock(const ScicosID sb)
125     {
126         if (sb == this->m_sourceBlock)
127         {
128             return NO_CHANGES;
129         }
130         this->m_sourceBlock = sb;
131         return SUCCESS;
132     }
133
134     void getImplicit(bool& v) const
135     {
136         v = m_implicit;
137     }
138
139     update_status_t setImplicit(bool implicit)
140     {
141         if (implicit == this->m_implicit)
142         {
143             return NO_CHANGES;
144         }
145         this->m_implicit = implicit;
146         return SUCCESS;
147     }
148
149     void getStyle(std::string& s) const
150     {
151         s = m_style;
152     }
153
154     update_status_t setStyle(const std::string& style)
155     {
156         if (style == this->m_style)
157         {
158             return NO_CHANGES;
159         }
160         this->m_style = style;
161         return SUCCESS;
162     }
163
164     void getLabel(std::string& l) const
165     {
166         l = m_style;
167     }
168
169     update_status_t setLabel(const std::string& label)
170     {
171         if (label == this->m_label)
172         {
173             return NO_CHANGES;
174         }
175         this->m_label = label;
176         return SUCCESS;
177     }
178
179     void getFiring(double& f) const
180     {
181         f = m_firing;
182     }
183
184     update_status_t setFiring(double firing)
185     {
186         if (firing == this->m_firing)
187         {
188             return NO_CHANGES;
189         }
190         this->m_firing = firing;
191         return SUCCESS;
192     }
193
194 private:
195     Datatype* m_dataType;
196     ScicosID m_sourceBlock;
197     portKind m_kind;
198     bool m_implicit;
199     std::string m_style;
200     std::string m_label;
201     double m_firing;
202
203     std::vector<ScicosID> m_connectedSignals;
204 };
205
206 } /* namespace model */
207 } /* namespace org_scilab_modules_scicos */
208
209 #endif /* PORT_HXX_ */