UGDK  0.5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
virtualobj.h
Go to the documentation of this file.
1 
2 #ifndef UGDK_SCRIPT_VIRTUALOBJ_H_
3 #define UGDK_SCRIPT_VIRTUALOBJ_H_
4 
6 #include <ugdk/script/type.h>
9 
10 #include <list>
11 #include <vector>
12 #include <map>
13 #include <string>
14 #include <type_traits>
15 
16 #include <cstdio>
17 
18 namespace ugdk {
19 namespace script {
20 
21 class VirtualObj;
22 class Bind;
23 
25 
30 class VirtualObj {
31  public:
32  typedef std::list<VirtualObj> List;
33  typedef std::vector<VirtualObj> Vector;
34  typedef std::map<VirtualObj,VirtualObj> Map;
35 
37 
40  explicit VirtualObj() : data_() {}
41 
42  explicit VirtualObj(VirtualData::Ptr data) : data_(data) {}
43 
44  explicit VirtualObj(LangWrapper* wrapper) : data_(wrapper->NewData()) {}
45 
47 
48  static VirtualObj Create(const char* obj, LangWrapper* wrapper) {
49  if (!wrapper) return VirtualObj();
50  VirtualObj result(wrapper);
51  result.data_->WrapString(obj);
52  return result;
53  }
54 
55  static VirtualObj Create (const std::string& str, LangWrapper* wrapper) {
56  return Create(str.c_str(), wrapper);
57  }
58 
60 
61  LangWrapper* wrapper() const { return data_->wrapper(); }
62  void* unsafe_data() const { return data_->unsafe_data(); }
63 
64  template <class T>
65  T value(bool disown = false) const {
66  return VirtualPrimitive<T>::value(data_, disown);
67  }
68 
69  template <class T>
70  void set_value(T val, bool disown = false) {
71  VirtualPrimitive<T>::set_value(data_, val, disown);
72  }
73 
74  bool valid() const { return static_cast<bool>(data_); }
75 
76  VirtualObj attribute(const VirtualObj& key) const {
77  return VirtualObj(data_->GetAttribute(key.data_));
78  }
79 
81  return VirtualObj(
82  data_->SetAttribute(key.data_, value.data_)
83  );
84  }
85 
86  template<typename signature>
87  std::function<signature> AsFunction() const {
88  return function_helper<signature>::CreateFunction(*this);
89  }
90 
91  template<typename ...Args>
92  VirtualObj Call(Args... args) const {
93  VirtualData::Vector arguments;
94  arguments.reserve(sizeof...(Args));
95  arguments_helper<Args...>::add_to_vector(arguments, this->wrapper(), args...);
96  return VirtualObj(data_->Execute(arguments));
97  }
98 
99  VirtualObj Call(const List& vobj_list) const {
100  VirtualData::Vector data_vector;
101  data_vector.reserve(vobj_list.size());
102  for (const auto& vobj : vobj_list)
103  data_vector.push_back(vobj.data_);
104  return VirtualObj(data_->Execute(data_vector));
105  }
106 
107  // Operators
108 
109  operator bool() const { return valid(); }
110 
111  bool operator<(const VirtualObj& rhs) const {
112  return data_.get() < rhs.data_.get();
113  }
114  template<typename ...Args>
115  VirtualObj operator() (Args... args) const {
116  return Call<Args...>(args...);
117  }
118  VirtualObj operator[] (const VirtualObj& key) const {
119  return attribute(key);
120  }
121  VirtualObj operator[] (const char* key) const {
122  return attribute(Create(key, wrapper()));
123  }
124  VirtualObj operator[] (const std::string& key) const {
125  return attribute(Create(key, wrapper()));
126  }
127  Bind operator|(const std::string& method_name);
128 
129  private:
130  template<typename ...Args>
131  struct arguments_helper;
132 
133  template<typename T, typename ...Args>
134  struct arguments_helper<T, Args...> {
135  static bool add_to_vector(VirtualData::Vector& v, LangWrapper* wrapper, T t, Args... args) {
136  VirtualObj vobj(wrapper);
137  vobj.set_value<T>(t);
138  v.emplace_back(vobj.data_);
139  return arguments_helper<Args...>::add_to_vector(v, wrapper, args...);
140  }
141  };
142 
143  template<typename ...Args>
144  struct arguments_helper<VirtualObj, Args...> {
145  static bool add_to_vector(VirtualData::Vector& v, LangWrapper* wrapper, VirtualObj t, Args... args) {
146  if(!t || t.wrapper() != wrapper) return false;
147  v.emplace_back(t.data_);
148  return arguments_helper<Args...>::add_to_vector(v, wrapper, args...);
149  }
150  };
151 
152  template<typename signature, typename Helper = void>
153  struct function_helper;
154 
155  template<typename R, typename ...Args>
156  struct function_helper<R(Args...), typename std::enable_if<is_virtual_primitive<R>::value>::type> {
157  static std::function< R(Args...)> CreateFunction(const VirtualObj& data) {
158  return [data](Args... args) -> R {
159  VirtualObj result = data.Call<Args...>(args...);
160  return result.value<R>(false);
161  };
162  }
163  };
164 
165  template<typename R, typename ...Args>
166  struct function_helper<R(Args...), typename std::enable_if<!is_virtual_primitive<R>::value>::type> {
167  static std::function< R(Args...)> CreateFunction(const VirtualObj& data) {
168  return [data](Args... args) -> R {
169  VirtualObj result = data.Call<Args...>(args...);
170  return result.value<R*>(false);
171  };
172  }
173  };
174 
175  template<typename ...Args>
176  struct function_helper<void(Args...), void> {
177  static std::function<void (Args...)> CreateFunction(const VirtualObj& data) {
178  return [data](Args... args) {
179  data.Call<Args...>(args...);
180  };
181  }
182  };
183 
184  VirtualData::Ptr data_;
185 };
186 
187 template<>
188 struct VirtualObj::arguments_helper<> {
190  return true;
191  }
192 };
193 
194 
195 template <class T, class U>
196 T ConvertSequence (const U& data_seq) {
197  T obj_seq;
198  typename U::const_iterator it;
199  for (it = data_seq.begin(); it != data_seq.end(); ++it)
200  obj_seq.push_back(VirtualObj(*it));
201  return obj_seq;
202 }
203 
204 template <class T, class U>
205 T ConvertTable (const U& data_map) {
206  T obj_map;
207  typename U::const_iterator it;
208  for (it = data_map.begin(); it != data_map.end(); ++it) {
209  obj_map.insert(std::pair<VirtualObj, VirtualObj>(
210  VirtualObj(it->first),
211  VirtualObj(it->second)));
212  }
213  return obj_map;
214 }
215 
216 template <>
217 inline VirtualObj::List VirtualObj::value<VirtualObj::List>(bool /*disown*/) const {
218  return ConvertSequence<List>(data_->UnwrapList());
219 }
220 
221 template <>
222 inline VirtualObj::Vector VirtualObj::value<VirtualObj::Vector>(bool /*disown*/) const {
223  return ConvertSequence<Vector>(data_->UnwrapVector());
224 }
225 
226 template <>
227 inline VirtualObj::Map VirtualObj::value<VirtualObj::Map>(bool /*disown*/) const {
228  return ConvertTable<Map>(data_->UnwrapMap());
229 }
230 
231 class Bind {
232  public:
233  Bind(VirtualObj& obj, const std::string& method_name);
234 
235  template<typename ...Args>
236  VirtualObj operator() (Args... args) const {
237  VirtualObj method = obj_[method_name_];
238  auto callf = std::mem_fn(&VirtualObj::Call<VirtualObj, Args...>);
239  return callf(method, obj_, args...);
240  }
241 
242  private:
243  Bind& operator=(Bind&); // Bind cannot be copied.
244 
245  VirtualObj& obj_;
246  VirtualObj method_name_;
247 };
248 
249 inline Bind VirtualObj::operator|(const std::string& method_name) {
250  Bind result(*this, method_name);
251  return result;
252 }
253 
254 } /* namespace script */
255 } /* namespace ugdk */
256 
257 #endif /* UGDK_SCRIPT_VIRTUALOBJ_H_ */
VirtualObj operator()(Args...args) const
Definition: virtualobj.h:236
VirtualObj operator[](const VirtualObj &key) const
Definition: virtualobj.h:118
VirtualObj(VirtualData::Ptr data)
Definition: virtualobj.h:42
VirtualObj(LangWrapper *wrapper)
Definition: virtualobj.h:44
void * unsafe_data() const
Definition: virtualobj.h:62
void set_value(T val, bool disown=false)
Definition: virtualobj.h:70
STL namespace.
static bool add_to_vector(VirtualData::Vector &v, LangWrapper *wrapper)
Definition: virtualobj.h:189
Definition: animation.h:11
static VirtualObj Create(const char *obj, LangWrapper *wrapper)
Definition: virtualobj.h:48
std::shared_ptr< VirtualData > Ptr
Definition: virtualdata.h:46
VirtualObj set_attribute(const VirtualObj &key, const VirtualObj &value)
Definition: virtualobj.h:80
Bind(VirtualObj &obj, const std::string &method_name)
~VirtualObj()
Definition: virtualobj.h:46
LangWrapper * wrapper() const
Acessing.
Definition: virtualobj.h:61
T ConvertSequence(const U &data_seq)
Definition: virtualobj.h:196
bool valid() const
Definition: virtualobj.h:74
Definition: virtualprimitive.h:26
static VirtualObj Create(const std::string &str, LangWrapper *wrapper)
Definition: virtualobj.h:55
Bind operator|(const std::string &method_name)
Definition: virtualobj.h:249
Definition: virtualobj.h:231
std::map< VirtualObj, VirtualObj > Map
Definition: virtualobj.h:34
std::list< VirtualObj > List
Definition: virtualobj.h:32
std::vector< VirtualObj > Vector
Definition: virtualobj.h:33
Definition: langwrapper.h:17
VirtualObj attribute(const VirtualObj &key) const
Definition: virtualobj.h:76
VirtualObj Call(Args...args) const
Definition: virtualobj.h:92
T value(bool disown=false) const
Definition: virtualobj.h:65
A proxy class wich represents virtual objects from scripting languages.
Definition: virtualobj.h:30
std::vector< Ptr > Vector
Definition: virtualdata.h:49
T ConvertTable(const U &data_map)
Definition: virtualobj.h:205
VirtualObj()
Builds an empty virtual object.
Definition: virtualobj.h:40
VirtualObj Call(const List &vobj_list) const
Definition: virtualobj.h:99
VirtualObj operator()(Args...args) const
Definition: virtualobj.h:115
std::function< signature > AsFunction() const
Definition: virtualobj.h:87
bool operator<(const VirtualObj &rhs) const
Definition: virtualobj.h:111