fad0473144b30ea65621651bd5869a12913230f8
[scilab.git] / scilab / modules / scicos / src / cpp / view_scilab / BaseAdapter.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-en.txt
10  *
11  */
12
13 #ifndef BASEADAPTER_HXX_
14 #define BASEADAPTER_HXX_
15
16 #include <algorithm>
17 #include <string>
18 #include <utility>
19 #include <iostream>
20
21 #include "types.hxx"
22 #include "user.hxx"
23
24 #include "Controller.hxx"
25 #include "Adapters.hxx"
26 #include "model/BaseObject.hxx"
27
28 namespace org_scilab_modules_scicos
29 {
30 namespace view_scilab
31 {
32
33 /**
34  * A property used as a getter/setter for a specific name
35  */
36 template<typename Adaptor>
37 struct property
38 {
39 public:
40     typedef types::InternalType* (*getter_t)(const Adaptor& adaptor);
41     typedef bool (*setter_t)(Adaptor& adaptor, types::InternalType* v);
42
43     typedef std::vector< property<Adaptor> > props_t;
44     typedef typename props_t::iterator props_t_it;
45
46
47     property(const std::wstring& prop, getter_t g, setter_t s) : name(prop), get(g), set(s) {};
48     ~property() {};
49
50     std::wstring name;
51     getter_t get;
52     setter_t set;
53
54     bool operator< (const std::wstring& v) const
55     {
56         return name < v;
57     }
58
59     /*
60      * Static properties accessors
61      */
62     static props_t fields;
63
64     /**
65      * @return true if the properties has already been setup, false otherwise.
66      */
67     static bool properties_has_not_been_set()
68     {
69         return fields.empty();
70     }
71
72     /**
73      * Add a property to an Adaptor
74      */
75     static void add_property(const std::wstring& name, getter_t g, setter_t s)
76     {
77         property<Adaptor>::props_t_it pos = std::lower_bound(fields.begin(), fields.end(), name);
78         fields.insert(pos, property(name, g, s));
79     }
80 };
81
82
83 /**
84  * Base definition of the adapter pattern, implement the get / set dispatch.
85  *
86  * Note that sub-classes are responsible to fill the fields accordingly to theirs interfaces.
87  */
88 template<typename Adaptor, typename Adaptee>
89 class BaseAdapter : public types::User<Adaptor>
90 {
91
92 public:
93     BaseAdapter(Adaptee* o) : adaptee(o) {};
94     BaseAdapter(const BaseAdapter& o) : adaptee(o.adaptee) {};
95     virtual ~BaseAdapter() {};
96
97     /*
98      * property accessors
99      */
100
101     bool hasProperty(const std::wstring& _sKey) const
102     {
103         typename property<Adaptor>::props_t_it found = std::binary_search(property<Adaptor>::fields.begin(), property<Adaptor>::fields.end(), _sKey);
104         return found != property<Adaptor>::fields.end();
105     }
106
107     types::InternalType* getProperty(const std::wstring& _sKey) const
108     {
109         typename property<Adaptor>::props_t_it found = std::lower_bound(property<Adaptor>::fields.begin(), property<Adaptor>::fields.end(), _sKey);
110         if (found != property<Adaptor>::fields.end())
111         {
112             return found->get(static_cast<Adaptor*>(this));
113         }
114         return 0;
115     }
116
117     bool setProperty(const std::wstring& _sKey, types::InternalType* v)
118     {
119         typename property<Adaptor>::props_t_it found = std::lower_bound(property<Adaptor>::fields.begin(), property<Adaptor>::fields.end(), _sKey);
120         if (found != property<Adaptor>::fields.end())
121         {
122             return found->set(*static_cast<Adaptor*>(this), v);
123         }
124         return false;
125     }
126
127     /**
128      * @return the Adaptee instance
129      */
130     Adaptee* getAdaptee() const
131     {
132         return adaptee;
133     };
134
135     /**
136      * set the adaptee
137      */
138     void setAdaptee(Adaptee* adaptee)
139     {
140         this->adaptee = adaptee;
141     }
142
143     /*
144      * All following methods should be implemented by each template instance
145      */
146
147     virtual bool toString(std::wostringstream& ostr) = 0;
148     virtual std::wstring getTypeStr() = 0;
149     virtual std::wstring getShortTypeStr() = 0;
150
151 private:
152     Adaptee* adaptee;
153 };
154
155
156 } /* view_scilab */
157 } /* namespace org_scilab_modules_scicos */
158
159 #endif /* BASEADAPTER_HXX_ */