Xcos MVC: standardize C++ code
[scilab.git] / scilab / modules / scicos / includes / model / BaseObject.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 BASEOBJECT_HXX_
14 #define BASEOBJECT_HXX_
15
16 #include <vector>
17
18 #include "utilities.hxx"
19
20 namespace org_scilab_modules_scicos
21 {
22 namespace model
23 {
24
25 class BaseObject
26 {
27 public:
28     BaseObject(kind_t k) :
29         m_id(0), m_kind(k)
30     {
31     }
32     BaseObject(const BaseObject& b) :
33         m_id(0), m_kind(b.m_kind)
34     {
35     }
36
37     inline bool operator<(BaseObject o) const
38     {
39         return m_id < o.m_id;
40     }
41     inline bool operator==(BaseObject o) const
42     {
43         return m_id == o.m_id;
44     }
45
46     inline ScicosID id() const
47     {
48         return m_id;
49     }
50     inline void id(ScicosID _id)
51     {
52         m_id = _id;
53     }
54
55     inline kind_t kind() const
56     {
57         return m_kind;
58     }
59
60 private:
61     /**
62      * An id is used as a reference to the current object
63      */
64     ScicosID m_id;
65
66     /**
67      * Kind of the Object
68      */
69     const kind_t m_kind;
70 };
71
72 /** @defgroup utilities Shared utility classes
73  * @{
74  */
75
76 /*
77  * Represent a graphical object
78  */
79 struct Geometry
80 {
81     double m_x;
82     double m_y;
83     double m_width;
84     double m_height;
85
86     Geometry() : m_x(0), m_y(0), m_width(20), m_height(20) {};
87     Geometry(const Geometry& g) : m_x(g.m_x), m_y(g.m_y), m_width(g.m_width), m_height(g.m_height) {};
88     Geometry(const std::vector<double>& v) : m_x(v[0]), m_y(v[1]), m_width(v[2]), m_height(v[3]) {};
89
90     void fill(std::vector<double>& v) const
91     {
92         v.resize(4);
93         v[0] = m_x;
94         v[1] = m_y;
95         v[2] = m_width;
96         v[3] = m_height;
97     }
98     bool operator==(const Geometry& g) const
99     {
100         return m_x == g.m_x && m_y == g.m_y && m_width == g.m_width && m_height == g.m_height;
101     }
102 };
103
104 /**
105  * Per port type descriptor
106  *
107  * FIXME: should reuse Scilab datatypes descriptors
108  */
109 struct Datatype
110 {
111 public:
112     Datatype(const Datatype& d) :
113         m_refCount(0), m_datatype_id(d.m_datatype_id), m_rows(d.m_rows), m_columns(d.m_columns) {};
114     Datatype(const std::vector<int>& v) :
115         m_refCount(0), m_datatype_id(v[2]), m_rows(v[0]), m_columns(v[1]) {};
116
117     // reference counter for the flyweight pattern
118     int m_refCount;
119
120     const int m_datatype_id;
121     const int m_rows;
122     const int m_columns;
123
124     bool operator==(const Datatype& d) const
125     {
126         return m_datatype_id == d.m_datatype_id && m_rows == d.m_rows && m_columns == d.m_columns;
127     }
128
129     bool operator<(const Datatype& d) const
130     {
131         // Lexicographical order
132         return m_datatype_id < d.m_datatype_id ||
133                (m_datatype_id == d.m_datatype_id && m_rows < d.m_rows) ||
134                (m_datatype_id == d.m_datatype_id && m_rows == d.m_rows && m_columns < d.m_columns);
135     }
136 };
137
138 /** @}*/
139
140 } /* namespace model */
141 } /* namespace org_scilab_modules_scicos */
142
143 #endif /* BASEOBJECT_HXX_ */