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