UGDK  0.4.1
 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 #include <ugdk/util/uncopyable.h>
10 
11 #include <list>
12 #include <vector>
13 #include <map>
14 #include <string>
15 
16 #include <cstdio>
17 
18 namespace ugdk {
19 namespace script {
20 
21 class VirtualObj;
22 class Bind;
23 class TempList;
24 
26 
31 class VirtualObj {
32 
33  public:
34 
35  typedef std::pair<VirtualObj,VirtualObj> VirtualEntry;
36  typedef std::list<VirtualObj> List;
37  typedef std::vector<VirtualObj> Vector;
38  typedef std::map<VirtualObj,VirtualObj> Map;
39 
41 
44  explicit VirtualObj() :
45  data_() {}
46 
47  explicit VirtualObj(VirtualData::Ptr data) :
48  data_(data) {}
49 
51  data_(wrapper->NewData()) {}
52 
54 
55  template <class T>
56  T value(bool disown = false) const {
57  return VirtualPrimitive<T>::value(data_, disown);
58  }
59 
60  template <class T>
61  void set_value(T val) {
63  }
64 
65  template <class T>
66  VirtualObj& operator=(T* obj) {
67  data_->Wrap(
68  static_cast<void*>(obj),
70  );
71  return *this;
72  }
73 
74  LangWrapper* wrapper() const { return data_->wrapper(); }
75 
76  bool valid() const { return static_cast<bool>(data_); }
77 
78  operator bool() const { return valid(); }
79 
80  bool operator<(const VirtualObj& rhs) const {
81  return data_.get() < rhs.data_.get();
82  }
83 
84  VirtualObj operator() (const List& args = List()) const;
85 
86  VirtualObj attribute(const VirtualObj& key) const {
87  return VirtualObj(data_->GetAttribute(key.data_));
88  }
89 
90  VirtualObj operator[] (const VirtualObj& key) const {
91  return attribute(key);
92  }
93  VirtualObj operator[] (const char* key) const {
94  return attribute(Create(key, wrapper()));
95  }
96  VirtualObj operator[] (const std::string& key) const {
97  return (*this)[key.c_str()];
98  }
99 
101  return VirtualObj(
102  data_->SetAttribute(key.data_, value.data_)
103  );
104  }
105 
106  TempList operator,(const VirtualObj& rhs) const;
107 
108  List& operator,(List& rhs) const {
109  rhs.push_front(*this);
110  return rhs;
111  }
112 
113  Bind operator|(const std::string& method_name);
114 
115  VirtualObj operator<<(const List& entry) {
116  List::const_iterator it = entry.begin();
117  return set_attribute(*(it), *(++it));
118  }
119 
120  template <class T>
121  static VirtualObj Create (T* obj, LangWrapper* wrapper) {
122  if (!wrapper) return VirtualObj();
123  VirtualData::Ptr new_data = wrapper->NewData();
124  new_data->Wrap(
125  static_cast<void*>(obj),
127  );
128  return VirtualObj(new_data);
129  }
130 
131  static VirtualObj Create (const char* obj, LangWrapper* wrapper);
132 
133  static VirtualObj Create (const std::string& str, LangWrapper* wrapper) {
134  return Create(str.c_str(), wrapper);
135  }
136 
137  void* unsafe_data() const {
138  return data_->unsafe_data();
139  }
140 
141  private:
142 
143  VirtualData::Ptr data_;
144 
145 };
146 
147 template <class T, class U>
148 T ConvertSequence (const U& data_seq) {
149  T obj_seq;
150  typename U::const_iterator it;
151  for (it = data_seq.begin(); it != data_seq.end(); ++it)
152  obj_seq.push_back(VirtualObj(*it));
153  return obj_seq;
154 }
155 
156 /*static bool VObjLess (const VirtualObj& lhs, const VirtualObj& rhs) {
157  return lhs<rhs;
158 }*/
159 
160 template <class T, class U>
161 T ConvertTable (const U& data_map) {
162  T obj_map;
163  typename U::const_iterator it;
164  for (it = data_map.begin(); it != data_map.end(); ++it) {
165  obj_map.insert(std::pair<VirtualObj, VirtualObj>(
166  VirtualObj(it->first),
167  VirtualObj(it->second)));
168  }
169  return obj_map;
170 }
171 
172 template <>
173 inline VirtualObj::List VirtualObj::value<VirtualObj::List>(bool disown) const {
174  return ConvertSequence<List>(data_->UnwrapList());
175 }
176 
177 template <>
178 inline VirtualObj::Vector VirtualObj::value<VirtualObj::Vector>(bool disown) const {
179  return ConvertSequence<Vector>(data_->UnwrapVector());
180 }
181 
182 template <>
183 inline VirtualObj::Map VirtualObj::value<VirtualObj::Map>(bool disown) const {
184  return ConvertTable<Map>(data_->UnwrapMap());
185 }
186 
187 class Bind {
188  public:
189  Bind(VirtualObj& obj, const std::string& method_name) :
190  obj_(obj),
191  method_name_(obj.wrapper()) {
192  method_name_.set_value(method_name.c_str());
193  }
195  std::list<VirtualObj> args;
196  return obj_[method_name_]((obj_, args));
197  }
198  VirtualObj operator() (std::list<VirtualObj>& args) const {
199  return obj_[method_name_]((obj_, args));
200  }
201  private:
202  Bind& operator=(Bind&); // Bind cannot be copied.
203 
204  VirtualObj& obj_;
205  VirtualObj method_name_;
206 };
207 
208 class TempList {
209  public:
210  operator VirtualObj::List&() { return l_; }
212  l_.push_back(rhs);
213  return *this;
214  }
215  private:
216  friend class VirtualObj;
217  TempList(const VirtualObj& first, const VirtualObj& second) :
218  l_() {
219  l_.push_back(first);
220  l_.push_back(second);
221  }
222  VirtualObj::List l_;
223 };
224 
225 inline TempList VirtualObj::operator,(const VirtualObj& rhs) const {
226  return TempList(*this, rhs);
227 }
228 
229 inline Bind VirtualObj::operator|(const std::string& method_name) {
230  Bind result(*this, method_name);
231  return result;
232 }
233 
234 } /* namespace script */
235 } /* namespace ugdk */
236 
237 #endif /* UGDK_SCRIPT_VIRTUALOBJ_H_ */