Merge remote-tracking branch 'origin/master' into windows
[scilab.git] / scilab / modules / scicos / includes / Model.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 MODEL_HXX_
17 #define MODEL_HXX_
18
19 #include <vector>
20 #include <unordered_map>
21 #include <string>
22
23 #include "utilities.hxx"
24 #include "model/BaseObject.hxx"
25
26 #include "dynlib_scicos.h"
27
28 namespace org_scilab_modules_scicos
29 {
30
31 class SCICOS_IMPEXP Model
32 {
33 public:
34     Model();
35     ~Model();
36
37     /*
38      * Controller wrapped methods
39      */
40
41     ScicosID createObject(kind_t k);
42     unsigned referenceObject(const ScicosID uid);
43     unsigned& referenceCount(ScicosID uid);
44     void deleteObject(ScicosID uid);
45
46     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double& v) const;
47     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int& v) const;
48     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool& v) const;
49     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::string& v) const;
50     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID& v) const;
51     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<double>& v) const;
52     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<int>& v) const;
53     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<bool>& v) const;
54     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector< std::string >& v) const;
55     bool getObjectProperty(ScicosID uid, kind_t k, object_properties_t p, std::vector<ScicosID>& v) const;
56
57     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, double v);
58     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, int v);
59     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, bool v);
60     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, ScicosID v);
61     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::string& v);
62     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<double>& v);
63     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<int>& v);
64     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<bool>& v);
65     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector< std::string >& v);
66     update_status_t setObjectProperty(ScicosID uid, kind_t k, object_properties_t p, const std::vector<ScicosID>& v);
67
68     /*
69      * Model custom methods
70      */
71
72     kind_t getKind(ScicosID uid) const;
73     std::vector<ScicosID> getAll(kind_t k) const;
74     model::BaseObject* getObject(ScicosID uid) const;
75     template<typename T>
76     T* getObject(ScicosID uid) const
77     {
78         return static_cast<T*>(getObject(uid));
79     };
80
81     model::Datatype* flyweight(const model::Datatype& d);
82     void erase(model::Datatype* d);
83
84 private:
85     ScicosID lastId;
86     bool has_looped;
87
88     struct ModelObject
89     {
90         ModelObject(model::BaseObject* o) : m_o(o), m_refCounter(0) {}
91
92         model::BaseObject* m_o;
93         unsigned m_refCounter;
94     };
95
96     typedef std::unordered_map<ScicosID, ModelObject > objects_map_t;
97     objects_map_t allObjects;
98
99     typedef std::vector<model::Datatype*> datatypes_set_t;
100     datatypes_set_t datatypes;
101 };
102
103 } /* namespace org_scilab_modules_scicos */
104
105 #endif /* MODEL_HXX_ */