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