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